{"version":3,"file":"bitmovinanalytics.min.js","mappings":"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","sources":["webpack://bitmovin.analytics/webpack/universalModuleDefinition","webpack://bitmovin.analytics/./node_modules/javascript-state-machine/state-machine.js","webpack://bitmovin.analytics/./src/Version.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/AmazonIVSAdapter.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/AmazonIVSInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/playback/ErrorService.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/playback/PauseEventDispatcher.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/playback/PlaybackService.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/playback/VideoStartupService.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/player/AmazonIVSPlayerContext.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/player/AmazonIVSPlayerEventHandler.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/player/AmazonIVSPlayerEventListener.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/player/SourceUrlProvider.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/utils/CollectorEventBus.ts","webpack://bitmovin.analytics/./src/adapters/amazonIVS/window/WindowEventListener.ts","webpack://bitmovin.analytics/./src/adapters/bitmovin8/Bitmovin8AdModule.ts","webpack://bitmovin.analytics/./src/adapters/bitmovin8/Bitmovin8Adapter.ts","webpack://bitmovin.analytics/./src/adapters/bitmovin8/Bitmovin8InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/bitmovin8/bitmovin8AdapterSsaiApiSanitizeUtils.ts","webpack://bitmovin.analytics/./src/adapters/bitmovin8/player/HttpRequestTrackingAdapter.ts","webpack://bitmovin.analytics/./src/adapters/bitmovin8/player/SegmentTrackerAdapter.ts","webpack://bitmovin.analytics/./src/adapters/bitmovin8/player/SpeedMeterAdapter.ts","webpack://bitmovin.analytics/./src/adapters/bitmovinPwx/BitmovinPwxAdapter.ts","webpack://bitmovin.analytics/./src/adapters/bitmovinPwx/BitmovinPwxAnalyticsPackage.ts","webpack://bitmovin.analytics/./src/adapters/bitmovinPwx/BitmovinPwxAnalyticsStateMachine.ts","webpack://bitmovin.analytics/./src/adapters/bitmovinPwx/BitmovinPwxInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/bitmovinPwx/ExportNames.ts","webpack://bitmovin.analytics/./src/adapters/cafv3/CAFv3Adapter.ts","webpack://bitmovin.analytics/./src/adapters/cafv3/CAFv3InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/dashjs/DashjsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/dashjs/DashjsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/hlsjs/HlsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/hlsjs/HlsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/hlsjs/player/HlsSpeedMeterAdapter.ts","webpack://bitmovin.analytics/./src/adapters/html5/HTML5InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/html5/HTMLVideoElementAdapter.ts","webpack://bitmovin.analytics/./src/adapters/html5/HTMLVideoElementInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/html5/player/HTMLVideoElementStatisticsProvider.ts","webpack://bitmovin.analytics/./src/adapters/internal/InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/ads/AdModuleAPI.ts","webpack://bitmovin.analytics/./src/adapters/shaka/ShakaAdapter.ts","webpack://bitmovin.analytics/./src/adapters/shaka/ShakaInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/shaka/shakaPlayerTypes.ts","webpack://bitmovin.analytics/./src/adapters/videojs/VideoJsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/videojs/VideojsInternalAdapter.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/HTML5AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/VideoJsAnalyticsStateMachine.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/amazonivs/AmazonIVSStateMachine.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/bitmovin8/Bitmovin8AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/stateMachineUtils.ts","webpack://bitmovin.analytics/./src/api/adapterApiUtils.ts","webpack://bitmovin.analytics/./src/core/AdAnalytics.ts","webpack://bitmovin.analytics/./src/core/Analytics.ts","webpack://bitmovin.analytics/./src/core/BackendFactory.ts","webpack://bitmovin.analytics/./src/core/DebuggingBackend.ts","webpack://bitmovin.analytics/./src/core/DownloadSpeedMeter.ts","webpack://bitmovin.analytics/./src/core/EventDispatcher.ts","webpack://bitmovin.analytics/./src/core/HeartbeatService.ts","webpack://bitmovin.analytics/./src/core/LicenseCheckingBackend.ts","webpack://bitmovin.analytics/./src/core/LongPlaytimeFilteringBackend.ts","webpack://bitmovin.analytics/./src/core/Measure.ts","webpack://bitmovin.analytics/./src/core/NoOpBackend.ts","webpack://bitmovin.analytics/./src/core/QualityChangeService.ts","webpack://bitmovin.analytics/./src/core/QueueBackend.ts","webpack://bitmovin.analytics/./src/core/RemoteBackend.ts","webpack://bitmovin.analytics/./src/core/SegmentTracker.ts","webpack://bitmovin.analytics/./src/core/SequenceNumberBackend.ts","webpack://bitmovin.analytics/./src/core/SessionPersistenceHandler.ts","webpack://bitmovin.analytics/./src/core/SourceInfoFallbackService.ts","webpack://bitmovin.analytics/./src/core/VideoCompletionTracker.ts","webpack://bitmovin.analytics/./src/core/ssai/SsaiService.ts","webpack://bitmovin.analytics/./src/core/ssai/ssaiEngagementInteractionData.ts","webpack://bitmovin.analytics/./src/core/ssai/ssaiUtils.ts","webpack://bitmovin.analytics/./src/enums/AdType.ts","webpack://bitmovin.analytics/./src/enums/CDNProvider.ts","webpack://bitmovin.analytics/./src/enums/CastTech.ts","webpack://bitmovin.analytics/./src/enums/Codecs.ts","webpack://bitmovin.analytics/./src/enums/ErrorCode.ts","webpack://bitmovin.analytics/./src/enums/Event.ts","webpack://bitmovin.analytics/./src/enums/MIMETypes.ts","webpack://bitmovin.analytics/./src/enums/PageLoadType.ts","webpack://bitmovin.analytics/./src/enums/Player.ts","webpack://bitmovin.analytics/./src/enums/PlayerSize.ts","webpack://bitmovin.analytics/./src/enums/StreamTypes.ts","webpack://bitmovin.analytics/./src/enums/VideoStartFailedReason.ts","webpack://bitmovin.analytics/./src/features/Feature.ts","webpack://bitmovin.analytics/./src/features/FeatureManager.ts","webpack://bitmovin.analytics/./src/features/errordetails/ErrorDetailBackend.ts","webpack://bitmovin.analytics/./src/features/errordetails/ErrorDetailTracking.ts","webpack://bitmovin.analytics/./src/features/httprequesttracking/HttpRequestTracking.ts","webpack://bitmovin.analytics/./src/features/httprequesttracking/HttpRequestType.ts","webpack://bitmovin.analytics/./src/playerModule.ts","webpack://bitmovin.analytics/./src/types/AdAnalyticsSample.ts","webpack://bitmovin.analytics/./src/types/AdBreakSample.ts","webpack://bitmovin.analytics/./src/types/AdSample.ts","webpack://bitmovin.analytics/./src/types/AnalyticsConfig.ts","webpack://bitmovin.analytics/./src/types/CustomDataValues.ts","webpack://bitmovin.analytics/./src/types/LicensingRequest.ts","webpack://bitmovin.analytics/./src/types/PlaybackInfo.ts","webpack://bitmovin.analytics/./src/types/StateMachineCallbacks.ts","webpack://bitmovin.analytics/./src/types/SubtitleInfo.ts","webpack://bitmovin.analytics/./src/utils/AnalyticsCall.ts","webpack://bitmovin.analytics/./src/utils/BitmovinProgressiveSourceHelper.ts","webpack://bitmovin.analytics/./src/utils/CodecHelper.ts","webpack://bitmovin.analytics/./src/utils/Converter.ts","webpack://bitmovin.analytics/./src/utils/EventDebugging.ts","webpack://bitmovin.analytics/./src/utils/Http.ts","webpack://bitmovin.analytics/./src/utils/LicenseCall.ts","webpack://bitmovin.analytics/./src/utils/Logger.ts","webpack://bitmovin.analytics/./src/utils/Queue.ts","webpack://bitmovin.analytics/./src/utils/Settings.ts","webpack://bitmovin.analytics/./src/utils/Utils.ts","webpack://bitmovin.analytics/./src/utils/ViewportTracker.ts","webpack://bitmovin.analytics/./src/utils/WindowEventTracker.ts","webpack://bitmovin.analytics/./src/utils/documentCookieUtils.ts","webpack://bitmovin.analytics/./src/utils/playerAugmentationUtils.ts","webpack://bitmovin.analytics/./src/utils/stringUtils.ts","webpack://bitmovin.analytics/webpack/bootstrap","webpack://bitmovin.analytics/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"bitmovin\"] = factory();\n\telse\n\t\troot[\"bitmovin\"] = root[\"bitmovin\"] || {}, root[\"bitmovin\"][\"analytics\"] = factory();\n})(self, function() {\nreturn ","/*\n\n Javascript State Machine Library - https://github.com/jakesgordon/javascript-state-machine\n\n Copyright (c) 2012, 2013, 2014, 2015, Jake Gordon and contributors\n Released under the MIT license - https://github.com/jakesgordon/javascript-state-machine/blob/master/LICENSE\n\n*/\n\n(function () {\n\n var StateMachine = {\n\n //---------------------------------------------------------------------------\n\n VERSION: \"2.4.0\",\n\n //---------------------------------------------------------------------------\n\n Result: {\n SUCCEEDED: 1, // the event transitioned successfully from one state to another\n NOTRANSITION: 2, // the event was successfull but no state transition was necessary\n CANCELLED: 3, // the event was cancelled by the caller in a beforeEvent callback\n PENDING: 4 // the event is asynchronous and the caller is in control of when the transition occurs\n },\n\n Error: {\n INVALID_TRANSITION: 100, // caller tried to fire an event that was innapropriate in the current state\n PENDING_TRANSITION: 200, // caller tried to fire an event while an async transition was still pending\n INVALID_CALLBACK: 300 // caller provided callback function threw an exception\n },\n\n WILDCARD: '*',\n ASYNC: 'async',\n\n //---------------------------------------------------------------------------\n\n create: function(cfg, target) {\n\n var initial = (typeof cfg.initial == 'string') ? { state: cfg.initial } : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false }\n var terminal = cfg.terminal || cfg['final'];\n var fsm = target || cfg.target || {};\n var events = cfg.events || [];\n var callbacks = cfg.callbacks || {};\n var map = {}; // track state transitions allowed for an event { event: { from: [ to ] } }\n var transitions = {}; // track events allowed from a state { state: [ event ] }\n\n var add = function(e) {\n var from = Array.isArray(e.from) ? e.from : (e.from ? [e.from] : [StateMachine.WILDCARD]); // allow 'wildcard' transition if 'from' is not specified\n map[e.name] = map[e.name] || {};\n for (var n = 0 ; n < from.length ; n++) {\n transitions[from[n]] = transitions[from[n]] || [];\n transitions[from[n]].push(e.name);\n\n map[e.name][from[n]] = e.to || from[n]; // allow no-op transition if 'to' is not specified\n }\n if (e.to)\n transitions[e.to] = transitions[e.to] || [];\n };\n\n if (initial) {\n initial.event = initial.event || 'startup';\n add({ name: initial.event, from: 'none', to: initial.state });\n }\n\n for(var n = 0 ; n < events.length ; n++)\n add(events[n]);\n\n for(var name in map) {\n if (map.hasOwnProperty(name))\n fsm[name] = StateMachine.buildEvent(name, map[name]);\n }\n\n for(var name in callbacks) {\n if (callbacks.hasOwnProperty(name))\n fsm[name] = callbacks[name]\n }\n\n fsm.current = 'none';\n fsm.is = function(state) { return Array.isArray(state) ? (state.indexOf(this.current) >= 0) : (this.current === state); };\n fsm.can = function(event) { return !this.transition && (map[event] !== undefined) && (map[event].hasOwnProperty(this.current) || map[event].hasOwnProperty(StateMachine.WILDCARD)); }\n fsm.cannot = function(event) { return !this.can(event); };\n fsm.transitions = function() { return (transitions[this.current] || []).concat(transitions[StateMachine.WILDCARD] || []); };\n fsm.isFinished = function() { return this.is(terminal); };\n fsm.error = cfg.error || function(name, from, to, args, error, msg, e) { throw e || msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3 and #17)\n fsm.states = function() { return Object.keys(transitions).sort() };\n\n if (initial && !initial.defer)\n fsm[initial.event]();\n\n return fsm;\n\n },\n\n //===========================================================================\n\n doCallback: function(fsm, func, name, from, to, args) {\n if (func) {\n try {\n return func.apply(fsm, [name, from, to].concat(args));\n }\n catch(e) {\n return fsm.error(name, from, to, args, StateMachine.Error.INVALID_CALLBACK, \"an exception occurred in a caller-provided callback function\", e);\n }\n }\n },\n\n beforeAnyEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbeforeevent'], name, from, to, args); },\n afterAnyEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafterevent'] || fsm['onevent'], name, from, to, args); },\n leaveAnyState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleavestate'], name, from, to, args); },\n enterAnyState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenterstate'] || fsm['onstate'], name, from, to, args); },\n changeState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onchangestate'], name, from, to, args); },\n\n beforeThisEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbefore' + name], name, from, to, args); },\n afterThisEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafter' + name] || fsm['on' + name], name, from, to, args); },\n leaveThisState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleave' + from], name, from, to, args); },\n enterThisState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenter' + to] || fsm['on' + to], name, from, to, args); },\n\n beforeEvent: function(fsm, name, from, to, args) {\n if ((false === StateMachine.beforeThisEvent(fsm, name, from, to, args)) ||\n (false === StateMachine.beforeAnyEvent( fsm, name, from, to, args)))\n return false;\n },\n\n afterEvent: function(fsm, name, from, to, args) {\n StateMachine.afterThisEvent(fsm, name, from, to, args);\n StateMachine.afterAnyEvent( fsm, name, from, to, args);\n },\n\n leaveState: function(fsm, name, from, to, args) {\n var specific = StateMachine.leaveThisState(fsm, name, from, to, args),\n general = StateMachine.leaveAnyState( fsm, name, from, to, args);\n if ((false === specific) || (false === general))\n return false;\n else if ((StateMachine.ASYNC === specific) || (StateMachine.ASYNC === general))\n return StateMachine.ASYNC;\n },\n\n enterState: function(fsm, name, from, to, args) {\n StateMachine.enterThisState(fsm, name, from, to, args);\n StateMachine.enterAnyState( fsm, name, from, to, args);\n },\n\n //===========================================================================\n\n buildEvent: function(name, map) {\n return function() {\n\n var from = this.current;\n var to = map[from] || (map[StateMachine.WILDCARD] != StateMachine.WILDCARD ? map[StateMachine.WILDCARD] : from) || from;\n var args = Array.prototype.slice.call(arguments); // turn arguments into pure array\n\n if (this.transition)\n return this.error(name, from, to, args, StateMachine.Error.PENDING_TRANSITION, \"event \" + name + \" inappropriate because previous transition did not complete\");\n\n if (this.cannot(name))\n return this.error(name, from, to, args, StateMachine.Error.INVALID_TRANSITION, \"event \" + name + \" inappropriate in current state \" + this.current);\n\n if (false === StateMachine.beforeEvent(this, name, from, to, args))\n return StateMachine.Result.CANCELLED;\n\n if (from === to) {\n StateMachine.afterEvent(this, name, from, to, args);\n return StateMachine.Result.NOTRANSITION;\n }\n\n // prepare a transition method for use EITHER lower down, or by caller if they want an async transition (indicated by an ASYNC return value from leaveState)\n var fsm = this;\n this.transition = function() {\n fsm.transition = null; // this method should only ever be called once\n fsm.current = to;\n StateMachine.enterState( fsm, name, from, to, args);\n StateMachine.changeState(fsm, name, from, to, args);\n StateMachine.afterEvent( fsm, name, from, to, args);\n return StateMachine.Result.SUCCEEDED;\n };\n this.transition.cancel = function() { // provide a way for caller to cancel async transition if desired (issue #22)\n fsm.transition = null;\n StateMachine.afterEvent(fsm, name, from, to, args);\n }\n\n var leave = StateMachine.leaveState(this, name, from, to, args);\n if (false === leave) {\n this.transition = null;\n return StateMachine.Result.CANCELLED;\n }\n else if (StateMachine.ASYNC === leave) {\n return StateMachine.Result.PENDING;\n }\n else {\n if (this.transition) // need to check in case user manually called transition() but forgot to return StateMachine.ASYNC\n return this.transition();\n }\n\n };\n }\n\n }; // StateMachine\n\n //===========================================================================\n\n //======\n // NODE\n //======\n if (typeof exports !== 'undefined') {\n if (typeof module !== 'undefined' && module.exports) {\n exports = module.exports = StateMachine;\n }\n exports.StateMachine = StateMachine;\n }\n //============\n // AMD/REQUIRE\n //============\n else if (typeof define === 'function' && define.amd) {\n define(function(require) { return StateMachine; });\n }\n //========\n // BROWSER\n //========\n else if (typeof window !== 'undefined') {\n window.StateMachine = StateMachine;\n }\n //===========\n // WEB WORKER\n //===========\n else if (typeof self !== 'undefined') {\n self.StateMachine = StateMachine;\n }\n\n}());\n","declare global {\n /** Variable is defined by webpack.DefinePlugin during the build process. */\n const __VERSION__: string;\n}\n\nexport const VERSION: string = __VERSION__;\n","import type {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {AmazonIVSInternalAdapter} from './AmazonIVSInternalAdapter';\nimport {SourceUrlProvider} from './player/SourceUrlProvider';\n\nexport class AmazonIVSAdapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n const sourceUrlProvider = new SourceUrlProvider();\n this.internalAdapter = new AmazonIVSInternalAdapter(player, sourceUrlProvider, opts);\n this.analytics = Analytics.create(config, this.internalAdapter);\n\n this.wrapPlayerLoad(player, sourceUrlProvider);\n }\n\n private wrapPlayerLoad(player: any, sourceUrlProvider: SourceUrlProvider) {\n const originalLoad = player.load;\n\n player.load = (...args: Parameters): ProgressEvent => {\n sourceUrlProvider.m3u8Url = args[0] as string;\n return originalLoad.apply(player, args);\n };\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.sourceChange(config);\n }\n}\n","import type {MediaPlayer} from 'amazon-ivs-player';\n\nimport {AmazonIVSStateMachine} from '../../analyticsStateMachines/amazonivs/AmazonIVSStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {HeartbeatService} from '../../core/HeartbeatService';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {StreamTypes} from '../../enums/StreamTypes';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {normalizeVideoDuration, PlaybackInfo} from '../../types/PlaybackInfo';\nimport * as Utils from '../../utils/Utils';\nimport HTMLVideoElementStatisticsProvider from '../html5/player/HTMLVideoElementStatisticsProvider';\nimport {AdModuleAPI} from '../internal/ads/AdModuleAPI';\nimport {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {AmazonIVSPlayerContext} from './player/AmazonIVSPlayerContext';\nimport {AmazonIVSPlayerEventListener} from './player/AmazonIVSPlayerEventListener';\nimport {SourceUrlProvider} from './player/SourceUrlProvider';\nimport CollectorEvents from './utils/CollectorEventBus';\nimport {WindowEventListener} from './window/WindowEventListener';\n\nexport class AmazonIVSInternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n private listener: AmazonIVSPlayerEventListener;\n private windowEventListener: WindowEventListener;\n private playerStatisticsProvider: HTMLVideoElementStatisticsProvider;\n\n constructor(\n private player: MediaPlayer,\n private sourceUrlProvider: SourceUrlProvider,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n const heartbeatService = new HeartbeatService(() => this.player.getPosition());\n const stateMachine = new AmazonIVSStateMachine(this.stateMachineCallbacks, heartbeatService, this.opts);\n heartbeatService.setListener(stateMachine);\n this.stateMachine = stateMachine;\n\n const playerContext = new AmazonIVSPlayerContext(player);\n this.listener = AmazonIVSPlayerEventListener.create(this, playerContext, this.qualityChangeService);\n\n this.playerStatisticsProvider = new HTMLVideoElementStatisticsProvider(player.getHTMLVideoElement());\n\n this.windowEventListener = new WindowEventListener(this.windowEventTracker, this, playerContext);\n }\n\n supportsDeferredLicenseLoading = false;\n adModule?: AdModuleAPI;\n videoCompletionTracker?: VideoCompletionTracker;\n\n initialize(_analytics: Analytics): Feature[] {\n this.listener.startMonitoring(this.player);\n this.windowEventListener.startMonitoring();\n CollectorEvents.RELEASE.subscribe(() => {\n this.release();\n });\n // we do not support any analytics features on IVS yet\n return [];\n }\n\n protected override get currentTime(): number {\n return this.player.getPosition();\n }\n\n override resetSourceRelatedState() {\n this.drmPerformanceInfo = undefined;\n this.playerStatisticsProvider.reset();\n }\n\n getPlayerVersion = () => this.player.getVersion();\n getPlayerName = () => Player.AMAZON_IVS;\n getPlayerTech = () => 'html5';\n getAutoPlay = () => this.player.isAutoplay();\n getDrmPerformanceInfo = () => undefined;\n getCurrentPlaybackInfo(): PlaybackInfo {\n const videoElement = this.player.getHTMLVideoElement();\n\n const info: PlaybackInfo = {\n droppedFrames: this.playerStatisticsProvider.getDroppedFrames(),\n isLive: this.player.getDuration() === Infinity,\n isMuted: this.player.isMuted(),\n playerTech: this.getPlayerTech(),\n videoWindowWidth: videoElement.clientWidth,\n videoWindowHeight: videoElement.clientHeight,\n videoPlaybackHeight: videoElement.videoHeight,\n videoPlaybackWidth: videoElement.videoWidth,\n videoBitrate: this.player.getQuality().bitrate,\n videoDuration: normalizeVideoDuration(this.player.getDuration()),\n size: Utils.isVideoInFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n ...this.getVideoAndAudioCodecs(),\n ...this.getCommonPlaybackInfo(),\n streamFormat: StreamTypes.hls,\n m3u8Url: this.sourceUrlProvider.m3u8Url,\n };\n return info;\n }\n\n sourceChange(_config: AnalyticsConfig) {\n throw new Error('Method not implemented.');\n }\n\n private getVideoAndAudioCodecs() {\n const codecs = this.player.getQuality().codecs.split(',');\n if (codecs.length == 2) {\n return {\n videoCodec: codecs[0],\n audioCodec: codecs[1],\n };\n }\n return {};\n }\n}\n","import type {PlayerError} from 'amazon-ivs-player';\n\nimport {Event} from '../../../enums/Event';\nimport {ErrorEvent} from '../../../types/EventData';\nimport {EventCallbackDispatcher} from '../../internal/EventCallbackDispatcher';\nimport {PlayerContext} from '../player/AmazonIVSPlayerContext';\n\nexport class ErrorService {\n constructor(\n private dispatcher: EventCallbackDispatcher,\n private playerContext: PlayerContext,\n ) {}\n onError(payload: PlayerError) {\n const errorEvent: ErrorEvent = {\n currentTime: this.playerContext.position,\n code: payload.code,\n message: payload.message,\n data: {\n exceptionMessage: payload.message,\n exceptionStacktrace: [payload.source],\n },\n };\n this.dispatcher.eventCallback(Event.ERROR, errorEvent);\n }\n}\n","import {Event} from '../../../enums/Event';\nimport {AnalyticsEventBase} from '../../../types/EventData';\nimport {EventCallbackDispatcher} from '../../internal/EventCallbackDispatcher';\nimport {PlayerContext} from '../player/AmazonIVSPlayerContext';\n\nenum State {\n IDLE,\n PAUSE_SCHEDULED,\n PAUSE_CANCELLED,\n}\n\nexport class PauseEventDispatcher {\n private readonly EVENT_DELAY_MS = 10;\n private state: State = State.IDLE;\n\n constructor(\n private dispatcher: EventCallbackDispatcher,\n private playerContext: PlayerContext,\n ) {}\n\n /**\n * In case of pause events emitted right before the real event\n * this method is used to cancel the scheduled pause event\n * Know cases:\n * BUFFERING: when buffer runs out `onPause` and `onRebuffering` are\n * triggered simultanously causing inconsistency which event comes first\n * PLAYING: when playback continues in vod there is a series of events triggered\n * play -> playing -> pause -> play -> playing.\n * in order to not transition into pause again we cancel the one in between the play/playing events\n * SEEKING (VOD): right before a seek/seeked event a Pause Event is triggered\n */\n cancelPause() {\n if (this.state == State.PAUSE_SCHEDULED) {\n this.state = State.PAUSE_CANCELLED;\n }\n }\n\n /**\n * schedules an pause event in the very near future\n * scheduled event is cancelable using `cancelPause`\n */\n schedulePauseEvent() {\n if (this.state == State.PAUSE_SCHEDULED) {\n return;\n }\n\n this.state = State.PAUSE_SCHEDULED;\n const eventObject: AnalyticsEventBase = {\n currentTime: this.playerContext.position,\n };\n\n setTimeout(\n () => {\n this.triggerPause(eventObject);\n this.state = State.IDLE;\n },\n this.EVENT_DELAY_MS,\n this,\n );\n }\n\n private triggerPause(event: AnalyticsEventBase) {\n if (this.state == State.PAUSE_CANCELLED) {\n return;\n }\n\n this.dispatcher.eventCallback(Event.PAUSE, event);\n }\n}\n","import type {Quality} from 'amazon-ivs-player';\n\nimport QualityChangeService from '../../../core/QualityChangeService';\nimport {Event} from '../../../enums/Event';\nimport {EventCallbackDispatcher} from '../../internal/EventCallbackDispatcher';\nimport {AmazonIVSPlayerContext, PlayerContext} from '../player/AmazonIVSPlayerContext';\n\nimport {PauseEventDispatcher} from './PauseEventDispatcher';\n\nexport class PlaybackService {\n private ignorePause = false;\n constructor(\n private dispatcher: EventCallbackDispatcher,\n private playerContext: PlayerContext,\n private pauseDispatcher: PauseEventDispatcher,\n private qualityChangeService: QualityChangeService,\n ) {}\n\n onStartupPlaying() {\n this.ignorePause = true;\n // ignore pause for the first 100ms after startup\n // needed to prevent unnecessary pause sample at the beginning\n setTimeout(() => {\n this.ignorePause = false;\n }, 100);\n }\n\n onPause() {\n if (this.ignorePause) {\n return;\n }\n\n this.pauseDispatcher.schedulePauseEvent();\n }\n\n onPlaying() {\n this.pauseDispatcher.cancelPause();\n this.playing();\n }\n\n onRebuffering() {\n this.pauseDispatcher.cancelPause();\n this.startBuffering();\n }\n\n onQualityChange(payload: Quality) {\n this.qualityChange(payload);\n }\n\n onSeek() {\n this.seek();\n }\n\n onSeeked() {\n this.seeked();\n }\n\n private startBuffering() {\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.START_BUFFERING, {\n currentTime,\n });\n }\n\n private playing() {\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.PLAYING, {\n currentTime,\n });\n }\n\n private qualityChange(payload: Quality) {\n if (!this.qualityChangeService.shouldAllowVideoQualityChange(payload.bitrate)) {\n this.qualityChangeService.setVideoBitrate(payload.bitrate);\n return;\n }\n this.qualityChangeService.setVideoBitrate(payload.bitrate);\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.VIDEO_CHANGE, {\n currentTime,\n });\n }\n\n private seek() {\n //Seeking for live streams is not supported, so seek method should do nothing for live streams\n if (this.playerContext.isLive) return;\n this.pauseDispatcher.cancelPause();\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.SEEK, {currentTime});\n }\n\n private seeked() {\n //Seeking for live streams is not supported, so seek method should do nothing for live streams\n if (this.playerContext.isLive) return;\n this.pauseDispatcher.cancelPause();\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.SEEKED, {currentTime});\n }\n\n static create(\n dispatcher: EventCallbackDispatcher,\n playerContext: AmazonIVSPlayerContext,\n qualityChangeService: QualityChangeService,\n ): PlaybackService {\n const pauseDispatcher = new PauseEventDispatcher(dispatcher, playerContext);\n return new PlaybackService(dispatcher, playerContext, pauseDispatcher, qualityChangeService);\n }\n}\n","import QualityChangeService from '../../../core/QualityChangeService';\nimport {Event} from '../../../enums/Event';\nimport {EventCallbackDispatcher} from '../../internal/EventCallbackDispatcher';\nimport {PlayerContext} from '../player/AmazonIVSPlayerContext';\n\nenum StartupState {\n SETUP,\n IDLE,\n STARTUP,\n STARTUP_FINISHED,\n}\n\nexport class VideoStartupService {\n constructor(\n private dispatcher: EventCallbackDispatcher,\n private playerContext: PlayerContext,\n private qualityChangeService: QualityChangeService,\n ) {}\n\n private state: StartupState = StartupState.SETUP;\n\n get finishedStartup(): boolean {\n return this.state == StartupState.STARTUP_FINISHED;\n }\n\n onInitialized() {\n this.finishSetup();\n }\n\n onPlay() {\n this.startStartup();\n }\n\n onPlaying() {\n this.finishStartup();\n }\n\n private finishSetup() {\n this.state = StartupState.IDLE;\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.READY, {\n currentTime,\n });\n }\n\n private startStartup() {\n if (this.state != StartupState.IDLE) {\n return;\n }\n\n this.state = StartupState.STARTUP;\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.PLAY, {\n currentTime,\n });\n }\n\n private finishStartup() {\n if (this.state != StartupState.STARTUP) {\n return;\n }\n\n this.state = StartupState.STARTUP_FINISHED;\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.PLAYING, {\n currentTime,\n });\n\n this.qualityChangeService.resetValues();\n this.qualityChangeService.setStartupHasFinished();\n }\n}\n","import type {MediaPlayer, Quality} from 'amazon-ivs-player';\n\nexport interface PlayerContext {\n position: number;\n isLive: boolean;\n currentQuality: Quality;\n}\n\nexport class AmazonIVSPlayerContext implements PlayerContext {\n constructor(private player: MediaPlayer) {}\n\n get position(): number {\n return this.player.getPosition();\n }\n\n get isLive(): boolean {\n return this.player.getDuration() === Infinity;\n }\n\n get currentQuality(): Quality {\n return this.player.getQuality();\n }\n}\n","import type {PlayerError, Quality} from 'amazon-ivs-player';\n\nimport QualityChangeService from '../../../core/QualityChangeService';\nimport {logger} from '../../../utils/Logger';\nimport {EventCallbackDispatcher} from '../../internal/EventCallbackDispatcher';\nimport {ErrorService} from '../playback/ErrorService';\nimport {PlaybackService} from '../playback/PlaybackService';\nimport {VideoStartupService} from '../playback/VideoStartupService';\n\nimport {AmazonIVSPlayerContext} from './AmazonIVSPlayerContext';\n\nexport class AmazonIVSPlayerEventHandler {\n constructor(\n private videoStartupService: VideoStartupService,\n private playbackService: PlaybackService,\n private errorService: ErrorService,\n ) {}\n\n onRebuffering() {\n logger.log('onRebuffering');\n this.playbackService.onRebuffering();\n }\n\n onDurationChanged(payload: number) {\n logger.log('onDurationChanged: ' + payload);\n }\n\n onError(payload: PlayerError) {\n logger.log('onError: ' + JSON.stringify(payload));\n this.errorService.onError(payload);\n }\n\n onInitialized() {\n logger.log('onInitialized');\n if (!this.videoStartupService.finishedStartup) {\n this.videoStartupService.onInitialized();\n }\n }\n\n onQualityChanged(payload: Quality) {\n logger.log('onQualityChanged: ' + JSON.stringify(payload));\n this.playbackService.onQualityChange(payload);\n }\n\n onTimeUpdate(payload: number) {\n logger.log('onTimeUpdate: ' + payload);\n }\n\n // HTMLVideoElement Events\n\n onPlay(event: Event) {\n if (!this.videoStartupService.finishedStartup) {\n this.videoStartupService.onPlay();\n } else {\n logger.log('onPlay:', event);\n }\n }\n\n onPause(event: Event) {\n if (this.videoStartupService.finishedStartup) {\n logger.log('onPause:', event);\n this.playbackService.onPause();\n }\n }\n\n onPlaying(event: Event) {\n logger.log('onPlaying:', event);\n if (!this.videoStartupService.finishedStartup) {\n this.videoStartupService.onPlaying();\n this.playbackService.onStartupPlaying();\n } else {\n this.playbackService.onPlaying();\n }\n }\n\n onSeek() {\n if (this.videoStartupService.finishedStartup) {\n this.playbackService.onSeek();\n }\n }\n\n onSeeked() {\n if (this.videoStartupService.finishedStartup) {\n this.playbackService.onSeeked();\n }\n }\n\n static create(\n dispatcher: EventCallbackDispatcher,\n playerContext: AmazonIVSPlayerContext,\n qualityChangeService: QualityChangeService,\n ): AmazonIVSPlayerEventHandler {\n const videoStartupService = new VideoStartupService(dispatcher, playerContext, qualityChangeService);\n const playbackService = PlaybackService.create(dispatcher, playerContext, qualityChangeService);\n const errorService = new ErrorService(dispatcher, playerContext);\n return new AmazonIVSPlayerEventHandler(videoStartupService, playbackService, errorService);\n }\n\n // for now we will keep those in here\n // once we have finished the implementation of IVS we can remove them\n\n // private onAudioBlocked() {}\n // private onBufferUpdate() {}\n // private onMutedChanged() {}\n // private onNetworkUnavailable() {}\n // private onPlaybackBlocked() {}\n // private onPlaybackRateChanged(payload: number) {}\n // private onTextCue(payload: TextCue) {}\n // private onTextMetadataCue(payload: TextMetadataCue) {}\n // private onVolumeChanged(payload: number) {}\n}\n","import type {MediaPlayer, PlayerEventType} from 'amazon-ivs-player';\n\nimport QualityChangeService from '../../../core/QualityChangeService';\nimport {EventCallbackDispatcher} from '../../internal/EventCallbackDispatcher';\n\nimport {AmazonIVSPlayerContext} from './AmazonIVSPlayerContext';\nimport {AmazonIVSPlayerEventHandler} from './AmazonIVSPlayerEventHandler';\n\n/**\n * Map of IVS Player events that we listen to, each should be type of {@link PlayerEventType}.\n *\n * Why: This way, we don't need to import string enum {@link PlayerEventType} from 'amazon-ivs-player' directly,\n * aka. compile/include it (as value) in our distribution code\n */\nexport const IVS_PLAYER_EVENT = {\n DURATION_CHANGED: 'PlayerDurationChanged' as PlayerEventType.DURATION_CHANGED,\n ERROR: 'PlayerError' as PlayerEventType.ERROR,\n INITIALIZED: 'PlayerInitialized' as PlayerEventType.INITIALIZED,\n QUALITY_CHANGED: 'PlayerQualityChanged' as PlayerEventType.QUALITY_CHANGED,\n REBUFFERING: 'PlayerRebuffering' as PlayerEventType.REBUFFERING,\n SEEK_COMPLETED: 'PlayerSeekCompleted' as PlayerEventType.SEEK_COMPLETED,\n TIME_UPDATE: 'PlayerTimeUpdate' as PlayerEventType.TIME_UPDATE,\n PLAYBACK_RATE_CHANGED: 'PlayerPlaybackRateChanged' as PlayerEventType.PLAYBACK_RATE_CHANGED,\n PLAYBACK_BLOCKED: 'PlayerPlaybackBlocked' as PlayerEventType.PLAYBACK_BLOCKED,\n} as const;\n\nexport class AmazonIVSPlayerEventListener {\n constructor(private eventHandler: AmazonIVSPlayerEventHandler) {}\n\n startMonitoring(player: MediaPlayer) {\n this.startMonitoringIVSPlayer(player);\n this.startMonitoringHTMLVideoElement(player.getHTMLVideoElement());\n }\n\n private startMonitoringHTMLVideoElement(video: HTMLVideoElement) {\n video.addEventListener('play', this.eventHandler.onPlay.bind(this.eventHandler));\n video.addEventListener('playing', this.eventHandler.onPlaying.bind(this.eventHandler));\n video.addEventListener('pause', this.eventHandler.onPause.bind(this.eventHandler));\n video.addEventListener('seeking', this.eventHandler.onSeek.bind(this.eventHandler));\n video.addEventListener('seeked', this.eventHandler.onSeeked.bind(this.eventHandler));\n }\n\n //https://aws.github.io/amazon-ivs-player-docs/1.18.0/web/interfaces/playereventtypemap.html\n private startMonitoringIVSPlayer(player: MediaPlayer) {\n player.addEventListener(IVS_PLAYER_EVENT.REBUFFERING, this.eventHandler.onRebuffering.bind(this.eventHandler));\n player.addEventListener(\n IVS_PLAYER_EVENT.DURATION_CHANGED,\n this.eventHandler.onDurationChanged.bind(this.eventHandler),\n );\n player.addEventListener(IVS_PLAYER_EVENT.ERROR, this.eventHandler.onError.bind(this.eventHandler));\n player.addEventListener(IVS_PLAYER_EVENT.INITIALIZED, this.eventHandler.onInitialized.bind(this.eventHandler));\n player.addEventListener(\n IVS_PLAYER_EVENT.QUALITY_CHANGED,\n this.eventHandler.onQualityChanged.bind(this.eventHandler),\n );\n player.addEventListener(IVS_PLAYER_EVENT.TIME_UPDATE, this.eventHandler.onTimeUpdate.bind(this.eventHandler));\n\n // unused events for reference\n // player.addEventListener(PlayerEventType.AUDIO_BLOCKED, this.onAudioBlocked);\n // player.addEventListener(PlayerEventType.BUFFER_UPDATE, this.onBufferUpdate);\n // player.addEventListener(PlayerEventType.MUTED_CHANGED, this.onMutedChanged);\n // player.addEventListener(PlayerEventType.NETWORK_UNAVAILABLE, this.onNetworkUnavailable);\n // player.addEventListener(PlayerEventType.PLAYBACK_BLOCKED, this.onPlaybackBlocked);\n // player.addEventListener(PlayerEventType.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChanged);\n // player.addEventListener(PlayerEventType.TEXT_CUE, this.onTextCue);\n // player.addEventListener(PlayerEventType.TEXT_METADATA_CUE, this.onTextMetadataCue);\n // player.addEventListener(PlayerEventType.VOLUME_CHANGED, this.onVolumeChanged);\n }\n\n static create(\n dispatcher: EventCallbackDispatcher,\n playerContext: AmazonIVSPlayerContext,\n qualityChangeService: QualityChangeService,\n ): AmazonIVSPlayerEventListener {\n const handler = AmazonIVSPlayerEventHandler.create(dispatcher, playerContext, qualityChangeService);\n return new AmazonIVSPlayerEventListener(handler);\n }\n}\n","export class SourceUrlProvider {\n m3u8Url?: string;\n}\n","const COLLECTOR_EVENTS = {\n RELEASE: 'RELEASE',\n} as const;\n\nconst _ALL_COLLECTOR_EVENTS = [COLLECTOR_EVENTS.RELEASE] as const;\n\ntype CollectorEvent = (typeof _ALL_COLLECTOR_EVENTS)[number];\n\ntype Listener = () => void;\n\nclass CollectorEventBus {\n private observer: Record = {\n [COLLECTOR_EVENTS.RELEASE]: [],\n };\n subscribe(event: CollectorEvent, func: Listener) {\n this.observer[event].push(func);\n }\n\n trigger(event: CollectorEvent) {\n this.observer[event].forEach((handler) => {\n handler();\n });\n }\n}\nconst eventBus = new CollectorEventBus();\n\ninterface EventHandler {\n subscribe(func: Listener);\n trigger();\n}\n\nconst buildEventHandler = (event: CollectorEvent): EventHandler => {\n return {\n subscribe(func) {\n eventBus.subscribe(event, func);\n },\n trigger() {\n eventBus.trigger(event);\n },\n };\n};\n\nconst CollectorEvents: Record = {\n RELEASE: buildEventHandler(COLLECTOR_EVENTS.RELEASE),\n};\n\nexport default CollectorEvents;\n","import {Event} from '../../../enums/Event';\nimport {WindowEventTracker} from '../../../utils/WindowEventTracker';\nimport {EventCallbackDispatcher} from '../../internal/EventCallbackDispatcher';\nimport {PlayerContext} from '../player/AmazonIVSPlayerContext';\nimport CollectorEvents from '../utils/CollectorEventBus';\n\nenum State {\n IDLE,\n UNLOADED,\n}\n\nexport class WindowEventListener {\n private state = State.IDLE;\n constructor(\n private windowEventTracker: WindowEventTracker,\n private dispatcher: EventCallbackDispatcher,\n private playerContext: PlayerContext,\n ) {}\n\n startMonitoring() {\n this.windowEventTracker.addEventListener('beforeunload', this.onPageUnload);\n this.windowEventTracker.addEventListener('unload', this.onPageUnload);\n }\n\n private onPageUnload = () => {\n if (this.state != State.IDLE) {\n return;\n }\n\n this.dispatcher.eventCallback(Event.UNLOAD, {\n currentTime: this.playerContext.position,\n });\n this.state = State.UNLOADED;\n CollectorEvents.RELEASE.trigger();\n };\n}\n","import type {PlayerAPI, UserInteractionEvent} from 'bitmovin-player';\n\nimport {WindowEventTracker} from '../../utils/WindowEventTracker';\nimport {AdCallbacks, AdModuleAPI} from '../internal/ads/AdModuleAPI';\n\nexport class Bitmovin8AdModule implements AdModuleAPI {\n adCallbacks = new AdCallbacks();\n\n constructor(\n private player: PlayerAPI,\n private windowEventTracker: WindowEventTracker,\n ) {\n this.register();\n }\n\n isLinearAdActive = () => {\n if (this.player.ads) {\n return (this.player.ads as any).isLinearAdActive() || false;\n }\n return false;\n };\n getContainer = () => this.player.getContainer();\n getAdModuleInfo = () => {\n if (this.player.ads) {\n return (this.player.ads as any).getModuleInfo();\n }\n return {name: undefined, version: undefined};\n };\n currentTime = () => this.player.getCurrentTime();\n\n private register() {\n this.player.on(this.player.exports.PlayerEvent.Play, (e: UserInteractionEvent) => {\n if (e.issuer === 'advertising-api') {\n this.adCallbacks.onPlay(e.issuer);\n }\n });\n this.player.on(this.player.exports.PlayerEvent.Paused, (e: UserInteractionEvent) => {\n if (e.issuer === 'advertising-api') {\n this.adCallbacks.onPause(e.issuer);\n }\n });\n this.player.on(this.player.exports.PlayerEvent.AdStarted, (event: any) => {\n this.adCallbacks.onAdStarted(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdFinished, (event: any) => {\n this.adCallbacks.onAdFinished(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdBreakStarted, (event: any) => {\n this.adCallbacks.onAdBreakStarted(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdBreakFinished, (event: any) => {\n this.adCallbacks.onAdBreakFinished(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdClicked, (event: any) => {\n this.adCallbacks.onAdClicked(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdQuartile, (event: any) => {\n this.adCallbacks.onAdQuartile(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdSkipped, (event: any) => {\n this.adCallbacks.onAdSkipped(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdError, (event: any) => {\n this.adCallbacks.onAdError(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdManifestLoaded, (event: any) => {\n this.adCallbacks.onAdManifestLoaded(event);\n });\n const handlePageClose = () => {\n this.adCallbacks.onBeforeUnload();\n };\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n}\n","import type {PlayerAPI, PlayerConfig} from 'bitmovin-player';\n\nimport type {\n AdapterAPI,\n SsaiAdBreakMetadata,\n SsaiAdMetadata,\n SsaiAdQuartile,\n SsaiAdQuartileMetadata,\n SsaiApi,\n} from '../../api/AdapterAPI';\nimport {\n isValidSsaiAdBreakMetadata,\n isValidSsaiAdMetadata,\n isValidSsaiAdQuartile,\n isValidSsaiAdQuartileMetadata,\n sanitizeSsaiAdQuartileMetadataFailedBeaconUrl,\n} from '../../api/adapterApiUtils';\nimport {Analytics} from '../../core/Analytics';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {sanitizeBitmovin8AdapterSsaiAdBreakMetadataAdPosition} from './bitmovin8AdapterSsaiApiSanitizeUtils';\nimport {Bitmovin8InternalAdapter} from './Bitmovin8InternalAdapter';\n\nexport class Bitmovin8Adapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(player: any, opts?: AnalyticsStateMachineOptions) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n const playerConfig: PlayerConfig = (player as PlayerAPI).getConfig();\n let analyticsConfig: AnalyticsConfig = (playerConfig as any).analytics;\n if (analyticsConfig === undefined) {\n analyticsConfig = {};\n }\n\n analyticsConfig.playerKey = analyticsConfig.playerKey || playerConfig.key;\n\n this.internalAdapter = Bitmovin8InternalAdapter.create(player, opts);\n this.analytics = Analytics.create(analyticsConfig, this.internalAdapter);\n\n // We do this here in order to put the reference of the adapter onto the player\n // customer using the bitmovin adapter standalone might not know that they need to\n // hold a reference\n player.analytics = this;\n\n this.wrapPlayerLoad(player, this.analytics);\n }\n\n readonly ssai: SsaiApi = {\n adBreakStart: (adBreakMetadata?: SsaiAdBreakMetadata) => {\n if (!isDefined(this.internalAdapter)) return;\n\n const sanitizedAdBreakMetadata = sanitizeBitmovin8AdapterSsaiAdBreakMetadataAdPosition(adBreakMetadata);\n\n if (!isValidSsaiAdBreakMetadata(adBreakMetadata)) {\n return;\n }\n\n this.internalAdapter.ssaiService.adBreakStart(sanitizedAdBreakMetadata);\n },\n\n adStart: (adMetadata?: SsaiAdMetadata) => {\n if (!isDefined(this.analytics)) return;\n if (!isDefined(this.internalAdapter)) return;\n\n if (!isValidSsaiAdMetadata(adMetadata)) {\n return;\n }\n\n this.internalAdapter.ssaiService.adStart(adMetadata);\n // we need to call this here to revert the customData values to the values before the adBreak\n // this is mainly needed to have clear transitions between ads, and we don't\n // copy over customData values from the first ad into the second ad\n // the adMetadata is applied after this call in the manipulate method when a sample is sent\n // it is a bit of a hack, but it is necessary right now due to the way how samples are created\n this.analytics.setConfigParameters();\n },\n\n adQuartileFinished: (adQuartile: SsaiAdQuartile, adQuartileMetadata?: SsaiAdQuartileMetadata) => {\n if (!isDefined(this.analytics)) return;\n if (!isDefined(this.internalAdapter)) return;\n\n if (!isValidSsaiAdQuartile(adQuartile)) {\n return;\n }\n\n let validAdQuartileMetadata: SsaiAdQuartileMetadata = {};\n\n const sanitizedSsaiAdQuartileMetadata = sanitizeSsaiAdQuartileMetadataFailedBeaconUrl(adQuartileMetadata);\n if (isValidSsaiAdQuartileMetadata(sanitizedSsaiAdQuartileMetadata)) {\n // if customer passed valid metadata, we use them\n validAdQuartileMetadata = {\n ...sanitizedSsaiAdQuartileMetadata,\n };\n }\n\n // if user passed valid metadata, we spread them to get rid of nullability in code\n this.internalAdapter.ssaiService.adQuartileFinished(adQuartile, validAdQuartileMetadata);\n },\n\n adBreakEnd: () => {\n if (!isDefined(this.analytics)) return;\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.ssaiService.adBreakEnd();\n // we need to call this here to revert the customData values to the values we had before the ad\n this.analytics.setConfigParameters();\n },\n };\n\n /*\n * intercept `player.load` with automated sourceChange handling\n */\n private wrapPlayerLoad(player: PlayerAPI, analytics: Analytics) {\n const originalLoad = player.load;\n player.load = (...args: Parameters): Promise => {\n if (args.length > 0) {\n const analyticsConfig = (args[0] as any).analytics;\n // we reset the analytics and reload with a new config\n analytics.sourceChange(analyticsConfig);\n }\n\n return originalLoad.apply(player, args);\n };\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.sourceChange(config);\n }\n}\n","import type {\n AudioPlaybackQualityChangedEvent,\n PlayerAPI,\n PlayerEventBase,\n SeekEvent,\n UserInteractionEvent,\n VideoPlaybackQualityChangedEvent,\n} from 'bitmovin-player';\n\nimport {Bitmovin8AnalyticsStateMachine} from '../../analyticsStateMachines/bitmovin8/Bitmovin8AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\nimport {HeartbeatService} from '../../core/HeartbeatService';\nimport {SegmentTracker} from '../../core/SegmentTracker';\nimport {SourceInfoFallbackService} from '../../core/SourceInfoFallbackService';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport {CastTech} from '../../enums/CastTech';\nimport {ErrorCode} from '../../enums/ErrorCode';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {HttpRequestTracking} from '../../features/httprequesttracking/HttpRequestTracking';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport type {AnalyticsEventBase} from '../../types/EventData';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {normalizeVideoDuration, PlaybackInfo} from '../../types/PlaybackInfo';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {getSourceInfoFromBitmovinSourceConfig} from '../../utils/BitmovinProgressiveSourceHelper';\nimport {logger} from '../../utils/Logger';\nimport * as AnalyticsSettings from '../../utils/Settings';\nimport {AdModuleAPI} from '../internal/ads/AdModuleAPI';\nimport {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {Bitmovin8AdModule} from './Bitmovin8AdModule';\nimport {HttpRequestTrackingAdapter} from './player/HttpRequestTrackingAdapter';\nimport {SegmentTrackerAdapter} from './player/SegmentTrackerAdapter';\nimport {SpeedMeterAdapter} from './player/SpeedMeterAdapter';\n\nenum ViewMode {\n Fullscreen = 'fullscreen',\n Inline = 'inline',\n PictureInPicture = 'pictureinpicture',\n}\n\nexport class Bitmovin8InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n override get downloadSpeedInfo(): DownloadSpeedInfo {\n return this.speedMeter.getInfo();\n }\n\n override get segments(): SegmentInfo[] {\n return this.segmentTracker.getSegments();\n }\n\n get adModule(): AdModuleAPI | undefined {\n return this._adModule;\n }\n\n get supportsDeferredLicenseLoading(): boolean {\n return true;\n }\n\n private onBeforeUnLoadEvent = false;\n private _adModule?: AdModuleAPI;\n private lastTrackedCurrentTime: number | undefined;\n private videoDuration: number | undefined;\n\n constructor(\n private player: PlayerAPI,\n private speedMeter: DownloadSpeedMeter,\n private segmentTracker: SegmentTracker,\n readonly videoCompletionTracker: VideoCompletionTracker,\n private httpRequestTrackingAdapter: HttpRequestTrackingAdapter,\n sourceInfoFallbackService: SourceInfoFallbackService,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n const heartbeatService = new HeartbeatService(() => player.getCurrentTime());\n const stateMachine = new Bitmovin8AnalyticsStateMachine(this.stateMachineCallbacks, heartbeatService, this.opts);\n heartbeatService.setListener(stateMachine);\n this.sourceInfoFallbackService = sourceInfoFallbackService;\n\n this.stateMachine = stateMachine;\n }\n\n protected get currentTime(): number {\n try {\n // during ad this.player.getCurrentTime() returns time of ad and not video\n // this then messes with videotime_start and videotime_end measurements of video\n // we don't track videotimes for ads\n if (this.player !== null && this.player.getCurrentTime !== null && !this.isAdPlaying) {\n return this.player.getCurrentTime();\n }\n } catch {\n logger.warn('Analytics Collector attempted to access player, but player is not available anymore');\n }\n return this.lastTrackedCurrentTime ? this.lastTrackedCurrentTime : 0;\n }\n\n protected get isAdPlaying(): boolean {\n const currentAd = this.player.ads && this.player.ads.getActiveAd();\n return currentAd !== null && currentAd !== undefined;\n }\n\n initialize(analytics: Analytics): Array> {\n this.registerPlayerEventListeners();\n this.registerUnloadEventListeners();\n\n this._adModule = new Bitmovin8AdModule(this.player, this.windowEventTracker);\n\n this.ssaiService.activate({\n getPlayerCurrentTime: () => this.currentTime,\n reportEngagementInteraction: (ssaiEngagementInteractionData) => {\n analytics.sendSsaiEngagementAdSample(ssaiEngagementInteractionData);\n },\n reportPlaybackInteraction: (timestamp: number, eventData: AnalyticsEventBase) =>\n this.stateMachine.onSsaiPlaybackInteraction(timestamp, eventData),\n });\n\n const requestTracking = new HttpRequestTracking([this.httpRequestTrackingAdapter]);\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n requestTracking,\n );\n return [errorDetailTracking];\n }\n\n override clearValues(): void {\n this.speedMeter.reset();\n }\n\n override clearSegments(): void {\n this.segmentTracker.reset();\n }\n\n override resetSourceRelatedState(): void {\n this.ssaiService.resetSourceRelatedState();\n super.resetSourceRelatedState();\n }\n\n getPlayerVersion = () => this.player.version;\n getPlayerName = () => Player.BITMOVIN;\n getPlayerTech = () => this.player.getPlayerType();\n getAutoPlay(): boolean {\n if (this.player.getConfig().playback) {\n return (this.player.getConfig() as any).playback.autoplay || false;\n }\n return false;\n }\n getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n getCurrentPlaybackInfo(): PlaybackInfo {\n const info: PlaybackInfo = {\n ...super.getCommonPlaybackInfo(),\n size: this.player.getViewMode() === ViewMode.Fullscreen ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isLive: this.player.isLive(),\n videoDuration: normalizeVideoDuration(this.videoDuration),\n streamFormat: this.player.getStreamType(),\n videoWindowWidth: this.player.getContainer().offsetWidth,\n videoWindowHeight: this.player.getContainer().offsetHeight,\n isMuted: this.player.isMuted(),\n isCasting: this.player.isCasting(),\n audioLanguage: this.player.getAudio() != null ? this.player.getAudio()?.lang : undefined,\n subtitleEnabled: false,\n droppedFrames: this.player.getSource() != null ? this.player.getDroppedVideoFrames() : 0,\n };\n\n this.applySubtitleProperties(info);\n this.applyPlaybackQualityProperties(info);\n this.applyCastingProperties(info);\n this.applySourceProperties(info);\n\n if (info.streamFormat == null || info.streamFormat === 'unknown') {\n // in case we cannot detect the streamFormat directly from\n // the player, we use the stored streamFormat as a fallback\n this.sourceInfoFallbackService.applyStreamFormat(info);\n }\n\n return info;\n }\n\n sourceChange(config: AnalyticsConfig) {\n this.stateMachine.callManualSourceChangeEvent(config, this.currentTime);\n }\n\n onError(): void {\n this.clearSegments();\n }\n\n private registerPlayerEventListeners() {\n this.player.on(this.player.exports.PlayerEvent.SourceUnloaded, (_event: any) => {\n this.segmentTracker.reset();\n this.eventCallback(Event.SOURCE_UNLOADED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SourceLoaded, (_event: any) => {\n this.videoCompletionTracker.reset();\n this.videoDuration = this.player.getDuration();\n this.videoCompletionTracker.setVideoDuration(this.player.getDuration());\n this.sourceInfoFallbackService.setStreamFormat(this.player.getStreamType());\n this.eventCallback(Event.SOURCE_LOADED, {});\n });\n\n this.player.on(this.player.exports.PlayerEvent.CastStarted, (event: any) => {\n this.eventCallback(Event.START_CAST, event);\n });\n\n this.player.on(this.player.exports.PlayerEvent.CastStopped, () => {\n this.eventCallback(Event.END_CAST, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Play, (e: UserInteractionEvent) => {\n if (e.issuer !== 'ui-seek') {\n this.eventCallback(Event.PLAY, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Playing, (e: UserInteractionEvent) => {\n if (e.issuer !== 'advertising-api') {\n this.eventCallback(Event.PLAYING, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Paused, (e: UserInteractionEvent) => {\n if (e.issuer !== 'ui-seek') {\n this.eventCallback(Event.PAUSE, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.TimeChanged, (_event: PlayerEventBase) => {\n if (!this.isAdPlaying) {\n this.lastTrackedCurrentTime = this.player.getCurrentTime();\n }\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: this.lastTrackedCurrentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Seek, (e: UserInteractionEvent) => {\n if (this.allowSeeking(e)) {\n this.eventCallback(Event.SEEK, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Seeked, () => {\n this.eventCallback(Event.SEEKED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.StallStarted, () => {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.StallEnded, () => {\n this.eventCallback(Event.END_BUFFERING, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AudioPlaybackQualityChanged, (eventData) => {\n const audioQualityChangedData = eventData as AudioPlaybackQualityChangedEvent;\n const sourceQuality = audioQualityChangedData.sourceQuality;\n const targetQuality = audioQualityChangedData.targetQuality;\n\n if (targetQuality == null) {\n return;\n }\n\n // we don't want to track the initial audioQualityChange event thus, we only\n // track the event if the sourceQuality is not null\n if (sourceQuality == null) {\n this.qualityChangeService.setAudioBitrate(targetQuality.bitrate);\n return;\n }\n\n if (this.qualityChangeService.shouldAllowAudioQualityChange(targetQuality.bitrate)) {\n this.eventCallback(Event.AUDIO_CHANGE, {\n bitrate: targetQuality.bitrate,\n currentTime: this.currentTime,\n codec: (targetQuality as any).codec,\n });\n }\n\n this.qualityChangeService.setAudioBitrate(targetQuality.bitrate);\n });\n\n this.player.on(this.player.exports.PlayerEvent.VideoPlaybackQualityChanged, (eventData) => {\n const videoQualityChangedData = eventData as VideoPlaybackQualityChangedEvent;\n const sourceQuality = videoQualityChangedData.sourceQuality;\n const targetQuality = videoQualityChangedData.targetQuality;\n\n // if targetQuality is null we just ignore the event\n // this is probably and outlier or the end of a session\n // where we don't want to track quality changes\n if (targetQuality == null) {\n return;\n }\n\n // we don't want to track the initial videoQualityChange event thus, we only\n // track the event if the sourceQuality is not null\n if (sourceQuality == null) {\n this.qualityChangeService.setVideoBitrate(targetQuality.bitrate);\n return;\n }\n\n if (this.qualityChangeService.shouldAllowVideoQualityChange(targetQuality.bitrate)) {\n this.eventCallback(Event.VIDEO_CHANGE, {\n width: targetQuality.width,\n height: targetQuality.height,\n bitrate: targetQuality.bitrate,\n currentTime: this.currentTime,\n codec: (targetQuality as any).codec,\n });\n }\n\n this.qualityChangeService.setVideoBitrate(targetQuality.bitrate);\n });\n\n this.player.on(this.player.exports.PlayerEvent.ViewModeChanged, (e: any) => {\n if (e.to === 'fullscreen') {\n this.eventCallback(Event.START_FULLSCREEN, {\n currentTime: this.currentTime,\n });\n } else if (e.from === 'fullscreen') {\n this.eventCallback(Event.END_FULLSCREEN, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdStarted, (_event: any) => {\n this.eventCallback(Event.START_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdFinished, (_event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdSkipped, (_event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdError, (_event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Muted, () => {\n this.eventCallback(Event.MUTE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Unmuted, () => {\n this.eventCallback(Event.UN_MUTE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Error, (event: any) => {\n this.eventCallback(Event.ERROR, {\n code: event.code,\n message: event.name,\n legacyData: event.data,\n currentTime: this.currentTime,\n data: {\n additionalData: JSON.stringify(event.data),\n },\n });\n if (\n event.code === ErrorCode.BITMOVIN_PLAYER_LICENSING_ERROR.code ||\n event.code === ErrorCode.SETUP_MISSING_LICENSE_WHITELIST.code\n ) {\n this._onLicenseCallFailed.dispatch({});\n }\n this.ssaiService.sendAdEngagementErrorSample(event.code, event.name);\n });\n\n this.player.on(this.player.exports.PlayerEvent.PlaybackFinished, () => {\n this.eventCallback(Event.END, {currentTime: this.currentTime});\n });\n\n this.player.on(this.player.exports.PlayerEvent.DownloadFinished, (event: any) => {\n if (event.downloadType.indexOf('drm/license/') === 0) {\n this.drmPerformanceInfo = {\n drmType: event.downloadType.replace('drm/license/', ''),\n drmLoadTime: event.downloadTime * 1000,\n };\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.AudioChanged, (_event: any) => {\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SubtitleEnabled, (_event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SubtitleDisabled, (_event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.LicenseValidated, (event: any) => {\n if (event.data.analytics && event.data.analytics.key !== undefined) {\n this._onLicenseKeyReceived.dispatch({licenseKey: event.data.analytics.key});\n } else {\n this._onLicenseCallFailed.dispatch({});\n }\n });\n }\n\n private registerUnloadEventListeners() {\n let handleCollectorUnload = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n // we use here the last tracked video time as we cannot be sure if the player is still working at this place\n const currentTime = this.lastTrackedCurrentTime;\n this.eventCallback(Event.UNLOAD, {currentTime});\n }\n this.release();\n };\n handleCollectorUnload = handleCollectorUnload.bind(true);\n\n this.player.on(this.player.exports.PlayerEvent.Destroy, handleCollectorUnload);\n this.windowEventTracker.addEventListener('beforeunload', handleCollectorUnload);\n this.windowEventTracker.addEventListener('unload', handleCollectorUnload);\n }\n\n private applySourceProperties(info: PlaybackInfo) {\n const source = this.player.getSource();\n if (source == null) {\n return;\n }\n\n info.videoTitle = source.title;\n info.mpdUrl = source.dash;\n info.m3u8Url = source.hls;\n\n const progSourceInfo = getSourceInfoFromBitmovinSourceConfig(source.progressive, this.player);\n info.progUrl = progSourceInfo.progUrl;\n if (this.player.getStreamType() === 'progressive') {\n info.videoBitrate = progSourceInfo.progBitrate;\n }\n }\n\n private applySubtitleProperties(info: PlaybackInfo) {\n let enabledSubtitle;\n if (this.player.subtitles) {\n enabledSubtitle = this.player.subtitles.list().find((s) => s.enabled === true);\n }\n\n info.subtitleEnabled = enabledSubtitle != null;\n info.subtitleLanguage = enabledSubtitle != null ? enabledSubtitle.lang : null;\n }\n\n private applyPlaybackQualityProperties(info: PlaybackInfo) {\n const videoQuality = this.player.getPlaybackVideoData();\n if (videoQuality != null) {\n info.videoBitrate = videoQuality.bitrate;\n info.videoPlaybackHeight = videoQuality.height;\n info.videoPlaybackWidth = videoQuality.width;\n info.videoCodec = (videoQuality as any).codec;\n }\n\n const audioQuality = this.player.getPlaybackAudioData();\n if (audioQuality != null) {\n info.audioBitrate = audioQuality.bitrate;\n info.audioCodec = (audioQuality as any).codec;\n }\n }\n\n private applyCastingProperties(info: PlaybackInfo) {\n const isCasting = this.player.isCasting() || this.player.isAirplayActive() || false;\n info.isCasting = isCasting;\n if (!isCasting) {\n return;\n }\n\n // AirPlay\n if (this.player.isAirplayActive()) {\n info.castTech = CastTech.AirPlay;\n return;\n }\n\n // Casting Tech from RemoteControlConfig\n const remoteControlConfig = this.player.getConfig().remotecontrol;\n if (remoteControlConfig === null || remoteControlConfig === undefined) {\n return;\n }\n\n switch (remoteControlConfig.type) {\n case 'googlecast':\n info.castTech = CastTech.GoogleCast;\n break;\n case 'websocket':\n info.castTech = CastTech.WebSocket;\n break;\n }\n }\n\n // with this check we ignore seek events which are smaller than the Threshold\n // mainly to ignore keyboard triggered seeks\n private allowSeeking(e: UserInteractionEvent): boolean {\n const seekEvent = e as SeekEvent;\n const seekDifference = Math.abs(seekEvent.position - seekEvent.seekTarget);\n return seekDifference > AnalyticsSettings.ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD;\n }\n\n static create(player: PlayerAPI, opts?: AnalyticsStateMachineOptions): Bitmovin8InternalAdapter {\n const speedMeter = new SpeedMeterAdapter(player, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n const segmentTracker = new SegmentTrackerAdapter(player, new SegmentTracker()).getSegmentTracker();\n const httpRequestTrackingAdapter = new HttpRequestTrackingAdapter(player);\n const videoCompletionTracker = new VideoCompletionTracker();\n const sourceInfoFallbackService = new SourceInfoFallbackService();\n return new Bitmovin8InternalAdapter(\n player,\n speedMeter,\n segmentTracker,\n videoCompletionTracker,\n httpRequestTrackingAdapter,\n sourceInfoFallbackService,\n opts,\n );\n }\n}\n","import type {SsaiAdBreakMetadata} from '../../api/AdapterAPI';\n\n/**\n * Utility function to sanitize the adPosition value in the SsaiAdBreakMetadata object passed to Bitmovin8Adapter.\n *\n * Needed, because we have introduced SSAI API in `Bitmovin8Adapter` in v2.39.0, without doing proper validation of\n * the passed adPosition value and customer started to use us with invalid values (having `-` in string in JavaScript).\n * Because we did not want to break the customer's implementation, we decided to sanitize the value to the correct one.\n */\nexport const sanitizeBitmovin8AdapterSsaiAdBreakMetadataAdPosition = (anything: T): T => {\n const maybeSsaiAdBreakMetadata = anything as SsaiAdBreakMetadata;\n\n if (maybeSsaiAdBreakMetadata?.adPosition != null) {\n if ((maybeSsaiAdBreakMetadata?.adPosition as string) === 'pre-roll') {\n maybeSsaiAdBreakMetadata.adPosition = 'preroll';\n } else if ((maybeSsaiAdBreakMetadata?.adPosition as string) === 'mid-roll') {\n maybeSsaiAdBreakMetadata.adPosition = 'midroll';\n } else if ((maybeSsaiAdBreakMetadata?.adPosition as string) === 'post-roll') {\n maybeSsaiAdBreakMetadata.adPosition = 'postroll';\n }\n }\n\n return maybeSsaiAdBreakMetadata as T;\n};\n","import type {DownloadFinishedEvent, PlayerAPI, PlayerExports} from 'bitmovin-player';\n\nimport {EventDispatcher, Subscribable} from '../../../core/EventDispatcher';\nimport {HttpRequestType} from '../../../features/httprequesttracking/HttpRequestType';\nimport {OnDownloadFinishedEventObject} from '../../../features/httprequesttracking/OnDownloadFinishedEventObject';\nimport {calculateTimeWithUndefined, getCurrentTimestamp} from '../../../utils/Utils';\n\nexport class HttpRequestTrackingAdapter implements Subscribable {\n private eventDispatcher = new EventDispatcher();\n private playerExports: PlayerExports;\n\n constructor(player: PlayerAPI) {\n this.playerExports = player.exports;\n player.on(this.playerExports.PlayerEvent.DownloadFinished, (event) =>\n this.onDownloadFinished(event as DownloadFinishedEvent),\n );\n }\n\n subscribe(callback: (args: OnDownloadFinishedEventObject) => void): () => void {\n return this.eventDispatcher.subscribe(callback);\n }\n\n unsubscribe(callback: (args: OnDownloadFinishedEventObject) => void) {\n this.eventDispatcher.unsubscribe(callback);\n }\n\n private onDownloadFinished(event?: DownloadFinishedEvent) {\n this.eventDispatcher.dispatch({\n httpRequest: {\n downloadTime: calculateTimeWithUndefined(event?.downloadTime) ?? 0,\n httpStatus: event?.httpStatus ?? 0,\n success: event?.success ?? false,\n timestamp: getCurrentTimestamp(),\n url: event?.url,\n size: event?.size,\n timeToFirstByte: calculateTimeWithUndefined(event?.timeToFirstByte),\n type: this.mapHttpRequestType(event?.downloadType),\n },\n });\n }\n\n private mapHttpRequestType(downloadType?: string): HttpRequestType {\n // Map downloadType to the HttpRequestType values\n if (Object.values(HttpRequestType).includes(downloadType as HttpRequestType)) {\n return downloadType as HttpRequestType;\n }\n return HttpRequestType.UNKNOWN;\n }\n}\n","import type {PlayerAPI} from 'bitmovin-player';\n\nimport {SegmentTracker} from '../../../core/SegmentTracker';\nimport {SegmentInfo} from '../../../types/SegmentInfo';\nimport * as Utils from '../../../utils/Utils';\n\ninterface DownloadFinishedEvent {\n attempt?: number;\n downloadType?: string;\n httpStatus: number;\n mimeType?: string;\n success: boolean;\n timestamp: number;\n type: string;\n url: string;\n}\n\ninterface SegmentPlaybackEvent {\n duration?: number;\n mediaInfo?: any;\n mimeType?: string;\n playbackTime?: number;\n representationId?: string;\n timestamp?: number;\n type?: string;\n uid?: string;\n url?: string;\n}\n\nexport class SegmentTrackerAdapter {\n private segmentTracker: SegmentTracker;\n\n constructor(player: PlayerAPI, segmentTracker: SegmentTracker) {\n this.segmentTracker = segmentTracker;\n\n player.on(player.exports.PlayerEvent.DownloadFinished, (event) => this.handleOnDownloadFinishEvent(event));\n player.on(player.exports.PlayerEvent.SegmentPlayback, (event) => this.handleSegmentPlaybackEvent(event));\n }\n\n getSegmentTracker(): SegmentTracker {\n return this.segmentTracker;\n }\n\n handleOnDownloadFinishEvent(event: any & DownloadFinishedEvent) {\n if (event.downloadType.indexOf('media/video') === 0) {\n const url = event.url;\n const segment: SegmentInfo = {\n name: Utils.getURLResourceName(url),\n url,\n timestamp: event.timestamp,\n };\n this.segmentTracker.addSegment(segment);\n }\n }\n\n handleSegmentPlaybackEvent = (event: any & SegmentPlaybackEvent) => {\n this.segmentTracker.removeSegment(event.url);\n };\n}\n","import type {PlayerAPI} from 'bitmovin-player';\n\nimport {DownloadSpeedMeter} from '../../../core/DownloadSpeedMeter';\n\nexport class SpeedMeterAdapter {\n private meter: DownloadSpeedMeter;\n\n constructor(player: PlayerAPI, meter: DownloadSpeedMeter) {\n this.meter = meter;\n player.on(player.exports.PlayerEvent.DownloadFinished, (event) => this.handleOnDownloadFinishEvent(event));\n }\n\n getDownloadSpeedMeter(): DownloadSpeedMeter {\n return this.meter;\n }\n\n handleOnDownloadFinishEvent(event: any) {\n if (!event.success) {\n return;\n }\n if (event.downloadType.indexOf('media/video') === 0) {\n this.meter.addMeasurement({\n duration: event.downloadTime,\n size: event.size,\n timeToFirstByte: event.timeToFirstByte,\n timestamp: new Date(),\n httpStatus: event.httpStatus,\n });\n }\n }\n}\n","import type {AnalyticsConfig} from 'bitmovin-player';\n\nimport type {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {VERSION} from '../../Version';\n\nimport {BitmovinPwxInternalAdapter} from './BitmovinPwxInternalAdapter';\nimport type {AnalyticsContext} from './Types';\n\nexport class BitmovinPwxAdapter implements AdapterAPI {\n private readonly internalAdapter: BitmovinPwxInternalAdapter;\n private readonly analytics: Analytics;\n\n constructor(context: AnalyticsContext, config: AnalyticsConfig) {\n this.internalAdapter = new BitmovinPwxInternalAdapter(context);\n this.analytics = Analytics.create(config, this.internalAdapter);\n }\n\n dispose() {\n this.internalAdapter.release();\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId = () => this.analytics.getCurrentImpressionId();\n\n getUserId = () => this.analytics.getUserId();\n\n setCustomData = (values: CustomDataValues) => this.internalAdapter.setCustomData(values);\n\n setCustomDataOnce = (values: CustomDataValues) => this.analytics.setCustomDataOnce(values);\n\n sourceChange = (config: AnalyticsConfig) => this.analytics.sourceChange(config);\n}\n","import type {EmptyObject} from '@bitmovin/player-web-x/framework-types/BaseTypes';\nimport type {AnyPackage} from '@bitmovin/player-web-x/framework-types/package-api/PackageApi';\n\nimport {BitmovinPwxAdapter} from './BitmovinPwxAdapter';\nimport {\n BundleExportNames,\n CoreExportNames,\n PlaybackApiEventsPackageExportNames,\n SourceExportNames,\n SourcesApiExportNames,\n} from './ExportNames';\nimport type {AnalyticsContext, CreatePackage} from './Types';\n\n/**\n * Copy&pasted from `@bitmovin/player-web-x` !\n *\n * We need `createPackage` function from util file to create a PWX package, but because `@bitmovin/player-web-x` is not\n * ES5 compliant, we had to copy it here.\n *\n * @see https://github.com/bitmovin-engineering/player-web-phoenix-framework/blob/main/src/package-api/PackageApiUtils.ts#L9\n */\nconst createPackageFn: CreatePackage = (name, onAdd, dependencies) => {\n (onAdd as any)._name = name;\n\n return {\n onAdd,\n dependencies,\n } as unknown as AnyPackage;\n};\n\nexport const BitmovinPwxAnalyticsPackage = createPackageFn(\n 'analytics-package',\n (_, baseContext) => {\n /*\n Player Web X analytics package.\n It is being run for every source added - so there is no actual source switching per analytics instance.\n Package is instantiating the adapter, and making sure it is disposed once package is aborted.\n */\n\n const {EventListenerEffectFactory, StateEffectFactory} = baseContext.registry.get(CoreExportNames.CoreEffects);\n const context = baseContext.using(EventListenerEffectFactory, StateEffectFactory) as unknown as AnalyticsContext;\n const logger = context.registry.get(BundleExportNames.Logger);\n const source = context.registry.get(SourceExportNames.SourceState);\n const playerConfig = context.registry.get(BundleExportNames.PlayerConfig);\n const analyticsConfig = playerConfig.analytics ?? {};\n analyticsConfig.playerKey = analyticsConfig.playerKey ?? playerConfig.key;\n\n logger.log(`Applying analytics config ${JSON.stringify(analyticsConfig)}`);\n const adapter = new BitmovinPwxAdapter(context, analyticsConfig);\n\n logger.log(`Analytics package initializing for \"${source.url}\"...`);\n\n const listener = () => {\n context.abortSignal.removeEventListener('abort', listener);\n logger.log(`Analytics package disposing for \"${source.url}\"`);\n adapter.dispose();\n };\n\n context.abortSignal.addEventListener('abort', listener);\n },\n [\n BundleExportNames.Logger,\n BundleExportNames.PlayerConfig,\n CoreExportNames.Constants,\n CoreExportNames.CoreEffects,\n CoreExportNames.CoreStateAtoms,\n SourceExportNames.SourceState,\n SourcesApiExportNames.SourceEventBus,\n PlaybackApiEventsPackageExportNames.PlaybackEvent,\n ],\n) as any; // we cast package as any to prevent DTS bundle type merging\n","import {StateMachine} from 'javascript-state-machine';\n\nimport {AnalyticsStateMachine} from '../../analyticsStateMachines/AnalyticsStateMachine';\nimport {\n createHeartbeatPayload,\n customStateMachineErrorCallback,\n logMissingCallbackWarning,\n on,\n} from '../../analyticsStateMachines/stateMachineUtils';\nimport {Event, EventMap} from '../../enums/Event';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {AnalyticsEventBase} from '../../types/EventData';\nimport type {NoExtraProperties} from '../../types/NoExtraProperties';\nimport type {StateMachineCallbacks} from '../../types/StateMachineCallbacks';\nimport {EventDebugging} from '../../utils/EventDebugging';\nimport {logger, padRight} from '../../utils/Logger';\n\nexport enum State {\n END = 'END',\n ERROR = 'ERROR',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n PAUSE = 'PAUSE',\n PLAYING = 'PLAYING',\n READY = 'READY',\n SETUP = 'SETUP',\n SOURCE_LOADED = 'SOURCE_LOADED',\n STARTUP = 'STARTUP',\n}\n\nexport class BitmovinPwxAnalyticsStateMachine extends AnalyticsStateMachine {\n private enabledDebugging = false;\n private debuggingStates: EventDebugging[] = [];\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n }\n\n getAllStatesBut(states: string[]) {\n return this.getAllStates().filter((i) => states.indexOf(i) < 0);\n }\n\n getAllStates() {\n return Object.keys(State).map((key) => State[key]);\n }\n\n override callEvent(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties,\n timestamp: number,\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n try {\n exec.call(this.stateMachine, timestamp, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + eventType, exec, eventObject, e);\n }\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n override onSsaiPlaybackInteraction(_timestamp: number, _eventObject: AnalyticsEventBase): void {\n // TODO: [AN-4289] Implement SSAI ad handling for PWX\n }\n\n override createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine {\n return StateMachine.create({\n initial: State.SETUP,\n error: customStateMachineErrorCallback,\n events: [\n {\n name: Event.SOURCE_LOADED,\n from: [State.SETUP, State.ERROR],\n to: State.READY,\n },\n on(Event.READY).stayIn(State.READY),\n on(Event.PAUSE).stayIn(State.READY),\n on(Event.TIMECHANGED).stayIn(State.READY),\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n {name: Event.PLAYING, from: State.READY, to: State.PLAYING},\n\n on(Event.PLAY).stayIn(State.STARTUP),\n on(Event.PLAYING).stayIn(State.STARTUP),\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n on(Event.READY).stayIn(State.STARTUP),\n {name: Event.PAUSE, from: State.STARTUP, to: State.READY},\n\n on(Event.PLAYING).stayIn(State.PLAYING),\n on(Event.TIMECHANGED).stayIn(State.PLAYING),\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n on(Event.TIMECHANGED).stayIn(State.PAUSE),\n on(Event.PAUSE).stayIn(State.PAUSE),\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n {name: Event.PLAYING, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n // when replay is triggered (play button is clicked once video finished),\n // we should start a new session, so we should go to STARTUP state\n {name: Event.PLAYING, from: State.END, to: State.STARTUP},\n\n on(Event.TIMECHANGED).stayIn(State.END),\n on(Event.END).stayIn(State.END),\n\n {name: Event.PLAY, from: State.END, to: State.STARTUP},\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.ERROR, from: this.getAllStatesBut([State.STARTUP]), to: State.ERROR},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut([State.STARTUP]), to: State.END},\n {name: Event.UNLOAD, from: [State.STARTUP], to: State.EXIT_BEFORE_VIDEOSTART},\n ],\n callbacks: {\n onenterstate: (event, from, to, timestamp, _eventObject) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log(\n `[ENTER ${timestamp}] ${padRight(to, 20)} EVENT: ${padRight(event, 20)} from: ${padRight(from, 14)}`,\n );\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (!timestamp) {\n return;\n }\n\n logger.log(\n `[LEAVE ${timestamp}] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to: ${padRight(to, 20)}`,\n );\n\n this.addStatesToLog(event, from, to, timestamp, eventObject);\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n const fromStateName = String(from).toLowerCase();\n const isStartup = from === State.STARTUP && to === State.PLAYING;\n this.maybeSetOrClearVideoStartTimeouts(from, to);\n\n if (isStartup) {\n this.stateMachineCallbacks.startup(stateDuration, State.STARTUP.toLowerCase());\n }\n\n if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fromStateName);\n } else if (from === State.SETUP) {\n // Setting Player Startup Time to fixed value of 1ms.\n // We can not get correct Player Startup Time from PWX player, because it does not have an \"onInitialized\" event\n this.stateMachineCallbacks.setup(1, State.SETUP.toLowerCase());\n } else if (event === Event.PAUSE && from === State.STARTUP && to === State.READY) {\n // fired PAUSE event in STARTUP state indicates we are moving back to READY,\n // so we have to clean setTimeout, and we should not call any stateMachineCallbacks\n this.clearVideoStartTimeout();\n } else if (from !== State.ERROR && !isStartup) {\n this.handleRestOfTheCallbacks(fromStateName, stateDuration, eventObject, from);\n }\n },\n ontimechanged: (_event, from, _to, timestamp, eventObject: AnalyticsEventBase) => {\n if (this.stateMachine.current !== 'PLAYING') {\n return;\n }\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.onHeartbeat(timestamp, stateDuration, String(from).toLowerCase(), eventObject);\n }\n },\n onplayerError: (_event, _from, _to, _timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n private handleRestOfTheCallbacks(\n fromStateName: string,\n stateDuration: number,\n eventObject: any,\n from: string | undefined,\n ) {\n const callbackFunction = this.stateMachineCallbacks[fromStateName];\n if (typeof callbackFunction === 'function') {\n try {\n callbackFunction(stateDuration, fromStateName, eventObject);\n } catch (e) {\n logger.error('Exception occurred in State Machine callback ' + fromStateName, eventObject, e);\n }\n } else {\n logMissingCallbackWarning(from, [State.READY]);\n }\n }\n\n private maybeSetOrClearVideoStartTimeouts(from: string | undefined, to: string | undefined) {\n if (from === State.READY && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && to === State.PLAYING) {\n this.clearVideoStartTimeout();\n }\n }\n\n sourceChange(_config: AnalyticsConfig, _timestamp: number, _currentTime?: number): void {\n throw new Error('Method not implemented.');\n }\n\n private onHeartbeat(timestamp: number, duration: number, state: string, eventData: AnalyticsEventBase) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventData);\n\n const payload = createHeartbeatPayload(duration, state as Lowercase);\n this.stateMachineCallbacks.heartbeat(duration, state, payload);\n\n this.onEnterStateTimestamp = timestamp;\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventData);\n }\n\n addStatesToLog(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any,\n ) {\n if (this.enabledDebugging) {\n this.debuggingStates.push(new EventDebugging(event, from, to, timestamp, eventObject));\n }\n }\n\n getStates() {\n return this.debuggingStates;\n }\n\n setEnabledDebugging(enabled: boolean) {\n this.enabledDebugging = enabled;\n }\n}\n","import type {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport type {Feature} from '../../features/Feature';\nimport type {FeatureConfig} from '../../features/FeatureConfig';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport type {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {normalizeVideoDuration, PlaybackInfo} from '../../types/PlaybackInfo';\nimport {InternalAdapter} from '../internal/InternalAdapter';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {BitmovinPwxAnalyticsStateMachine} from './BitmovinPwxAnalyticsStateMachine';\nimport {\n CoreExportNames,\n PlaybackApiEventsPackageExportNames,\n SourceExportNames,\n SourcesApiExportNames,\n} from './ExportNames';\nimport {AnalyticsContext} from './Types';\n\nconst PWX_ABORT_ERROR_CODE = 1007;\n\nexport class BitmovinPwxInternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n private onBeforeUnLoadEvent = false;\n\n constructor(\n private readonly context: AnalyticsContext,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n this.stateMachine = new BitmovinPwxAnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n }\n\n private getSource() {\n return this.context.registry.get(SourceExportNames.SourceState);\n }\n\n protected get currentTime(): number {\n return this.getSource().playback.playhead.position;\n }\n\n getAutoPlay(): boolean {\n return this.getSource().config.playback.autoplay;\n }\n\n getCurrentPlaybackInfo(): PlaybackInfo {\n const hls = this.getSource().sourceConfig.resources.filter((v) => v.url.includes('.m3u8'))[0]?.url;\n const dash = this.getSource().sourceConfig.resources.filter((v) => v.url.includes('.mpd'))[0]?.url;\n\n const videoRect = this.getSource().video.element?.getBoundingClientRect();\n const videoWidth = Math.round(videoRect?.width ?? 1);\n const videoHeight = Math.round(videoRect?.height ?? 1);\n\n let streamFormat = 'unknown';\n if (hls) {\n streamFormat = 'hls';\n } else if (dash) {\n streamFormat = 'dash';\n }\n\n // height, width, codecs and bitrate are fixed until we have quality api\n return {\n droppedFrames: 0,\n isMuted: this.getSource().video.element?.muted,\n isLive: this.getSource().stream.type === 'live',\n videoWindowHeight: videoHeight,\n videoWindowWidth: videoWidth,\n videoDuration: normalizeVideoDuration(this.getSource().video.element?.duration),\n videoPlaybackHeight: videoHeight,\n videoPlaybackWidth: videoWidth,\n m3u8Url: hls,\n mpdUrl: dash,\n streamFormat,\n videoCodec: undefined, // not tracked yet\n audioCodec: undefined, // not tracked yet\n videoBitrate: 0, // not tracked yet\n audioBitrate: 0, // not tracked yet\n };\n }\n\n getDrmPerformanceInfo(): DrmPerformanceInfo | undefined {\n return undefined;\n }\n\n getPlayerName(): string {\n return Player.BITMOVIN_PWX;\n }\n\n getPlayerTech(): string {\n return 'webx:html5';\n }\n\n getPlayerVersion(): string {\n return this.context.registry.get(CoreExportNames.Constants).Version;\n }\n\n initialize(analytics: Analytics): Array> {\n this.registerEventListeners();\n this.registerUnloadEventListeners();\n\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined,\n );\n\n return [errorDetailTracking];\n }\n\n private registerUnloadEventListeners() {\n let handleCollectorUnload = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n const currentTime = this.context.registry.get(SourceExportNames.SourceState).playback.playhead.position;\n this.eventCallback(Event.UNLOAD, {currentTime});\n }\n this.release();\n };\n handleCollectorUnload = handleCollectorUnload.bind(true);\n\n this.context.abortSignal.addEventListener('abort', handleCollectorUnload);\n this.windowEventTracker.addEventListener('beforeunload', handleCollectorUnload);\n this.windowEventTracker.addEventListener('unload', handleCollectorUnload);\n }\n\n private registerEventListeners() {\n // The context might not be same so a different source event bus is available\n const sourceEventBus = this.context.registry.get(SourcesApiExportNames.SourceEventBus);\n const playbackAtom = this.context.registry.get(SourceExportNames.SourceState).playback;\n const PlaybackEvent = this.context.registry.get(PlaybackApiEventsPackageExportNames.PlaybackEvent);\n\n sourceEventBus.on(PlaybackEvent.Ready, () => {\n this.eventCallback(Event.SOURCE_LOADED, {currentTime: playbackAtom.playhead.position});\n });\n sourceEventBus.on(PlaybackEvent.Play, () => {\n this.eventCallback(Event.PLAY, {currentTime: playbackAtom.playhead.position});\n });\n sourceEventBus.on(PlaybackEvent.Playing, () => {\n this.eventCallback(Event.PLAYING, {currentTime: playbackAtom.playhead.position});\n });\n sourceEventBus.on(PlaybackEvent.Paused, () => {\n this.eventCallback(Event.PAUSE, {currentTime: playbackAtom.playhead.position});\n });\n sourceEventBus.on(PlaybackEvent.TimeChanged, () => {\n this.eventCallback(Event.TIMECHANGED, {currentTime: playbackAtom.playhead.position});\n });\n sourceEventBus.on(PlaybackEvent.VideoAttached, () => {\n this.eventCallback(Event.SOURCE_LOADED, {currentTime: playbackAtom.playhead.position});\n });\n\n sourceEventBus.on(PlaybackEvent.Ended, () => {\n this.eventCallback(Event.END, {currentTime: playbackAtom.playhead.position});\n });\n\n const abortListener = () => {\n const abortSignalReason = this.context.abortSignal.reason;\n if (abortSignalReason.name === 'SourceRemovedError' || abortSignalReason.name === 'FrameworkDisposedError') {\n this.eventCallback(Event.SOURCE_UNLOADED, {currentTime: playbackAtom.playhead.position});\n } else {\n this.eventCallback(Event.ERROR, {\n currentTime: playbackAtom.playhead.position,\n code: PWX_ABORT_ERROR_CODE,\n message: abortSignalReason.message,\n data: abortSignalReason,\n });\n }\n\n this.context.abortSignal.removeEventListener('abort', abortListener);\n };\n\n this.context.abortSignal.addEventListener('abort', abortListener);\n }\n\n sourceChange(_: AnalyticsConfig) {\n // Every time a source is added, a new instance of analytics package is triggered. So technically there are\n // no source changes. Also, a single player instance can handle infinite amount of sources at once.\n //\n // We are aware, at the moment we are handling it as \"every source = one session\". We will need to do\n // some additional work in the future (once we figure out how this part should work) to handle multiple\n // sources in one session (e.g. ads).\n //\n // What we mean by \"no source changes\", is that you do not have API to change \"current playing\" source\n // to something else. You would need to add new source and remove old one (or keep it). One instance can\n // have infinite amount of sources, each source for us is a new analytics session (for now, in certain cases\n // they should be tied together - e.g. ads)\n //\n // @see https://github.com/bitmovin-engineering/bitmovin-analytics-collector/pull/867#discussion_r1660699646\n\n throw new Error('Method not implemented.');\n }\n}\n","/*!\n * This file was created to provide Bitmovin Player Web X \"export names\" as constants,\n * because they are exported as enums in 'd.ts' files, that we can't import as value in this project.\n *\n * Once `@bitmovin/player-web-x` bundle will provide these enums in way we could import them, we could remove/simplify this file.\n */\n\nimport type {BundleExportNames as BundleExportNamesEnum} from '@bitmovin/player-web-x/types/bundles/Types';\nimport type {CoreExportNames as CoreExportNamesEnum} from '@bitmovin/player-web-x/types/packages/core/Types';\nimport type {PlaybackApiEventsPackageExportNames as PlaybackApiEventsPackageExportNamesEnum} from '@bitmovin/player-web-x/types/packages/playback-api/playback-api-events/Types';\nimport type {SourceExportNames as SourceExportNamesEnum} from '@bitmovin/player-web-x/types/packages/source/Types';\nimport type {SourcesApiExportNames as SourcesApiExportNameEnum} from '@bitmovin/player-web-x/types/packages/sources-api/Types';\n\nimport type {EnumAsUnion} from '../../utils/EnumAsUnion';\n\nconst BundleExportNamesLogger: EnumAsUnion = 'logger';\nconst BundleExportNamesPlayerConfig: EnumAsUnion = 'player-config';\nexport const BundleExportNames = {\n Logger: BundleExportNamesLogger,\n PlayerConfig: BundleExportNamesPlayerConfig,\n};\n\nconst CoreExportNamesUtils: EnumAsUnion = 'utils';\nconst CoreExportNamesConstants: EnumAsUnion = 'constants';\nconst CoreExportNamesCoreEffects: EnumAsUnion = 'core-effects';\nconst CoreExportNamesCoreStateAtoms: EnumAsUnion = 'core-state-atoms';\nexport const CoreExportNames = {\n Utils: CoreExportNamesUtils,\n Constants: CoreExportNamesConstants,\n CoreEffects: CoreExportNamesCoreEffects,\n CoreStateAtoms: CoreExportNamesCoreStateAtoms,\n} as const;\n\nconst PlaybackApiEventsPackageExportNamesPlaybackEvent: EnumAsUnion =\n 'playback-event';\nexport const PlaybackApiEventsPackageExportNames = {\n PlaybackEvent: PlaybackApiEventsPackageExportNamesPlaybackEvent,\n} as const;\n\nconst SourceExportNamesCreateSourceStateAtom: EnumAsUnion = 'create-source-state-atom';\nconst SourceExportNamesCreateSourceReference: EnumAsUnion = 'create-source-reference';\nconst SourceExportNamesSourceReferences: EnumAsUnion = 'source-references';\nconst SourceExportNamesSourceState: EnumAsUnion = 'source-state-atom';\nexport const SourceExportNames = {\n CreateSourceStateAtom: SourceExportNamesCreateSourceStateAtom,\n CreateSourceReference: SourceExportNamesCreateSourceReference,\n SourceReferences: SourceExportNamesSourceReferences,\n SourceState: SourceExportNamesSourceState,\n} as const;\n\nconst SourcesApiExportNamesSourceApiManager: EnumAsUnion = 'source-api-manager';\nconst SourcesApiExportNamesVideoElementUtils: EnumAsUnion = 'video-element-utils';\nconst SourcesApiExportNamesSourceEventBus: EnumAsUnion = 'source-event-bus';\nexport const SourcesApiExportNames = {\n SourceApiManager: SourcesApiExportNamesSourceApiManager,\n VideoElementUtils: SourcesApiExportNamesVideoElementUtils,\n SourceEventBus: SourcesApiExportNamesSourceEventBus,\n} as const;\n","import type {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {CAFv3InternalAdapter} from './CAFv3InternalAdapter';\n\nexport class CAFv3Adapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n this.internalAdapter = new CAFv3InternalAdapter(player, opts);\n this.analytics = Analytics.create(config, this.internalAdapter);\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.sourceChange(config);\n }\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {normalizeVideoDuration, PlaybackInfo} from '../../types/PlaybackInfo';\nimport {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nexport class CAFv3InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n private playerManager;\n private mediaInformation;\n private activeAudioTrack;\n private activeTextTracks;\n private currentItem;\n private isSeeking: boolean;\n\n constructor(\n protected context: any,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.playerManager = context.getPlayerManager();\n this.isSeeking = false;\n }\n\n initialize(analytics: Analytics): Array> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined,\n );\n return [errorDetailTracking];\n }\n\n getPlayerVersion(): string {\n return (window as any).cast && (window as any).cast.framework ? (window as any).cast.framework.VERSION : 'unknown';\n }\n\n getPlayerName = () => Player.CHROMECAST_SHAKA;\n getPlayerTech = () => 'html5';\n getAutoPlay = () => (this.currentItem && this.currentItem.autoplay ? this.currentItem.autoplay : false);\n getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n sourceChange(config: AnalyticsConfig) {\n this.stateMachine.callManualSourceChangeEvent(config, this.playerManager.getCurrentTimeSec());\n }\n\n getCurrentPlaybackInfo(): PlaybackInfo {\n const stats = (this.playerManager as any).getStats();\n\n const info: PlaybackInfo = {\n isLive: this.getIsLive(),\n playerTech: this.getPlayerTech(),\n videoDuration: normalizeVideoDuration(this.mediaInformation ? this.mediaInformation.duration : 0),\n videoPlaybackHeight: stats.height,\n videoPlaybackWidth: stats.width,\n audioCodec: this.activeAudioTrack ? this.activeAudioTrack.trackContentType : undefined,\n audioLanguage: this.activeAudioTrack ? this.activeAudioTrack.language : undefined,\n subtitleLanguage: this.activeTextTracks ? this.activeTextTracks.map((t) => t.language).join(',') : undefined,\n droppedFrames: 0, // TODO\n };\n\n return info;\n }\n\n register() {\n this.playerManager.addEventListener('PLAYER_LOADING', (_event) => {\n this.eventCallback(Event.SETUP, {});\n });\n\n this.playerManager.addEventListener('PLAYER_LOAD_COMPLETE', (event) => {\n const audioTracksManager = this.playerManager.getAudioTracksManager();\n this.activeAudioTrack = audioTracksManager.getActiveTrack();\n\n // captions\n const textTracksManager = this.playerManager.getTextTracksManager();\n this.activeTextTracks = textTracksManager.getActiveTracks();\n\n const queueManager = this.playerManager.getQueueManager();\n this.currentItem = queueManager.getCurrentItem();\n\n this.mediaInformation = event.media;\n\n this.eventCallback(Event.READY, {});\n });\n\n this.playerManager.addEventListener('PLAY', (event) => {\n this.eventCallback(Event.PLAY, {\n currentTime: event.currentMediaTime,\n });\n });\n\n this.playerManager.addEventListener('PAUSE', (_event) => {\n this.onPaused(this.playerManager.getCurrentTimeSec());\n });\n\n this.playerManager.addEventListener('ERROR', (event) => {\n const errorData = event.error != null ? event.error : undefined;\n this.eventCallback(Event.ERROR, {\n currentTime: this.playerManager.getCurrentTimeSec(),\n code: event.detailedErrorCode,\n message: event.reason,\n legacyData: errorData,\n data: {additionalData: JSON.stringify(errorData)},\n });\n });\n\n this.playerManager.addEventListener('SEEKING', (event) => {\n this.isSeeking = true;\n this.onPaused(event.currentMediaTime);\n this.eventCallback(Event.SEEK, {\n currentTime: event.currentMediaTime,\n });\n });\n\n this.playerManager.addEventListener('SEEKED', (event) => {\n this.isSeeking = false;\n this.eventCallback(Event.SEEKED, {\n currentTime: event.currentMediaTime,\n });\n });\n\n // Fired when the browser is trying to fetch media data,\n // but did not receive a response. The cast.framework.events.EventType.BUFFERING\n // event is implemented consistently across stream types, and should be used instead\n // of 'stalled' when trying to check if the player is buffering.\n this.playerManager.addEventListener('STALLED', (_event) => undefined);\n\n this.playerManager.addEventListener('BUFFERING', (event) => {\n if (!this.isSeeking && event.isBuffering) {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.playerManager.addEventListener('TIME_UPDATE', (event) => {\n if (!this.isSeeking) {\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: event.currentMediaTime,\n });\n }\n });\n\n this.playerManager.addEventListener('REQUEST_LOAD', (_event) => {\n // this event is triggered whenever new content is to be played\n // it's not necessary to do license call and reset all data if this is the first item being played\n if (this.currentItem) {\n this.eventCallback(Event.PLAYLIST_TRANSITION, {\n currentTime: this.playerManager.getCurrentTimeSec(),\n });\n }\n });\n }\n\n onPaused(currentTime?: number) {\n this.eventCallback(Event.PAUSE, {\n currentTime,\n });\n }\n\n protected get currentTime(): number {\n return this.playerManager.getCurrentTimeSec();\n }\n\n private getIsLive(): boolean | undefined {\n // needs to be explicitly set to \"LIVE\" by customers in their receiver implementation\n if (this.mediaInformation && this.mediaInformation.streamType === 'LIVE') {\n return true;\n }\n\n // hack because object exists only for live streams\n const liveSeekableRange = this.playerManager.getLiveSeekableRange();\n\n if (liveSeekableRange) {\n return true;\n }\n\n return undefined;\n }\n}\n","import type {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {DashjsInternalAdapter} from './DashjsInternalAdapter';\n\nexport class DashjsAdapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n this.internalAdapter = new DashjsInternalAdapter(player, opts);\n this.analytics = Analytics.create(config, this.internalAdapter);\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.sourceChange(config);\n }\n}\n","import type {MediaPlayerClass} from 'dashjs';\n\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {CodecInfo} from '../../types/CodecInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport type {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {logger} from '../../utils/Logger';\nimport {isBlank, isValidString} from '../../utils/stringUtils';\nimport {HTML5InternalAdapter} from '../html5/HTML5InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nexport class DashjsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n private readonly mediaPlayer: MediaPlayerClass;\n\n constructor(mediaPlayer: any, opts?: AnalyticsStateMachineOptions) {\n super(undefined, opts);\n this.mediaPlayer = mediaPlayer;\n }\n\n override initialize(analytics: Analytics): Array> {\n super.initialize(analytics);\n let videoEl: HTMLVideoElement | null = null;\n try {\n videoEl = this.mediaPlayer.getVideoElement();\n } catch (_e) {\n // empty\n }\n\n if (!videoEl) {\n this.mediaPlayer.on(\n 'manifestLoaded',\n () => {\n try {\n videoEl = this.mediaPlayer.getVideoElement();\n this.setMediaElement(videoEl);\n this.registerMediaElementEventsForDashJS();\n } catch (e) {\n logger.errorMessageToUser(\n 'Something went wrong while getting underlying HTMLVideoElement. Not possible to attach adapter and initialize Bitmovin Analytics. Error: ',\n e,\n );\n this.release();\n }\n },\n this,\n );\n } else {\n this.setMediaElement(videoEl);\n this.registerMediaElementEventsForDashJS();\n }\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined,\n );\n return [errorDetailTracking];\n }\n\n registerMediaElementEventsForDashJS() {\n const mediaElement = this.mediaElement;\n\n if (!mediaElement) {\n return;\n }\n\n this.listenToMediaElementEvent('playing', () => {\n const {currentTime} = mediaElement;\n this.needsFirstPlayIntent = false;\n this.eventCallback(Event.TIMECHANGED, {\n currentTime,\n });\n });\n }\n\n override getPlayerName = () => Player.DASHJS;\n\n override getCurrentPlaybackInfo(): PlaybackInfo {\n const html5PlaybackInfo = super.getCurrentPlaybackInfo();\n\n const playbackInfo: PlaybackInfo = {\n ...html5PlaybackInfo,\n };\n\n const codecInfo = getMediaPlayerCodecInfo(this.mediaPlayer);\n this.sourceInfoFallbackService.applyAndStoreCodecInfo(playbackInfo, codecInfo);\n\n return playbackInfo;\n }\n\n getPlayerVersion = () => this.mediaPlayer.getVersion();\n\n override getMIMEType() {\n return MIMETypes.DASH;\n }\n\n override getStreamURL(): string | undefined {\n if (!this.mediaPlayer) {\n return undefined;\n }\n\n // In case of error/unloading the source might be undefined and the getter will throw an error\n let source: object | string | undefined = undefined;\n try {\n source = this.mediaPlayer.getSource();\n } catch (error) {\n logger.warn('no source available', error);\n }\n\n return source != null ? source.toString() : undefined;\n }\n /**\n * Implemented by sub-class to deliver current quality-level info\n * specific to media-engine.\n * @override\n * @returns {QualityLevelInfo}\n */\n getCurrentQualityLevelInfo(): null | QualityLevelInfo {\n if (!this.mediaPlayer) {\n return null;\n }\n\n // info not available on source change, methods exist but throw exception\n try {\n const videoBitrateInfoList = this.mediaPlayer.getBitrateInfoListFor('video');\n const currentVideoQualityIndex = this.mediaPlayer.getQualityFor('video');\n const currentVideoQuality = videoBitrateInfoList[currentVideoQualityIndex];\n\n if (currentVideoQuality == null) {\n return null;\n }\n\n const {width, height, bitrate} = currentVideoQuality;\n return {\n width,\n height,\n bitrate,\n };\n } catch (_error) {\n logger.warn('Quality information not available');\n }\n\n return null;\n }\n}\n\n/**\n * Build with player API with \"dashjs@4.7.4\"\n */\nexport const getMediaPlayerCodecInfo = (mediaPlayer: MediaPlayerClass): CodecInfo => {\n /**\n * Same RegExp for video and audio codec property parsing, because it's string value has same format with `codecs`\n *\n * Parse string and extract codec as first captured group, value between `\\\"` and `\\\"`\n *\n * Example 'video' value from player API:\n * `video/mp4;codecs=\"avc1.4d400d\"`\n * should be parsed by RegExp and return match\n * `avc1.4d400d`\n *\n * Example 'audio' value from player API:\n * `audio/mp4;codecs=\"mp4a.40.5\"`\n * should be parsed by RegExp and return match\n * `mp4a.40.5`\n */\n const codecsRegExp = new RegExp(/codecs=\"(.*)\"/);\n\n // try-catches in code, because `mediaPlayer.getCurrentTrackFor`\n // can throw STREAMING_NOT_INITIALIZED_ERROR, if called before initializePlayback function\n //\n // see https://cdn.dashjs.org/latest/jsdoc/module-MediaPlayer.html#getCurrentTrackFor\n\n let videoCodec: string | undefined;\n try {\n const rawVideoCodec = mediaPlayer.getCurrentTrackFor('video')?.codec;\n if (isValidString(rawVideoCodec) && !isBlank(rawVideoCodec)) {\n const matches = codecsRegExp.exec(rawVideoCodec);\n videoCodec = matches?.[1];\n }\n } catch (_e) {\n videoCodec = undefined;\n }\n\n let audioCodec: string | undefined;\n try {\n const rawAudioCodec = mediaPlayer.getCurrentTrackFor('audio')?.codec;\n if (isValidString(rawAudioCodec) && !isBlank(rawAudioCodec)) {\n const matches = codecsRegExp.exec(rawAudioCodec);\n audioCodec = matches?.[1];\n }\n } catch (_e) {\n audioCodec = undefined;\n }\n\n return {videoCodec, audioCodec};\n};\n","import type {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {HlsInternalAdapter} from './HlsInternalAdapter';\n\nexport class HlsAdapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n this.internalAdapter = new HlsInternalAdapter(player, opts);\n this.analytics = Analytics.create(config, this.internalAdapter);\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.sourceChange(config);\n }\n}\n","import type {AudioTrackSwitchedData, Events, default as Hls, Level, SubtitleTrackSwitchData} from 'hls.js';\n\nimport {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {CodecInfo} from '../../types/CodecInfo';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\nimport {isNumber} from '../../utils/Utils';\nimport {HTML5InternalAdapter} from '../html5/HTML5InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {HlsSpeedMeterAdapter} from './player/HlsSpeedMeterAdapter';\n\n/**\n * Map of Hls Player events that we listen to, each should be type of {@link Events}.\n *\n * Why: This way, we don't need to import string enum {@link Events} from 'hls.js' directly,\n * aka. compile/include it (as value) in our distribution code\n */\nexport const HLS_PLAYER_EVENT = {\n MEDIA_ATTACHING: 'hlsMediaAttaching' as Events.MEDIA_ATTACHING,\n MEDIA_DETACHING: 'hlsMediaDetaching' as Events.MEDIA_DETACHING,\n MANIFEST_LOADING: 'hlsManifestLoading' as Events.MANIFEST_LOADING,\n AUDIO_TRACK_SWITCHED: 'hlsAudioTrackSwitched' as Events.AUDIO_TRACK_SWITCHED,\n SUBTITLE_TRACK_SWITCH: 'hlsSubtitleTrackSwitch' as Events.SUBTITLE_TRACK_SWITCH,\n DESTROYING: 'hlsDestroying' as Events.DESTROYING,\n ERROR: 'hlsError' as Events.ERROR,\n} as const;\n\nexport class HlsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n override get downloadSpeedInfo(): DownloadSpeedInfo {\n return this.speedMeter.getInfo();\n }\n\n private readonly hls: Hls;\n private speedMeter: DownloadSpeedMeter;\n\n constructor(hls: any, opts?: AnalyticsStateMachineOptions) {\n super(undefined, opts);\n this.hls = hls;\n this.speedMeter = new HlsSpeedMeterAdapter(hls, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n }\n\n override initialize(analytics: Analytics): Array> {\n super.initialize(analytics);\n this.registerHlsEvents();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined,\n );\n return [errorDetailTracking];\n }\n\n override clearValues(): void {\n this.speedMeter.reset();\n }\n\n override getPlayerName = () => Player.HLSJS;\n\n getPlayerVersion = () => (this.hls as any).constructor.version;\n\n getCurrentQualityLevelInfo(): null | QualityLevelInfo {\n const currentLevelObj = getHlsCurrentLevel(this.hls);\n if (!currentLevelObj) {\n return null;\n }\n\n const bitrate = currentLevelObj.bitrate;\n const width = currentLevelObj.width;\n const height = currentLevelObj.height;\n\n return {\n bitrate: bitrate,\n width: width,\n height: height,\n };\n }\n\n override isLive = () => {\n const currentLevelObj = getHlsCurrentLevel(this.hls);\n\n if (currentLevelObj?.details == null) {\n return undefined;\n }\n\n return currentLevelObj.details.live;\n };\n\n override getMIMEType() {\n return MIMETypes.HLS;\n }\n\n override getStreamURL() {\n return (this.hls as any).url;\n }\n\n registerHlsEvents() {\n this.hls.on(HLS_PLAYER_EVENT.MEDIA_ATTACHING, this.onMediaAttaching.bind(this));\n this.hls.on(HLS_PLAYER_EVENT.MEDIA_DETACHING, this.onMediaDetaching.bind(this));\n this.hls.on(HLS_PLAYER_EVENT.MANIFEST_LOADING, this.onManifestLoading.bind(this));\n this.hls.on(HLS_PLAYER_EVENT.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched.bind(this));\n this.hls.on(HLS_PLAYER_EVENT.SUBTITLE_TRACK_SWITCH, this.onSubtitleLanguageSwitched.bind(this));\n this.hls.on(HLS_PLAYER_EVENT.DESTROYING, this.onDestroying.bind(this));\n this.hls.on(HLS_PLAYER_EVENT.ERROR, this.onHlsError.bind(this));\n\n // media is already attached, event has been triggered before\n // or we are in the event handler of this event itself.\n // we can not know how the stacktrace to this constructor will look like.\n // therefore we will guard from this case in\n // the onMediaAttaching method (avoid running it twice)\n if (this.hls.media) {\n this.onMediaAttaching();\n this.onManifestLoading();\n }\n }\n\n onMediaAttaching() {\n // in case we are called again (when we are triggering this ourselves\n // but from the event handler of MEDIA_ATTACHING) we should not run again.\n if (this.mediaElement) {\n return;\n }\n\n this.mediaElement = this.hls.media as HTMLVideoElement;\n\n this.registerMediaElement();\n this.onMaybeReady();\n }\n\n onMediaDetaching() {\n this.unregisterMediaElement();\n }\n\n onManifestLoading() {\n this.onMaybeReady();\n }\n\n override getCurrentPlaybackInfo(): PlaybackInfo {\n const selectedSubtitle = this.getSelectedSubtitleLanguage();\n\n const playbackInfo: PlaybackInfo = {\n ...super.getCurrentPlaybackInfo(),\n audioLanguage: this.getSelectedAudioLanguage(),\n subtitleEnabled: selectedSubtitle != null ? selectedSubtitle.enabled : undefined,\n subtitleLanguage: selectedSubtitle != null ? selectedSubtitle.language : undefined,\n };\n\n const codecInfo = getHlsCodecInfo(this.hls);\n this.sourceInfoFallbackService.applyAndStoreCodecInfo(playbackInfo, codecInfo);\n\n return playbackInfo;\n }\n\n /**\n * errorData: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data }\n * https://hls-js.netlify.com/api-docs/file/src/events.js.html#lineNumber98\n */\n onHlsError(errorName, errorData) {\n const isFatal = errorData ? errorData.fatal : true;\n if (isFatal) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n const errorMessage = errorData != null ? `${errorData.type}: ${errorData.details}` : undefined;\n this.eventCallback(Event.ERROR, {\n currentTime,\n code: this.getErrorCodeFromHlsErrorType(errorData.type),\n message: errorMessage,\n data: {},\n });\n }\n }\n\n onAudioTrackSwitched(_event: string, _data: AudioTrackSwitchedData) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime,\n });\n }\n\n onSubtitleLanguageSwitched(_event: string, _data: SubtitleTrackSwitchData) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime,\n });\n }\n\n private onDestroying = () => {\n this.eventCallback(Event.SOURCE_UNLOADED, {});\n this.release();\n };\n\n /**\n * returns mapped error code for Hlsjs ErrorTypes\n * @param type one of the ErrorTypes according to https://github.com/video-dev/hls.js/blob/v1.5.1/src/errors.ts#L1\n */\n private getErrorCodeFromHlsErrorType(type: string): number {\n switch (type) {\n case 'networkError':\n return 2;\n case 'mediaError':\n return 3;\n case 'keySystemError':\n return 4;\n case 'muxError':\n return 5;\n // default equals `otherError`\n default:\n return 1;\n }\n }\n\n private getSelectedAudioLanguage(): string | undefined {\n if (this.hls.audioTrack == null || this.hls.audioTrack < 0) {\n return undefined;\n }\n return (this.hls.audioTracks[this.hls.audioTrack] as any).lang;\n }\n\n private getSelectedSubtitleLanguage(): SubtitleInfo | undefined {\n // Check if function is supported (in latest hls version), otherwise use fallback option\n if (this.hls.subtitleDisplay != null) {\n const isSubtitleDisplayed = this.hls.subtitleTrack >= 0 && this.hls.subtitleDisplay === true;\n return {\n enabled: isSubtitleDisplayed,\n language: isSubtitleDisplayed ? this.hls.subtitleTracks[this.hls.subtitleTrack].lang : undefined,\n };\n } else {\n const {subtitleTrackController} = this.hls as any;\n if (subtitleTrackController != null && subtitleTrackController.media != null) {\n return this.getSelectedSubtitleFromMediaElement(subtitleTrackController.media);\n }\n }\n return undefined;\n }\n}\n\nexport const getHlsCodecInfo = (hls: Hls): CodecInfo | undefined => {\n const currentLevelObj = getHlsCurrentLevel(hls);\n if (!currentLevelObj) {\n return undefined;\n }\n\n return {\n videoCodec: currentLevelObj.videoCodec,\n audioCodec: currentLevelObj.audioCodec,\n };\n};\n\nexport const getHlsCurrentLevel = (hls: Hls): Level | undefined => {\n if (hls.levels == null || hls.levels.length === 0) {\n return undefined;\n }\n\n if (!isNumber(hls.currentLevel) || hls.currentLevel < 0) {\n return undefined;\n }\n\n return hls.levels[hls.currentLevel];\n};\n","import {DownloadSpeedMeter} from '../../../core/DownloadSpeedMeter';\n\nimport type {FragLoadedData} from './HlsJsPlayerTypes';\n\nexport class HlsSpeedMeterAdapter {\n private meter: DownloadSpeedMeter;\n\n constructor(hls: any, meter: DownloadSpeedMeter) {\n this.meter = meter;\n hls.on(hls.constructor.Events.FRAG_LOADED, (_eventName, data) => this.handleFragmentLoadedEvent(data));\n }\n\n getDownloadSpeedMeter(): DownloadSpeedMeter {\n return this.meter;\n }\n\n handleFragmentLoadedEvent(eventData: FragLoadedData) {\n if (eventData.frag.type !== 'main') {\n // ignore non-video fragments\n return;\n }\n\n const httpStatus =\n eventData.networkDetails != null ? (eventData.networkDetails as {status: number}).status : undefined;\n if (httpStatus == null) {\n // ignore fragments that https status is undefined (networkDetails are null)\n return;\n }\n\n const stats = eventData.frag.stats;\n const loadingDuration = (stats.loading.end - stats.loading.start) / 1000;\n const timeToFirstByte = (stats.loading.first - stats.loading.start) / 1000;\n\n const measurement = {\n duration: loadingDuration,\n size: stats.total,\n timeToFirstByte: timeToFirstByte,\n timestamp: new Date(),\n httpStatus,\n };\n\n this.meter.addMeasurement(measurement);\n }\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport {Event} from '../../enums/Event';\nimport {getMIMETypeFromFileExtension} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {getStreamTypeFromMIMEType} from '../../enums/StreamTypes';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {normalizeVideoDuration, PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {StreamSources} from '../../types/StreamSources';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\nimport {logger} from '../../utils/Logger';\nimport {isVideoInFullscreen} from '../../utils/Utils';\nimport {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport HTMLVideoElementStatisticsProvider from './player/HTMLVideoElementStatisticsProvider';\n\nexport abstract class HTML5InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n override get segments(): SegmentInfo[] {\n return [];\n }\n\n private static BUFFERING_TIMECHANGED_TIMEOUT = 1000;\n\n protected mediaElement: HTMLVideoElement | undefined;\n private mediaElementEventHandlers: Array<{event: string; handler: any}>;\n /** holds reference of original mediaElement.load */\n private mediaElementOriginalLoadFn?: () => void;\n\n readonly videoCompletionTracker: VideoCompletionTracker;\n protected needsFirstPlayIntent: boolean = true;\n private onBeforeUnLoadEvent = false;\n\n private bufferingTimeout?: number;\n private isBuffering: boolean = false;\n private isPaused: boolean = false;\n private isSeeking: boolean = false;\n /** Previous media element time in seconds */\n private previousMediaTimeInSeconds: number = 0;\n /** Previous client time in milliseconds */\n private previousClientTime: number;\n private needsReadyEvent: boolean;\n private previousMutedValue = false;\n private playerStatisticsProvider: HTMLVideoElementStatisticsProvider;\n\n protected constructor(mediaElement: HTMLVideoElement | undefined, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n\n this.mediaElement = mediaElement;\n this.mediaElementEventHandlers = [];\n this.mediaElementOriginalLoadFn = undefined;\n\n this.bufferingTimeout = undefined;\n this.isBuffering = false;\n this.isPaused = false;\n this.isSeeking = false;\n this.previousMediaTimeInSeconds = 0;\n this.previousClientTime = 0;\n this.needsReadyEvent = true;\n this.needsFirstPlayIntent = true;\n this.videoCompletionTracker = new VideoCompletionTracker();\n this.playerStatisticsProvider = new HTMLVideoElementStatisticsProvider(mediaElement);\n }\n\n override resetSourceRelatedState() {\n super.resetSourceRelatedState();\n this.playerStatisticsProvider.reset();\n this.needsFirstPlayIntent = true;\n this.isBuffering = false;\n this.isPaused = false;\n this.isSeeking = false;\n this.previousMediaTimeInSeconds = 0;\n clearTimeout(this.bufferingTimeout);\n }\n\n override release() {\n this.unregisterMediaElement();\n super.release();\n }\n\n getPlayerName = () => Player.HTML5;\n getPlayerTech = () => 'html5';\n getAutoPlay = () => (this.mediaElement ? this.mediaElement.autoplay : false);\n getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n initialize(_analytics: Analytics): Array> {\n if (this.mediaElement) {\n // calling `setMediaElement` with `null` argument on purpose to register all media element event\n // listeners with existing/already set media element during adapter initialization.\n this.setMediaElement();\n }\n this.registerWindowEvents();\n return [];\n }\n\n isLive = () => {\n if (!this.mediaElement || isNaN(this.mediaElement.duration)) {\n return undefined;\n }\n\n return this.mediaElement.duration === Infinity;\n };\n\n getStreamSources(url: string | undefined): StreamSources {\n if (!url) {\n return {};\n }\n const streamType = this.getStreamType();\n switch (streamType) {\n case 'hls':\n return {m3u8Url: url};\n case 'dash':\n return {mpdUrl: url};\n default:\n return {progUrl: url};\n }\n }\n\n getCurrentPlaybackInfo(): PlaybackInfo {\n let info: PlaybackInfo = {\n ...this.getCommonPlaybackInfo(),\n ...this.getStreamSources(this.getStreamURL()),\n isLive: this.isLive(),\n size: isVideoInFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n droppedFrames: this.playerStatisticsProvider.getDroppedFrames(),\n // TODO: Implement `audioBitrate`\n // TODO: Implement `isCasting`\n // TODO: Implement getting `videoTitle` from player (currently only from the analytics config)\n };\n\n if (this.mediaElement) {\n info = {\n ...info,\n videoDuration: normalizeVideoDuration(this.mediaElement.duration),\n isMuted: this.mediaElement.muted,\n videoWindowHeight: this.mediaElement.height,\n videoWindowWidth: this.mediaElement.width,\n };\n }\n\n const qualityInfo = this.getCurrentQualityLevelInfo();\n if (qualityInfo) {\n info = {\n ...info,\n videoPlaybackHeight: qualityInfo.height,\n videoPlaybackWidth: qualityInfo.width,\n videoBitrate: qualityInfo.bitrate,\n };\n }\n\n const streamFormat = this.getStreamType();\n if (streamFormat != null) {\n this.sourceInfoFallbackService.setStreamFormat(streamFormat);\n }\n\n this.sourceInfoFallbackService.applyStreamFormat(info);\n\n return info;\n }\n\n protected get currentTime(): number {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n return this.mediaElement.currentTime;\n }\n\n /**\n * Used to setup against the media element.\n * We need this method to desynchronize construction of this class\n * and the actual initialization against the media element.\n * That is because at construction some media engine\n * may not already have the media element attached, for example\n * when passing in the DOM element is happening at once with passing the source URL\n * and can not be decoupled.\n * We are then awaiting an event from the engine and calling this with the media element\n * as argument from our sub-class.\n *\n * This method can also be called without arguments and then it will perform\n * initialization against the existing media element (should only be called once, will throw an error otherwise)\n *\n * It can also be used to replace the element.\n *\n *\n */\n setMediaElement(mediaElement: HTMLVideoElement | null = null) {\n // if called with argument (new media element)\n if (mediaElement) {\n // if we already have one, we need to unregister current one before replacing it\n if (this.mediaElement) {\n this.unregisterMediaElement();\n }\n\n // set the new media element\n this.mediaElement = mediaElement;\n }\n\n // if called without argument (and that is feature of function),\n // we assume media element is already set and ready to be registered\n\n // ...if not, we throw an error\n if (!this.mediaElement) {\n throw new Error('No media element owned');\n }\n\n // ...if it was already registered, we throw an error\n if (this.mediaElementEventHandlers.length > 0) {\n throw new Error('Media element already set (only call this once)');\n }\n\n this.registerMediaElement();\n this.onMaybeReady();\n }\n\n abstract getPlayerVersion(): string;\n\n /**\n * Implemented by sub-class to deliver current quality-level info specific to media-engine.\n */\n abstract getCurrentQualityLevelInfo(): null | QualityLevelInfo;\n\n /**\n * Can be overriden by sub-classes\n * @returns {string}\n *\n */\n getMIMEType(): string | undefined {\n const streamUrl = this.getStreamURL();\n if (!streamUrl || streamUrl === undefined) {\n return;\n }\n return getMIMETypeFromFileExtension(streamUrl);\n }\n\n /**\n * Can be overriden by sub-classes\n * @returns {string}\n */\n getStreamType(): string | undefined {\n const mimetype = this.getMIMEType();\n if (mimetype) {\n return getStreamTypeFromMIMEType(mimetype);\n }\n\n return undefined;\n }\n\n /**\n * Can be overriden by subclasses.\n * @returns {string}\n */\n getStreamURL(): string | undefined {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n return mediaElement.src;\n }\n\n registerMediaElement() {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n // wrap the original Media Element `load` function\n this.mediaElementOriginalLoadFn = mediaElement.load;\n const originalLoad = this.mediaElementOriginalLoadFn;\n mediaElement.load = (...args: Parameters): void => {\n this.sourceChange({});\n originalLoad.apply(mediaElement, args);\n };\n\n this.listenToMediaElementEvent('loadstart', () => {\n log(`loadstart ${mediaElement.currentTime}`);\n this.sourceChange({});\n });\n\n this.listenToMediaElementEvent('loadedmetadata', () => {\n log(`loadedmetadata time:${mediaElement.currentTime} / readyState: ${mediaElement.readyState}`);\n\n // silent\n this.checkQualityLevelAttributes(true);\n\n // set streamFormat if possible,\n // loadedMetadata seems to be the first event where this could be available\n const streamFormat = this.getStreamType();\n if (streamFormat != null) {\n this.sourceInfoFallbackService.setStreamFormat(streamFormat);\n }\n\n if (this.mediaElement != null) {\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.mediaElement.duration);\n this.previousMutedValue = this.mediaElement.muted;\n }\n this.eventCallback(Event.SOURCE_LOADED, {});\n });\n\n // We need the PLAY event to indicate the intent to play\n // NOTE: use TIMECHANGED event on 'playing' and trigger PLAY as intended in states.dot graph\n this.listenToMediaElementEvent('play', () => {\n log(`play ${mediaElement.currentTime}`);\n const {currentTime} = mediaElement;\n\n this.needsFirstPlayIntent = false;\n\n this.eventCallback(Event.PLAY, {currentTime});\n });\n\n this.listenToMediaElementEvent('pause', () => {\n this.onPaused();\n });\n\n this.listenToMediaElementEvent('playing', () => {\n log(`playing ${mediaElement.currentTime}`);\n clearTimeout(this.bufferingTimeout);\n this.isPaused = false;\n\n // when the play attempt was before we have been attached to the player\n // no play event will set this to false -> collector is stuck in READY state\n this.needsFirstPlayIntent = false;\n });\n\n this.listenToMediaElementEvent('error', () => {\n const {currentTime, error} = mediaElement;\n this.eventCallback(Event.ERROR, {\n currentTime,\n // See https://developer.mozilla.org/en-US/docs/Web/API/MediaError\n code: error?.code ?? undefined,\n message: error?.message ?? undefined,\n data: {},\n });\n });\n\n this.listenToMediaElementEvent('volumechange', () => {\n const {muted, currentTime, volume} = mediaElement;\n const isMuted = this.isAudioMuted(muted, volume);\n\n if (this.previousMutedValue !== isMuted) {\n if (isMuted) {\n this.eventCallback(Event.MUTE, {currentTime});\n } else {\n this.eventCallback(Event.UN_MUTE, {currentTime});\n }\n this.previousMutedValue = isMuted;\n }\n });\n\n this.listenToMediaElementEvent('seeking', () => {\n log(`seeking ${mediaElement.currentTime}`);\n const {currentTime} = mediaElement;\n\n this.eventCallback(Event.SEEK, {currentTime});\n });\n\n this.listenToMediaElementEvent('seeked', () => {\n log(`seeked ${mediaElement.currentTime}`);\n const {currentTime} = mediaElement;\n\n clearTimeout(this.bufferingTimeout);\n\n this.eventCallback(Event.SEEKED, {currentTime});\n });\n\n this.listenToMediaElementEvent('timeupdate', () => {\n log(`timeupdate ${mediaElement.currentTime}`);\n const {currentTime} = mediaElement;\n\n this.isBuffering = false;\n this.isSeeking = false;\n\n // silence events if we have not yet intended play\n if (this.needsFirstPlayIntent) {\n return;\n }\n\n if (!this.isPaused) {\n this.eventCallback(Event.TIMECHANGED, {currentTime});\n }\n\n this.checkQualityLevelAttributes();\n\n this.checkSeeking();\n\n // We are doing this in case we can not rely\n // on the \"stalled\" or \"waiting\" events in a specific browser\n // and to detect intrinsinc paused states (when we do not get a paused event)\n // but the player is paused already before attach or is paused from initialization on.\n this.checkPlayheadProgress();\n\n this.previousMediaTimeInSeconds = currentTime;\n });\n\n // The stalled event is fired when the user agent is trying to fetch media data,\n // but data is unexpectedly not forthcoming.\n // https://developer.mozilla.org/en-US/docs/Web/Events/stalled\n this.listenToMediaElementEvent('stalled', () => {\n // this event doesn't indicate buffering by definition (interupted playback),\n // only that data throughput to playout buffers is not as high as expected\n // It happens on Chrome every once in a while as SourceBuffer's are not fed\n // as fast as the underlying native player may prefer (but it does not lead to\n // interuption).\n });\n\n // The waiting event is fired when playback has stopped because of a temporary lack of data.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/waiting\n this.listenToMediaElementEvent('waiting', () => {\n // we check here for seeking because a programmatically seek where just\n // the currentTime has been changed does not trigger a proper seek event\n log(`waiting ${mediaElement.currentTime}`);\n this.checkSeeking();\n this.onBuffering();\n });\n }\n\n /**\n * Should only be calld when a mediaElement is attached\n */\n listenToMediaElementEvent(event: any, handler: any) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const boundHandler = handler.bind(this);\n\n this.mediaElementEventHandlers.push({event, handler: boundHandler});\n this.mediaElement.addEventListener(event, boundHandler, false);\n }\n\n onMaybeReady() {\n if (!this.needsReadyEvent || !this.mediaElement) {\n return;\n }\n\n this.needsReadyEvent = false;\n\n this.getCurrentPlaybackInfo();\n\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.mediaElement.duration);\n }\n\n /**\n * unregister the mediaElement and removes it from the class\n * will also remove all references to this adapter instance (listener, interceptor)\n */\n protected unregisterMediaElement() {\n if (!this.mediaElement) {\n throw new Error('No media element attached');\n }\n\n const mediaElement = this.mediaElement;\n\n this.mediaElementEventHandlers.forEach((item: {event: string; handler: any}) => {\n mediaElement.removeEventListener(item.event, item.handler);\n });\n\n // assign the original load func to the html video element remove references to `this`\n const originalLoadFunc = this.mediaElementOriginalLoadFn;\n if (originalLoadFunc != null) {\n mediaElement.load = originalLoadFunc;\n }\n\n this.mediaElement = undefined;\n this.mediaElementEventHandlers = [];\n this.mediaElementOriginalLoadFn = undefined;\n\n // we can clear `checkPlayheadProgress` timout, as it is not needed anymore\n window.clearTimeout(this.bufferingTimeout);\n }\n\n onBuffering() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const {currentTime} = this.mediaElement;\n\n // this handler may be called multiple times\n // for one actual buffering-event occuring so lets guard from\n // triggering this event redundantly.\n if (this.isBuffering || (this.isPaused && !this.isSeeking)) {\n return;\n }\n\n if (this.isSeeking) {\n this.eventCallback(Event.SEEK, {currentTime});\n } else {\n this.eventCallback(Event.START_BUFFERING, {currentTime});\n }\n this.isBuffering = true;\n }\n\n onPaused(currentTime?: number) {\n if (this.isPaused) {\n return;\n }\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n if (!currentTime) {\n currentTime = this.mediaElement.currentTime;\n }\n\n this.eventCallback(Event.PAUSE, {currentTime});\n\n this.isPaused = true;\n }\n\n registerWindowEvents() {\n this.windowEventTracker.addEventListener('beforeunload', this.onPageClose.bind(this));\n this.windowEventTracker.addEventListener('unload', this.onPageClose.bind(this));\n }\n\n onPageClose() {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n const mediaElement = this.mediaElement;\n let currentTime: number | undefined;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n this.eventCallback(Event.UNLOAD, {currentTime});\n }\n this.release();\n }\n\n checkPlayheadProgress() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const mediaElement = this.mediaElement;\n if (mediaElement.paused) {\n this.onPaused();\n }\n\n clearTimeout(this.bufferingTimeout);\n\n this.bufferingTimeout = window.setTimeout(() => {\n if (mediaElement.paused || (mediaElement.ended && !this.isBuffering)) {\n return;\n }\n\n const timeDelta = mediaElement.currentTime - this.previousMediaTimeInSeconds;\n\n if (timeDelta < HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT) {\n this.onBuffering();\n }\n }, HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT);\n }\n\n checkQualityLevelAttributes(silent = false) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n const qualityLevelInfo = this.getCurrentQualityLevelInfo();\n if (!qualityLevelInfo) {\n return;\n }\n\n const {bitrate, width, height} = qualityLevelInfo;\n\n if (bitrate != null) {\n if (this.qualityChangeService.shouldAllowVideoQualityChange(bitrate)) {\n this.qualityChangeService.setVideoBitrate(bitrate);\n const eventData = {\n width,\n height,\n bitrate,\n currentTime: mediaElement.currentTime,\n };\n\n if (!silent) {\n this.eventCallback(Event.VIDEO_CHANGE, eventData);\n }\n } else {\n this.qualityChangeService.setVideoBitrate(bitrate);\n }\n }\n }\n\n sourceChange(config: AnalyticsConfig) {\n this.stateMachine.callManualSourceChangeEvent(config, this.mediaElement?.currentTime);\n }\n\n getSelectedSubtitleFromMediaElement(mediaElement: any): SubtitleInfo | undefined {\n if (mediaElement.textTracks == null) {\n return undefined;\n }\n const textTrackList = mediaElement.textTracks;\n for (const attr of textTrackList) {\n if (attr.mode != null && attr.mode === 'showing') {\n const isSubtitleDisplayed = attr.language != null && attr.language.length > 0;\n return {\n enabled: isSubtitleDisplayed,\n language: isSubtitleDisplayed ? attr.language : undefined,\n };\n }\n }\n return {\n enabled: false,\n };\n }\n\n /**\n * Method to detect seeking events on platforms where seeking events are not reliable\n * This code is currently called in timeUpdate event and waiting event.\n * - We can't rely on the `seeking` and 'seeked' events on certain platforms (Tizen, WebOs, Safari, etc.)\n * - Another limitation is that we cannot rely on the time update event to be fired in regular intervals\n * The time between two timeupdate events can be 1ms or 250ms for example. This code needs to handle this variance.\n */\n private checkSeeking() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const currentMediaTimeInSeconds = this.mediaElement.currentTime;\n // absolut difference of playback position compared with last call of method\n const playbackPositionDeltaInSeconds = Math.abs(currentMediaTimeInSeconds - this.previousMediaTimeInSeconds);\n\n // If the playback position has not changed more than 1 second we ignore it, to avoid\n // issuing of micro seeks. If not ignored the progressThreshold below might be too low, in order to\n // be reliable for such minor seeks. This is a tradeoff between overreporting and underreporting of seek events.\n if (playbackPositionDeltaInSeconds < 1) {\n this.previousClientTime = Date.now();\n return;\n }\n\n const currentClientTimeInMillis = Date.now();\n\n // Real time delta of method calls. How much time has passed since last call (in seconds)\n const clientTimeProgressInSeconds = (currentClientTimeInMillis - this.previousClientTime) / 1000;\n\n // we have to consider the playbackRate when calculating the threshold to trigger seeks\n // playbackRate of 3 progresses the playback triple the speed so the playbackPositionDelta\n // is also higher. This needs to be considered here\n // Adding 0.5 is a safety margin to avoid over reporting of seek events\n const thresholdModifier = this.mediaElement.playbackRate + 0.5;\n const progressThresholdInSeconds = clientTimeProgressInSeconds * thresholdModifier;\n\n // If the media time (current position of the playback) progresses much faster than real time\n // we consider this a time jump/seek\n if (playbackPositionDeltaInSeconds > progressThresholdInSeconds) {\n this.isSeeking = true;\n this.onPaused(this.previousMediaTimeInSeconds + clientTimeProgressInSeconds);\n }\n\n this.previousClientTime = Date.now();\n }\n}\n\nconst log = (msg: string) => {\n const msgTime = new Date().toISOString().substring(11);\n const prefix = `${msgTime}[HTML5InternalAdapter]`;\n const logMsg = `${prefix}: ${msg}`;\n logger.log(logMsg);\n};\n","import type {AdapterAPI, SessionMetadataAPI} from '../../api/AdapterAPI';\nimport {\n sanitizeSessionMetadataAudioLanguage,\n sanitizeSessionMetadataSubtitleEnabled,\n sanitizeSessionMetadataSubtitleLanguage,\n} from '../../api/adapterApiUtils';\nimport {Analytics} from '../../core/Analytics';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {HTMLVideoElementInternalAdapter} from './HTMLVideoElementInternalAdapter';\n\nexport class HTMLVideoElementAdapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(\n config: AnalyticsConfig,\n player: HTMLVideoElement,\n opts?: AnalyticsStateMachineOptions,\n // anonymous type for source metadata to not create any public named interface, until we stabilize the adapter API and provided typings\n sourceMetadata?: {\n audioCodec?: string;\n audioLanguage?: string;\n streamFormat?: string;\n videoCodec?: string;\n },\n ) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n this.internalAdapter = new HTMLVideoElementInternalAdapter(player, opts, sourceMetadata);\n this.analytics = Analytics.create(config, this.internalAdapter);\n }\n\n get sessionMetadata() {\n const internalAdapter = this.internalAdapter as HTMLVideoElementInternalAdapter;\n\n return {\n setAudioLanguage(audioLanguage: string) {\n internalAdapter.sessionData.audioLanguage = sanitizeSessionMetadataAudioLanguage(audioLanguage);\n },\n setSubtitleEnabled(enabled: boolean) {\n internalAdapter.sessionData.subtitleEnabled = sanitizeSessionMetadataSubtitleEnabled(enabled);\n },\n setSubtitleLanguage(subtitleLanguage: string) {\n internalAdapter.sessionData.subtitleLanguage = sanitizeSessionMetadataSubtitleLanguage(subtitleLanguage);\n },\n } satisfies SessionMetadataAPI;\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(\n config: AnalyticsConfig,\n /*\n * Custom implementation adds 2nd argument to support session data feature only on HTML5 for now.\n */\n sourceMetadata?: {\n audioCodec?: string;\n audioLanguage?: string;\n streamFormat?: string;\n videoCodec?: string;\n },\n ) {\n if (!isDefined(this.analytics)) return;\n if (!isDefined(this.internalAdapter)) return;\n\n this.analytics.sourceChange(config);\n\n const internalAdapter = this.internalAdapter as HTMLVideoElementInternalAdapter;\n internalAdapter.sessionData.streamFormat = sourceMetadata?.streamFormat;\n internalAdapter.sessionData.audioCodec = sourceMetadata?.audioCodec;\n internalAdapter.sessionData.videoCodec = sourceMetadata?.videoCodec;\n internalAdapter.sessionData.audioLanguage = sourceMetadata?.audioLanguage;\n }\n}\n","import {Player} from '../../enums/Player';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\n\nexport class HTMLVideoElementInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n sessionData: InternalHTML5SessionData = {};\n\n constructor(\n mediaElement: HTMLVideoElement,\n opts?: AnalyticsStateMachineOptions,\n sourceMetadata?: {\n audioCodec?: string;\n audioLanguage?: string;\n streamFormat?: string;\n videoCodec?: string;\n },\n ) {\n super(mediaElement, opts);\n\n // source metadata\n this.sessionData.streamFormat = sourceMetadata?.streamFormat;\n this.sessionData.audioCodec = sourceMetadata?.audioCodec;\n this.sessionData.videoCodec = sourceMetadata?.videoCodec;\n this.sessionData.audioLanguage = sourceMetadata?.audioLanguage;\n }\n\n override getPlayerName = () => Player.HTML5;\n\n getPlayerVersion = () => {\n // player version is set by ingress for html5 player, thus we only return empty string here\n return '';\n };\n\n override getStreamURL() {\n return this.mediaElement ? this.mediaElement.currentSrc : undefined;\n }\n\n getCurrentQualityLevelInfo(): null | QualityLevelInfo {\n return {\n bitrate: undefined,\n width: this.mediaElement ? this.mediaElement.videoWidth : undefined,\n height: this.mediaElement ? this.mediaElement.videoHeight : undefined,\n };\n }\n\n override getCurrentPlaybackInfo(): PlaybackInfo {\n const info = super.getCurrentPlaybackInfo();\n\n // source metadata\n info.streamFormat = this.sessionData.streamFormat ?? info.streamFormat;\n info.audioCodec = this.sessionData.audioCodec ?? info.audioCodec;\n info.videoCodec = this.sessionData.videoCodec ?? info.videoCodec;\n\n // language info\n info.subtitleEnabled = this.sessionData.subtitleEnabled ?? info.subtitleEnabled;\n // only set if enabled\n const subtitleLanguage = this.sessionData.subtitleLanguage ?? info.subtitleLanguage;\n info.subtitleLanguage = info.subtitleEnabled === true ? subtitleLanguage : undefined;\n\n info.audioLanguage = this.sessionData.audioLanguage ?? info.audioLanguage;\n\n return info;\n }\n\n override resetSourceRelatedState() {\n super.resetSourceRelatedState();\n this.sessionData = {};\n }\n}\n\n/** Represents the internal html5-only adapter state, holding the source and session metadata. */\ninterface InternalHTML5SessionData {\n streamFormat?: string;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: string;\n subtitleEnabled?: boolean;\n subtitleLanguage?: string;\n}\n","export default class HTMLVideoElementStatisticsProvider {\n private previousTotalDroppedFrames = 0;\n\n constructor(private videoElement: HTMLVideoElement | undefined) {}\n\n getDroppedFrames(): number {\n if (this.videoElement == undefined) {\n return 0;\n }\n\n // this API is not supported in all browsers (especially on iOS Safari it was added quite late)\n // reference: https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality\n if (this.videoElement.getVideoPlaybackQuality === undefined) {\n return 0;\n }\n\n const droppedFrames = this.videoElement.getVideoPlaybackQuality().droppedVideoFrames;\n const currentDroppedFrames = droppedFrames - this.previousTotalDroppedFrames;\n this.previousTotalDroppedFrames = droppedFrames;\n return currentDroppedFrames;\n }\n reset() {\n this.previousTotalDroppedFrames = 0;\n }\n}\n","import {AnalyticsStateMachine} from '../../analyticsStateMachines/AnalyticsStateMachine';\nimport {EventDispatcher} from '../../core/EventDispatcher';\nimport QualityChangeService from '../../core/QualityChangeService';\nimport {SourceInfoFallbackService} from '../../core/SourceInfoFallbackService';\nimport {SsaiService} from '../../core/ssai/SsaiService';\nimport {Event, EventMap} from '../../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {CustomDataValues} from '../../types/CustomDataValues';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {NoExtraProperties} from '../../types/NoExtraProperties';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {defaultStateMachineCallbacks, StateMachineCallbacks} from '../../types/StateMachineCallbacks';\nimport {logger} from '../../utils/Logger';\nimport {getCurrentTimestamp} from '../../utils/Utils';\nimport {WindowEventTracker} from '../../utils/WindowEventTracker';\n\nimport {EventCallbackDispatcher} from './EventCallbackDispatcher';\n\n/**\n * Audio volume below this delta is considered zero.\n */\nconst volumeDelta = 0.01;\n\nexport abstract class InternalAdapter implements EventCallbackDispatcher {\n readonly stateMachineCallbacks: StateMachineCallbacks = {...defaultStateMachineCallbacks};\n readonly qualityChangeService: QualityChangeService = new QualityChangeService();\n readonly ssaiService = new SsaiService();\n\n protected stateMachine!: AnalyticsStateMachine;\n protected opts: AnalyticsStateMachineOptions;\n protected _onLicenseKeyReceived: EventDispatcher<{licenseKey: string}> = new EventDispatcher();\n protected _onLicenseCallFailed: EventDispatcher = new EventDispatcher();\n\n protected sourceInfoFallbackService: SourceInfoFallbackService = new SourceInfoFallbackService();\n protected drmPerformanceInfo: DrmPerformanceInfo | undefined = undefined;\n protected abstract get currentTime(): number;\n\n private _windowEventTracker: WindowEventTracker = new WindowEventTracker();\n\n get windowEventTracker(): WindowEventTracker {\n return this._windowEventTracker;\n }\n\n get onLicenseKeyReceived() {\n return this._onLicenseKeyReceived;\n }\n\n get onLicenseCallFailed() {\n return this._onLicenseCallFailed;\n }\n\n get downloadSpeedInfo(): DownloadSpeedInfo {\n return {\n segmentsDownloadCount: 0,\n segmentsDownloadSize: 0,\n segmentsDownloadTime: 0,\n avgDownloadSpeed: 0,\n minDownloadSpeed: 0,\n maxDownloadSpeed: 0,\n avgTimeToFirstByte: 0,\n };\n }\n\n get segments(): SegmentInfo[] {\n return [];\n }\n\n constructor(opts?: AnalyticsStateMachineOptions) {\n if (!opts) {\n opts = {\n starttime: undefined,\n };\n }\n if (!opts.starttime) {\n opts.starttime = getCurrentTimestamp();\n }\n\n this.opts = opts;\n }\n\n release() {\n this.stateMachine.resetIntervals();\n this.stateMachineCallbacks.release();\n this.resetSourceRelatedState();\n this._windowEventTracker.release();\n }\n\n eventCallback = (\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties,\n ) => {\n eventObject = eventObject || {};\n if (!this.stateMachine) {\n logger.log(\"Bitmovin Analytics: StateMachine isn't ready yet\");\n } else {\n this.stateMachine.callEvent(eventType, eventObject, getCurrentTimestamp());\n }\n };\n\n getCommonPlaybackInfo() {\n let scale = 1;\n if (window.devicePixelRatio > 0) {\n scale = window.devicePixelRatio;\n }\n\n return {\n screenHeight: window.screen.height * scale,\n screenWidth: window.screen.width * scale,\n };\n }\n\n clearValues(): void {\n // noop by default\n }\n\n clearSegments(): void {\n // noop by default\n }\n\n resetSourceRelatedState(): void {\n this.sourceInfoFallbackService.reset();\n this.drmPerformanceInfo = undefined;\n }\n\n setCustomData(values: CustomDataValues): void {\n const previousState = this.stateMachine.currentState;\n\n if (\n this.stateMachine.currentState &&\n (this.stateMachine.currentState === 'PAUSE' || this.stateMachine.currentState === 'PLAYING')\n ) {\n this.eventCallback(Event.CUSTOM_DATA_CHANGE, {\n currentTime: this.currentTime,\n });\n this.eventCallback(Event[previousState], {\n values,\n currentTime: this.currentTime,\n });\n } else {\n this.stateMachineCallbacks.customdatachange(undefined, undefined, {values});\n }\n }\n\n protected isAudioMuted(playerIsMuted: boolean, currentVolume: number): boolean {\n return playerIsMuted || currentVolume < volumeDelta;\n }\n}\n","export class AdCallbacks {\n onAdStarted = (_event: any): void => undefined;\n onAdFinished = (_event: any): void => undefined;\n onAdBreakStarted = (_event: any): void => undefined;\n onAdBreakFinished = (_event: any): void => undefined;\n onAdClicked = (_event: any): void => undefined;\n onAdError = (_event: any): void => undefined;\n onAdManifestLoaded = (_event: any): void => undefined;\n onAdQuartile = (_event: any): void => undefined;\n onAdSkipped = (_event: any): void => undefined;\n onPlay = (_issuer?: string): void => undefined;\n onPause = (_issuer?: string): void => undefined;\n onBeforeUnload = (): void => undefined;\n}\n\nexport interface AdModuleAPI {\n readonly adCallbacks: AdCallbacks;\n isLinearAdActive: () => boolean;\n getContainer: () => HTMLElement;\n getAdModuleInfo: () => {name?: string; version?: string};\n currentTime: () => number;\n}\n","import type {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {ShakaInternalAdapter} from './ShakaInternalAdapter';\n\nexport class ShakaAdapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n this.internalAdapter = new ShakaInternalAdapter(player, opts);\n this.analytics = Analytics.create(config, this.internalAdapter);\n this.wrapPlayerLoad(player);\n }\n\n // The Shaka player's `load()` method does not trigger error events for exceptions thrown while loading the manifest.\n // Therefore, we wrap this method and catch exceptions and forward them to analytics.\n // TODO [AN-4149]: this needs to be reevaluated, since the cypress test with a none existing manifest is not working\n private wrapPlayerLoad(player: any) {\n const originalLoad = player.load;\n /**\n * Avoid passing `this` (the adapter reference) to an interceptor or its error handler.\n *\n * Reason:\n * Passing `this` can lead to memory leaks. When that shaka player is destroyed, it does not clean up the `player.load`\n * method, which we intercept. This leaves the old adapter and interceptor still referenced, even though the shaka player\n * has been destroyed. If a new adapter is then created for the same shaka player, a new interceptor will also be created.\n * This new interceptor will wrap the `player.load` method again, which was already wrapped by the previous adapter,\n * leading to unnecessary memory usage and potential memory leaks.\n */\n const thatInternalAdapter = this.internalAdapter as ShakaInternalAdapter;\n\n player.load = (...args) =>\n new Promise((resolve, reject) => {\n originalLoad\n .apply(player, args)\n .then((result) => resolve(result))\n .catch((error) => {\n const eventObject = {\n currentTime: 0,\n // See https://github.com/shaka-project/shaka-player/blob/main/lib/util/error.js\n code: error?.code ?? undefined,\n message: JSON.stringify({category: error?.category, severity: error?.severity}),\n data: {additionalData: JSON.stringify(error?.data)},\n };\n\n thatInternalAdapter.eventCallback(Event.ERROR, eventObject);\n\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(error);\n });\n });\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.sourceChange(config);\n }\n}\n","import type {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {StreamTypes} from '../../enums/StreamTypes';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport type {Feature} from '../../features/Feature';\nimport type {FeatureConfig} from '../../features/FeatureConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CodecInfo} from '../../types/CodecInfo';\nimport type {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport type {PlaybackInfo} from '../../types/PlaybackInfo';\nimport type {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {logger} from '../../utils/Logger';\nimport {HTML5InternalAdapter} from '../html5/HTML5InternalAdapter';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {ShakaPlayerEvent} from './shakaPlayerTypes';\n\nexport class ShakaInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(\n private player: any,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(player.getMediaElement(), opts);\n }\n\n override initialize(analytics: Analytics): Array> {\n super.initialize(analytics);\n let videoElement: HTMLVideoElement | undefined;\n try {\n // returns null if content was not loaded yet\n // @see https://shaka-player-demo.appspot.com/docs/api/shaka.Player.html#getMediaElement\n videoElement = this.player.getMediaElement();\n } catch (_e) {\n // no action needed, because we will throw error later in code, because of video element null check\n }\n\n if (videoElement != null) {\n this.setMediaElement(videoElement);\n } else {\n // if we don't have video/media element from shaka player during initialization (shaka behaviour:\n // it has not loaded content yet), we need to wait for the `media-source` state change event and\n // then try to get the media element.\n const handleOnStateChangeAndSetMediaElement = (event: {state: string}) => {\n if (event.state === 'media-source') {\n try {\n this.player.removeEventListener(ShakaPlayerEvent.ONSTATECHANGE, handleOnStateChangeAndSetMediaElement);\n this.setMediaElement(this.player.getMediaElement());\n } catch (e) {\n logger.errorMessageToUser(\n 'Something went wrong while getting underlying HTMLVideoElement. Not possible to attach adapter and initialize Bitmovin Analytics. Error: ',\n e,\n );\n this.release();\n }\n }\n };\n\n this.player.addEventListener(ShakaPlayerEvent.ONSTATECHANGE, handleOnStateChangeAndSetMediaElement);\n }\n\n // With shaka a qualitychange only triggers a rebuffering, so to catch a qualitychange in time, we need to check qualityinfo on bufferings as well.\n this.player.addEventListener(ShakaPlayerEvent.BUFFERING, (_) => {\n this.checkQualityLevelAttributes();\n });\n\n this.player.addEventListener(ShakaPlayerEvent.ONSTATECHANGE, (event: {state: string}) => {\n if (event.state === 'detach') {\n // Detach the player from the current media element. Leaves the player in a state where\n // it cannot play media, until it has been attached to something else.\n this.eventCallback(Event.UNLOAD, {});\n this.release();\n }\n });\n\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined,\n );\n return [errorDetailTracking];\n }\n\n override getPlayerName = () => Player.SHAKA;\n\n getPlayerVersion = () => this.player.constructor.version;\n\n override isLive = () => {\n return this.player ? this.player.isLive() : undefined;\n };\n\n override getCurrentPlaybackInfo(): PlaybackInfo {\n const playbackInfo: PlaybackInfo = {\n ...super.getCurrentPlaybackInfo(),\n };\n\n const codecInfo = getShakaCodecInfo(this.player);\n this.sourceInfoFallbackService.applyAndStoreCodecInfo(playbackInfo, codecInfo);\n\n return playbackInfo;\n }\n\n override getStreamType(): string | undefined {\n return getShakaStreamFormat(this.player);\n }\n\n override getStreamURL() {\n return this.player ? this.player.getAssetUri() : null;\n }\n\n override getCurrentQualityLevelInfo(): null | QualityLevelInfo {\n const variantTracks = this.player.getVariantTracks();\n\n const activeVideoTrack = variantTracks\n .filter((track: any) => track.active)\n .filter((track: any) => track.videoCodec || track.videoId !== undefined)[0];\n\n if (!activeVideoTrack) {\n // can only happen for audio-only streams\n return null;\n }\n\n const bitrate = activeVideoTrack.videoBandwidth || activeVideoTrack.bandwidth;\n const width = activeVideoTrack.width;\n const height = activeVideoTrack.height;\n\n return {\n bitrate: bitrate,\n width: width,\n height: height,\n };\n }\n}\n\nexport const getShakaCodecInfo = (player: any): CodecInfo | undefined => {\n const variantTracks = player.getVariantTracks();\n const activeTrack = variantTracks.find((track: any) => track.active);\n\n return {\n videoCodec: activeTrack?.videoCodec,\n audioCodec: activeTrack?.audioCodec,\n };\n};\n\n// https://shaka-player-demo.appspot.com/docs/api/shaka.Player.html#.LoadMode\nconst LOAD_MODE_SOURCE_EQUALS = 3;\n\nexport const getShakaStreamFormat = (player: any): string | undefined => {\n if (!player) {\n return undefined;\n }\n\n const manifestType = player.getManifestType()?.toLowerCase();\n if (manifestType === StreamTypes.dash) {\n return StreamTypes.dash;\n } else if (manifestType === StreamTypes.hls) {\n return StreamTypes.hls;\n }\n\n // Fallback to progressive if no manifest type is available.\n // In order to avoid over-reporting of progressive when the source is not loaded yet\n // (where getManifestType is also null similar to when a progressive source is used)\n // we check that the load mode is SRC_EQUALS which indicates native player usage\n // and make sure that the asset is already loaded through check if the uri is available\n if (manifestType == null && player.getLoadMode() === LOAD_MODE_SOURCE_EQUALS && player.getAssetUri() != null) {\n return StreamTypes.prog;\n }\n\n return undefined;\n};\n","/*!\n * This file was created because `shaka-player` npm package does not have good typescript definitions\n * @see https://github.com/shaka-project/shaka-player/issues/6442\n * Last time tested with `shaka-player@4.11.7`\n */\n\nexport const ShakaPlayerEvent = {\n /**\n * Fired when the player unloads or fails to load. Used by the Cast receiver to determine idle state.\n * @see https://shaka-player-demo.appspot.com/docs/api/shaka.Player.html#.event:UnloadingEvent\n */\n UNLOADING: 'unloading',\n /**\n * Fired when the player changes load states.\n * @see https://shaka-player-demo.appspot.com/docs/api/shaka.Player.html#.event:StateChangeEvent\n */\n ONSTATECHANGE: 'onstatechange',\n /**\n * Fired when player state is changed.\n * @see https://shaka-player-demo.appspot.com/docs/api/shaka.Player.html#.event:StateChanged\n */\n STATECHANGED: 'statechanged',\n /**\n * Fired when the player's buffering state changes.\n * @see https://shaka-player-demo.appspot.com/docs/api/shaka.Player.html#.event:BufferingEvent\n */\n BUFFERING: 'buffering',\n} as const;\n","import type {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport type {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport type {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport type {CustomDataValues} from '../../types/CustomDataValues';\nimport {logger} from '../../utils/Logger';\nimport {\n hasPlayerAlreadyBeenAugmented,\n isDefined,\n markPlayerInstanceAsAugmented,\n} from '../../utils/playerAugmentationUtils';\nimport {VERSION} from '../../Version';\nimport type {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nimport {VideojsInternalAdapter} from './VideojsInternalAdapter';\n\nexport class VideojsAdapter implements AdapterAPI {\n private readonly internalAdapter: InternalAdapterAPI | undefined;\n private readonly analytics: Analytics | undefined;\n\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n if (hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n markPlayerInstanceAsAugmented(player);\n\n this.internalAdapter = new VideojsInternalAdapter(player, opts);\n this.analytics = Analytics.create(config, this.internalAdapter);\n }\n\n static readonly version: string = VERSION;\n\n get version(): string {\n return VERSION;\n }\n\n getCurrentImpressionId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!isDefined(this.analytics)) return;\n\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!isDefined(this.internalAdapter)) return;\n\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!isDefined(this.analytics)) return;\n\n this.analytics.sourceChange(config);\n }\n}\n","import type {VideoJsPlayer} from 'video.js';\n\nimport {VideojsAnalyticsStateMachine} from '../../analyticsStateMachines/VideoJsAnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport * as CodecHelper from '../../enums/Codecs';\nimport {Event} from '../../enums/Event';\nimport {getMIMETypeFromFileExtension} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {getStreamTypeFromMIMEType} from '../../enums/StreamTypes';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {CodecInfo} from '../../types/CodecInfo';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {VideoChangeEvent} from '../../types/EventData';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {normalizeVideoDuration, PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {StreamSources} from '../../types/StreamSources';\nimport {isDifferentSubtitleInfo, SubtitleInfo} from '../../types/SubtitleInfo';\nimport {isBlank, isValidString} from '../../utils/stringUtils';\nimport {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\n// Declaration merging to extend the VideoJsPlayer interface.\n// @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html\ndeclare module 'video.js' {\n interface VideoJsPlayer {\n // Extend the VideoJsPlayer interface with missing `version` function, introduced in 8.10.0\n // by https://github.com/videojs/video.js/pull/8543/files, but not present in `@types/video.js@7.3.58` yet.\n //\n // Function set as nullable to be able to covert older VideoJs players\n //\n // see: https://github.com/videojs/video.js/blob/6fe68e5dad6853d8f0eaf45534873607c1b32277/src/js/player.js#L1345\n version?(): {'video.js': string};\n }\n}\nexport class VideojsInternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n readonly videoCompletionTracker: VideoCompletionTracker;\n\n private readonly player: VideoJsPlayer;\n\n private _subtitleInfo: SubtitleInfo = {enabled: false};\n private selectedAudioLanguage?: string;\n private onBeforeUnLoadEvent = false;\n private previousTime = 0;\n\n constructor(player: any, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.player = player;\n this.stateMachine = new VideojsAnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.videoCompletionTracker = new VideoCompletionTracker();\n }\n\n override resetSourceRelatedState() {\n super.resetSourceRelatedState();\n\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.player.duration());\n this.previousTime = 0;\n }\n\n initialize(analytics: Analytics): Array> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined,\n );\n return [errorDetailTracking];\n }\n\n getPlayerVersion = () => {\n // try to get the version from the player instance\n // - `VideoJsPlayer.version()` was introduced in 8.10.0, so we need to check for it\n const playerInstanceVersion = this.player.version?.()['video.js'];\n if (isValidString(playerInstanceVersion) && !isBlank(playerInstanceVersion)) {\n return playerInstanceVersion;\n }\n\n // try to get the version from the global `window.videojs.VERSION` (if npm module is used, it doesn't exist)\n const windowVideoJsVersion = window.videojs?.['VERSION'];\n if (isValidString(windowVideoJsVersion) && !isBlank(windowVideoJsVersion)) {\n return windowVideoJsVersion;\n }\n\n return 'unknown';\n };\n getPlayerName = () => Player.VIDEOJS;\n getPlayerTech = () => 'html5';\n getAutoPlay = () => this.player.autoplay() === true;\n getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n getStreamType(url: string) {\n let mimeType = getMIMETypeFromFileExtension(url);\n if (mimeType) {\n return getStreamTypeFromMIMEType(mimeType);\n }\n mimeType = this.player.currentType?.();\n if (mimeType) {\n return getStreamTypeFromMIMEType(mimeType);\n }\n\n return undefined;\n }\n\n // this seems very generic. one could put it in a helper\n // and use it in many adapter implementations.\n getStreamSources(url: string): StreamSources {\n const streamType = this.getStreamType(url);\n switch (streamType) {\n case 'hls':\n return {m3u8Url: url};\n case 'dash':\n return {mpdUrl: url};\n default:\n return {progUrl: url};\n }\n }\n\n getCurrentPlaybackInfo(): PlaybackInfo {\n this.selectedAudioLanguage = this.getSelectedAudioTrackLanguage(this.player);\n const codecInfo = this.getCodecInfo(this.player.tech({IWillNotUseThisInPlugins: true}));\n\n const info: PlaybackInfo = {\n ...this.getCommonPlaybackInfo(),\n ...this.getStreamSources(this.player.currentSrc()),\n streamFormat: this.getStreamType(this.player.currentSrc()),\n isLive: isNaN(this.player.duration()) ? undefined : this.player.duration() === Infinity,\n size: this.player.isFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isMuted: this.player.muted(),\n videoDuration: normalizeVideoDuration(this.player.duration()),\n videoWindowHeight: this.player.height(),\n videoWindowWidth: this.player.width(),\n videoPlaybackHeight: this.player.videoHeight(),\n videoPlaybackWidth: this.player.videoWidth(),\n audioLanguage: this.selectedAudioLanguage,\n subtitleEnabled: this._subtitleInfo.enabled,\n subtitleLanguage: this._subtitleInfo.language,\n videoCodec: codecInfo?.videoCodec,\n audioCodec: codecInfo?.audioCodec,\n droppedFrames: 0, // TODO\n // TODO audioBitrate:\n // TODO isCasting:\n // TODO videoTitle: (currently only from the analytics config)\n };\n\n const qualityInfo = this.getCurrentQualityLevelInfo();\n if (qualityInfo) {\n info.videoPlaybackWidth = qualityInfo.width ?? info.videoPlaybackWidth;\n info.videoPlaybackHeight = qualityInfo.height ?? info.videoPlaybackHeight;\n info.videoBitrate = qualityInfo.bitrate ?? info.videoBitrate;\n }\n\n return info;\n }\n\n getCurrentQualityLevelInfo(): null | QualityLevelInfo {\n return this.currentVideoJsQualityLevel();\n }\n\n register() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n\n // if one source is being played and we load new source and start playing it\n // we need to reset all session related data and initialize new session\n // videojs does not provide a way for figuring out when current source or player is unloaded\n // so we need to reset everything with \"manualSourceChange\" event every time new source is loaded\n this.player.on('loadstart', function (this: any) {\n that.eventCallback(Event.MANUAL_SOURCE_CHANGE, {config: {}});\n });\n this.player.on('loadedmetadata', function (this: any) {\n that.videoCompletionTracker.reset();\n that.videoCompletionTracker.setVideoDuration(this.duration());\n that.previousTime = 0;\n that.eventCallback(Event.SOURCE_LOADED, {});\n });\n this.player.ready(function (this: any) {\n that._subtitleInfo = that.getSubtitleInfo(this);\n that.eventCallback(Event.READY, {});\n });\n this.player.on('play', function (this: any) {\n that.eventCallback(Event.PLAY, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('pause', function (this: any) {\n if (!this.seeking()) {\n that.eventCallback(Event.PAUSE, {\n currentTime: this.currentTime(),\n });\n }\n });\n this.player.on('error', function (this: any) {\n const error: MediaError = this.error();\n that.eventCallback(Event.ERROR, {\n currentTime: this.currentTime(),\n code: error.code,\n message: error.message,\n data: {},\n });\n });\n this.player.on('volumechange', function (this: any) {\n const muted = this.muted();\n const volume = this.volume();\n const isMuted = that.isAudioMuted(muted, volume);\n\n if (this.previousMutedValue !== isMuted) {\n if (isMuted) {\n that.eventCallback(Event.MUTE, {\n currentTime: this.currentTime(),\n });\n } else {\n that.eventCallback(Event.UN_MUTE, {\n currentTime: this.currentTime(),\n });\n }\n this.previousMutedValue = isMuted;\n }\n });\n this.player.on('seeking', function (this: any) {\n that.eventCallback(Event.SEEK, {\n currentTime: that.previousTime != null ? that.previousTime : this.currentTime(),\n });\n });\n this.player.on('seeked', function (this: any) {\n that.eventCallback(Event.SEEKED, {\n currentTime: this.currentTime(),\n });\n });\n\n this.player.on('texttrackchange', function (this: any) {\n const newSubtitleInfo = that.getSubtitleInfo(this);\n const hasInfoChanged =\n that._subtitleInfo == null ? true : isDifferentSubtitleInfo(that._subtitleInfo, newSubtitleInfo);\n that._subtitleInfo = newSubtitleInfo;\n\n if (hasInfoChanged) {\n that.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime(),\n });\n }\n });\n\n const audioTracks = this.player.audioTracks();\n audioTracks.on('change', () => {\n const newSelectedAudioLanguage = that.getSelectedAudioTrackLanguage(that.player);\n if (newSelectedAudioLanguage != null && newSelectedAudioLanguage !== that.selectedAudioLanguage) {\n that.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: that.player.currentTime(),\n });\n }\n });\n\n this.player.on('stalled', function (this: any) {\n that.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('waiting', function (this: any) {\n that.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('timeupdate', function (this: any) {\n if (!this.seeking()) {\n that.previousTime = this.currentTime();\n }\n that.eventCallback(Event.TIMECHANGED, {\n currentTime: this.currentTime(),\n });\n\n const qualityInfo = that.currentVideoJsQualityLevel();\n if (qualityInfo?.height && qualityInfo?.width && qualityInfo?.bitrate) {\n if (that.qualityChangeService.shouldAllowVideoQualityChange(qualityInfo.bitrate)) {\n const eventObject: VideoChangeEvent = {\n bitrate: qualityInfo.bitrate,\n height: qualityInfo.height,\n width: qualityInfo.width,\n currentTime: this.currentTime(),\n };\n that.eventCallback(Event.VIDEO_CHANGE, eventObject);\n }\n that.qualityChangeService.setVideoBitrate(qualityInfo.bitrate);\n }\n });\n\n let handlePageClose = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n let currentTime: number | undefined;\n if (this.player != null) {\n currentTime = this.player.currentTime();\n }\n this.eventCallback(Event.UNLOAD, {\n currentTime,\n });\n }\n this.release();\n };\n\n handlePageClose = handlePageClose.bind(this);\n\n this.player.on('dispose', handlePageClose);\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n\n sourceChange(config: AnalyticsConfig) {\n this.stateMachine.callManualSourceChangeEvent(config, this.currentTime);\n }\n\n protected get currentTime(): number {\n return this.player.currentTime();\n }\n\n private getSelectedAudioTrackLanguage(player: any): string | undefined {\n for (const track of player.audioTracks()) {\n if (track.enabled) {\n return track.language;\n }\n }\n return undefined;\n }\n\n private getSubtitleInfo(player: any): SubtitleInfo {\n const textTracks = player.textTracks() || [];\n let enabled = false;\n let language;\n for (const track of textTracks) {\n if (track.mode === 'showing') {\n enabled = true;\n language = track.language;\n break;\n }\n }\n return {\n enabled,\n language,\n };\n }\n\n private currentVideoJsQualityLevel(): null | QualityLevelInfo {\n // Check for HLS source-handler (http-streaming)\n // When we just use Videojs without any specific source-handler (not using MSE API based engine)\n // but just native technology (HTML5/Flash) to do for example \"progressive download\" with plain Webm/Mp4\n // or use native HLS on Safari this may not be present. In that case Videojs is just\n // a wrapper around the respective playback tech (HTML or Flash).\n const tech = this.player.tech({IWillNotUseThisInPlugins: true}) as any;\n\n if (tech == null) {\n return null;\n }\n\n if (tech.vhs == null && tech.hls == null) {\n return null;\n }\n\n const mediaAttributes = this.getMediaAttributes(tech);\n\n if (!mediaAttributes || !mediaAttributes.bitrate) {\n return null;\n }\n\n return {\n bitrate: mediaAttributes.bitrate,\n width: mediaAttributes.width,\n height: mediaAttributes.height,\n };\n }\n\n // more detailed info from segment can be obtained using\n // https://github.com/videojs/http-streaming#segment-metadata\n // but some properties are not available in older videojs versions\n private getMediaAttributes(playerTech: any): MediaAttributes | undefined {\n if (!playerTech) {\n return;\n }\n\n // From here we are going onto Videojs-HLS source-handler specific API\n let sourceHandler;\n if (playerTech.vhs) {\n sourceHandler = playerTech.vhs;\n } else if (playerTech.hls) {\n // older videojs versions don't have vhs property\n sourceHandler = playerTech.hls;\n }\n\n // Maybe we have the HLS source-handler initialized, but it is\n // not actually activated and used (just wrapping HTML5 built-in HLS playback like in Safari)\n if (!sourceHandler || !sourceHandler.playlists || typeof sourceHandler.playlists.media !== 'function') {\n return;\n }\n\n // Check for current media playlist\n const selectedPlaylist = sourceHandler.playlists.media();\n\n if (!selectedPlaylist) {\n return;\n }\n\n const {attributes} = selectedPlaylist;\n\n if (!attributes || Object.keys(attributes).length === 0) {\n return;\n }\n\n return {\n bitrate: attributes.BANDWIDTH,\n width: (attributes.RESOLUTION || {}).width,\n height: (attributes.RESOLUTION || {}).height,\n codecs: attributes.CODECS,\n };\n }\n\n private getCodecInfo(playerTech: any): CodecInfo | undefined {\n const mediaAttributes = this.getMediaAttributes(playerTech);\n\n if (!mediaAttributes || !mediaAttributes.codecs) {\n return;\n }\n\n const codecs = mediaAttributes.codecs.split(',');\n\n if (!codecs) {\n return;\n }\n\n return {\n videoCodec: codecs.find((codec: string) => CodecHelper.isVideoCodec(codec)),\n audioCodec: codecs.find((codec: string) => CodecHelper.isAudioCodec(codec)),\n };\n }\n}\n\nexport interface MediaAttributes {\n codecs: string | undefined;\n bitrate: number | undefined;\n width: number | undefined;\n height: number | undefined;\n}\n","import {ErrorCode} from '../enums/ErrorCode';\nimport {Event, EventMap} from '../enums/Event';\nimport {VideoStartFailedReason} from '../enums/VideoStartFailedReason';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport * as ErrorData from '../types/EventData';\nimport {AnalyticsEventBase} from '../types/EventData';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport * as Settings from '../utils/Settings';\nimport * as Utils from '../utils/Utils';\n\nconst REBUFFERING_HEARTBEAT_INTERVALS = [3000, 5000, 10000, 30000, 59700];\n\nexport abstract class AnalyticsStateMachine {\n protected stateMachine: StateMachine.StateMachine & {[key: string]: any};\n protected onEnterStateTimestamp = 0;\n\n protected readonly videoStartupTimeoutMs: number = Settings.ANALYTICS_VIDEOSTART_TIMEOUT;\n protected readonly rebufferTimeoutMs: number = Settings.ANALYTICS_REBUFFER_TIMEOUT;\n\n private rebufferingHeartbeatIntervalHandle?: number;\n private currentRebufferingIntervalIndex = 0;\n private rebufferingTimeoutHandle?: number;\n private videoStartTimeout?: number;\n\n constructor(\n protected stateMachineCallbacks: StateMachineCallbacks,\n opts: AnalyticsStateMachineOptions,\n ) {\n this.stateMachine = this.createStateMachine(opts);\n }\n\n abstract createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine;\n\n abstract callEvent(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties,\n timestamp: number,\n ): void;\n\n /**\n * Sends out sample because of SSAI interaction\n *\n * @param timestamp current timestamp\n * @param eventObject contains player information\n */\n abstract onSsaiPlaybackInteraction(timestamp: number, eventObject: AnalyticsEventBase): void;\n\n callManualSourceChangeEvent(analyticsConfig: AnalyticsConfig, playbackCurrentTimeInSeconds?: number) {\n this.callEvent(\n Event.MANUAL_SOURCE_CHANGE,\n {config: analyticsConfig, currentTime: playbackCurrentTimeInSeconds},\n Date.now(),\n );\n }\n\n get currentState(): string {\n return this.stateMachine.current;\n }\n\n resetIntervals() {\n this.clearVideoStartTimeout();\n this.clearRebufferingTimeoutHandle(true);\n this.clearRebufferingHeartbeatHandle();\n }\n\n //#region rebuffer timeout\n\n protected startRebufferingHeartbeatInterval(reset = true) {\n this.resetRebufferingHelpers(reset);\n\n this.startRebufferingTimeoutHandle();\n\n this.rebufferingHeartbeatIntervalHandle = window.setInterval(() => {\n if (this.stateMachine.current.toLowerCase() !== 'rebuffering') {\n this.resetRebufferingHelpers();\n return;\n }\n const timestamp = new Date().getTime();\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n this.stateMachineCallbacks.heartbeat(stateDuration, this.stateMachine.current.toLowerCase(), {\n buffered: stateDuration,\n });\n this.onEnterStateTimestamp = timestamp;\n this.currentRebufferingIntervalIndex = Math.min(\n this.currentRebufferingIntervalIndex + 1,\n REBUFFERING_HEARTBEAT_INTERVALS.length - 1,\n );\n this.startRebufferingHeartbeatInterval(false);\n }, REBUFFERING_HEARTBEAT_INTERVALS[this.currentRebufferingIntervalIndex]);\n }\n\n protected resetRebufferingHelpers(reset = true) {\n if (reset) {\n this.currentRebufferingIntervalIndex = 0;\n }\n this.clearRebufferingHeartbeatHandle();\n this.clearRebufferingTimeoutHandle(reset);\n }\n\n protected clearRebufferingHeartbeatHandle() {\n if (this.rebufferingHeartbeatIntervalHandle != null) {\n window.clearInterval(this.rebufferingHeartbeatIntervalHandle);\n this.rebufferingHeartbeatIntervalHandle = undefined;\n }\n }\n\n private startRebufferingTimeoutHandle() {\n if (this.currentRebufferingIntervalIndex > 0) {\n return;\n }\n this.rebufferingTimeoutHandle = window.setTimeout(() => {\n this.callEvent(\n Event.ERROR,\n {\n ...ErrorCode.BUFFERING_TIMEOUT_REACHED,\n data: {\n additionalData: `StateMachine timed out after ${this.rebufferTimeoutMs} ms of consecutive buffering.`,\n },\n },\n Utils.getCurrentTimestamp(),\n );\n this.stateMachineCallbacks.release();\n }, this.rebufferTimeoutMs);\n }\n\n protected clearRebufferingTimeoutHandle(reset: boolean) {\n if (reset && this.rebufferingTimeoutHandle != null) {\n window.clearTimeout(this.rebufferingTimeoutHandle);\n this.rebufferingTimeoutHandle = undefined;\n }\n }\n //#endregion\n\n //#region videoStartupFailed\n\n protected getVideoStartupFailedEventData(currentTime: number, event?: string, _eventObject?: any) {\n const reason = this.getReasonForVideoStartFailure(event);\n const eventData: ErrorData.VideoStartFailedEvent = {currentTime, reason};\n return eventData;\n }\n\n protected getReasonForVideoStartFailure(event?: string) {\n switch (event) {\n case Event.ERROR:\n return VideoStartFailedReason.PLAYER_ERROR;\n case Event.UNLOAD:\n return VideoStartFailedReason.PAGE_CLOSED;\n case Event.VIDEOSTART_TIMEOUT:\n return VideoStartFailedReason.TIMEOUT;\n default:\n return VideoStartFailedReason.UNKNOWN;\n }\n }\n\n protected setVideoStartTimeout() {\n if (this.videoStartTimeout != null) {\n this.clearVideoStartTimeout();\n }\n this.videoStartTimeout = window.setTimeout(() => {\n this.callEvent(Event.VIDEOSTART_TIMEOUT, {}, Utils.getCurrentTimestamp());\n this.stateMachineCallbacks.release();\n }, this.videoStartupTimeoutMs);\n }\n\n protected clearVideoStartTimeout() {\n window.clearTimeout(this.videoStartTimeout);\n this.videoStartTimeout = undefined;\n }\n //#endregion\n}\n","import * as StateMachine from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {AnalyticsEventBase} from '../types/EventData';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\n\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\nimport {\n createHeartbeatPayload,\n customStateMachineErrorCallback,\n logMissingCallbackWarning,\n on,\n} from './stateMachineUtils';\n\nenum State {\n AD = 'AD',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n CASTING = 'CASTING',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n END = 'END',\n ERROR = 'ERROR',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n MUTING_PAUSE = 'MUTING_PAUSE',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_READY = 'MUTING_READY',\n PAUSE = 'PAUSE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAYING = 'PLAYING',\n QUALITYCHANGE = 'QUALITYCHANGE',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n READY = 'READY',\n REBUFFERING = 'REBUFFERING',\n SETUP = 'SETUP',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n STARTUP = 'STARTUP',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n}\n\nexport class HTML5AnalyticsStateMachine extends AnalyticsStateMachine {\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n\n this.createStateMachine(opts);\n }\n\n getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n getAllStatesBut(states: string[]) {\n return this.getAllStates().filter((i) => states.indexOf(i) < 0);\n }\n\n override createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.SETUP,\n error: customStateMachineErrorCallback,\n events: [\n // Player initialization\n {name: Event.MANUAL_SOURCE_CHANGE, from: State.SETUP, to: State.READY},\n on(Event.TIMECHANGED).stayIn(State.SETUP),\n on(Event.SOURCE_LOADED).stayIn(State.READY),\n\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n // play attempt during sourceChanging\n {name: Event.PLAY, from: State.SOURCE_CHANGING, to: State.STARTUP},\n\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n // when we have autoplay we will receive souceLoaded after we enter STARTUP state\n on(Event.SOURCE_LOADED).stayIn(State.STARTUP),\n on(Event.START_BUFFERING).stayIn(State.STARTUP),\n on(Event.END_BUFFERING).stayIn(State.STARTUP),\n on(Event.VIDEO_CHANGE).stayIn(State.STARTUP),\n on(Event.AUDIO_CHANGE).stayIn(State.STARTUP),\n\n {name: Event.TIMECHANGED, from: State.READY, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n on(Event.TIMECHANGED).stayIn(State.PLAYING),\n\n on(Event.SEEKED).stayIn(State.PAUSE),\n\n on(Event.END_BUFFERING).stayIn(State.PLAYING),\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n on(Event.START_BUFFERING).stayIn(State.REBUFFERING),\n\n {name: Event.PLAY, from: State.REBUFFERING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n on(Event.SEEK).stayIn(State.STARTUP),\n on(Event.PLAY).stayIn(State.PAUSED_SEEKING),\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE),\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE_PAUSE),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE_PAUSE),\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n on(Event.SEEK).stayIn(State.PAUSED_SEEKING),\n on(Event.AUDIO_CHANGE).stayIn(State.PAUSED_SEEKING),\n on(Event.VIDEO_CHANGE).stayIn(State.PAUSED_SEEKING),\n on(Event.START_BUFFERING).stayIn(State.PAUSED_SEEKING),\n on(Event.END_BUFFERING).stayIn(State.PAUSED_SEEKING),\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.TIMECHANGED, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n on(Event.PAUSE).stayIn(State.END),\n on(Event.SEEK).stayIn(State.END),\n on(Event.SEEKED).stayIn(State.END),\n on(Event.TIMECHANGED).stayIn(State.END),\n on(Event.END_BUFFERING).stayIn(State.END),\n on(Event.START_BUFFERING).stayIn(State.END),\n on(Event.END).stayIn(State.END),\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n on(Event.SEEKED).stayIn(State.PLAYING),\n on(Event.SEEK).stayIn(State.PLAYING),\n\n {name: Event.PLAY, from: State.END, to: State.PLAYING},\n\n {name: Event.ERROR, from: this.getAllStatesBut([State.STARTUP]), to: State.ERROR},\n {name: Event.PAUSE, from: State.ERROR, to: State.ERROR},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut([State.STARTUP]), to: State.END},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n\n on(Event.SUBTITLE_CHANGE).stayIn(State.PAUSE),\n on(Event.SUBTITLE_CHANGE).stayIn(State.READY),\n on(Event.SUBTITLE_CHANGE).stayIn(State.STARTUP),\n on(Event.SUBTITLE_CHANGE).stayIn(State.REBUFFERING),\n on(Event.SUBTITLE_CHANGE).stayIn(State.SUBTITLE_CHANGING),\n\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.PAUSE),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.READY),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.STARTUP),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.REBUFFERING),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.AUDIOTRACK_CHANGING),\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE], to: State.CASTING},\n on(Event.PAUSE).stayIn(State.CASTING),\n on(Event.PLAY).stayIn(State.CASTING),\n on(Event.TIMECHANGED).stayIn(State.CASTING),\n on(Event.MUTE).stayIn(State.CASTING),\n on(Event.SEEK).stayIn(State.CASTING),\n on(Event.SEEKED).stayIn(State.CASTING),\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n on(Event.SEEK).stayIn(State.READY),\n on(Event.SEEKED).stayIn(State.READY),\n on(Event.SEEKED).stayIn(State.STARTUP),\n\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStatesBut([State.SETUP]), to: State.SOURCE_CHANGING},\n {name: Event.SOURCE_LOADED, from: State.SOURCE_CHANGING, to: State.READY},\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n\n on(Event.TIMECHANGED).stayIn(State.SOURCE_CHANGING),\n on(Event.PAUSE).stayIn(State.SOURCE_CHANGING),\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE_REBUFFERING),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE_REBUFFERING),\n {name: 'FINISH_QUALITYCHANGE_REBUFFERING', from: State.QUALITYCHANGE_REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n\n {name: Event.PLAYLIST_TRANSITION, from: this.getAllStates(), to: State.READY},\n ],\n callbacks: {\n [`onenter${State.SOURCE_CHANGING}`]: (event, _from, _to, _timestamp, eventObject) => {\n if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n },\n [`onenter${State.STARTUP}`]: (_event, _from, _to, _timestamp, _eventObject) => {\n this.setVideoStartTimeout();\n },\n\n onenterstate: (event, from, to, timestamp, eventObject) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || Utils.getCurrentTimestamp();\n }\n\n logger.log(\n `[ENTER ${timestamp}] ${padRight(to, 20)} EVENT: ${padRight(event, 20)} from: ${padRight(from, 14)}`,\n );\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onafterevent: (event, from, to, timestamp, eventObject) => {\n if (event === Event.PLAYLIST_TRANSITION) {\n this.stateMachineCallbacks.playlistTransition(eventObject);\n }\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n [`onleave${State.STARTUP}`]: (_event, _from, _to, _timestamp, _eventObject) => {\n this.clearVideoStartTimeout();\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n\n // player errors will be sent via eventCallback() -> callEvent() -> onPlayerError() function chain\n // if then sourceChange is called same error will be sent second time\n if (from === State.ERROR && (event === Event.MANUAL_SOURCE_CHANGE || event === Event.SOURCE_UNLOADED)) {\n return;\n }\n\n logger.log(\n `[LEAVE ${timestamp}] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to: ${padRight(to, 20)}`,\n );\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.PAUSED_SEEKING) {\n this.stateMachineCallbacks[fnName](stateDuration, fnName, eventObject);\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n logMissingCallbackWarning(from, [State.READY, State.SOURCE_CHANGING]);\n }\n }\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n }\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.onHeartbeat(timestamp, stateDuration, String(from).toLowerCase(), eventObject);\n }\n },\n\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n /**\n * wraps up the current measurement by progressing with the timestamp and video position\n * also callback heartbeat is called (sending our sample)\n *\n * This only works for PLAYING States.\n * Heartbeat for REBUFFERING is covered in super class.\n *\n * @param timestamp event time timestamp\n * @param duration of the heartbeat\n * @param state we are in\n * @param eventData\n */\n private onHeartbeat(timestamp: number, duration: number, state: string, eventData: AnalyticsEventBase) {\n const isHeartbeatAllowed = this.currentState == State.PLAYING;\n if (!isHeartbeatAllowed) {\n return;\n }\n\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventData);\n\n const payload = createHeartbeatPayload(duration, state as Lowercase);\n this.stateMachineCallbacks.heartbeat(duration, state, payload);\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventData);\n }\n\n override callEvent(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties,\n timestamp: number,\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n exec.call(this.stateMachine, timestamp, eventObject);\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n override onSsaiPlaybackInteraction(_timestamp: number, _eventObject: AnalyticsEventBase): void {\n // TODO: [AN-4076] Implement SSAI ad handling for html players\n }\n}\n","import * as StateMachine from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {AnalyticsEventBase} from '../types/EventData';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\n\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\nimport {customStateMachineErrorCallback, logMissingCallbackWarning, on} from './stateMachineUtils';\n\nenum State {\n AD = 'AD',\n AUDIOTRACK_CHANGED_PLAYING = 'AUDIOTRACK_CHANGED_PLAYING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n CASTING = 'CASTING',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n END = 'END',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n ERROR = 'ERROR',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n MUTING_PAUSE = 'MUTING_PAUSE',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_READY = 'MUTING_READY',\n PAUSE = 'PAUSE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAY_SEEKING = 'PLAY_SEEKING',\n PLAYING = 'PLAYING',\n QUALITYCHANGE = 'QUALITYCHANGE',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n READY = 'READY',\n REBUFFERING = 'REBUFFERING',\n SETUP = 'SETUP',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n STARTUP = 'STARTUP',\n SUBTITLE_CHANGED_PLAYING = 'SUBTITLE_CHANGED_PLAYING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n}\n\nexport class VideojsAnalyticsStateMachine extends AnalyticsStateMachine {\n private seekTimestamp: number;\n private seekedTimestamp: number;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n }\n\n getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_PLAY_SEEKING',\n 'PLAY_SEEK',\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n getAllStatesBut(state: string) {\n return this.getAllStates().filter((i) => i !== state);\n }\n\n override createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.SETUP,\n error: customStateMachineErrorCallback,\n events: [\n {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\n on(Event.TIMECHANGED).stayIn(State.SETUP),\n on(Event.SOURCE_LOADED).stayIn(State.READY),\n {name: Event.READY, from: [State.SETUP, State.ERROR], to: State.READY},\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n on(Event.START_BUFFERING).stayIn(State.STARTUP),\n on(Event.END_BUFFERING).stayIn(State.STARTUP),\n on(Event.VIDEO_CHANGE).stayIn(State.STARTUP),\n on(Event.AUDIO_CHANGE).stayIn(State.STARTUP),\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n\n on(Event.TIMECHANGED).stayIn(State.PLAYING),\n on(Event.END_BUFFERING).stayIn(State.PLAYING),\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n on(Event.START_BUFFERING).stayIn(State.REBUFFERING),\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n on(Event.SEEK).stayIn(State.STARTUP),\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n on(Event.TIMECHANGED).stayIn(State.PLAY_SEEKING),\n on(Event.TIMECHANGED).stayIn(State.PAUSED_SEEKING),\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n on(Event.TIMECHANGED).stayIn(State.PAUSE),\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE),\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE_PAUSE),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE_PAUSE),\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n on(Event.SEEK).stayIn(State.PAUSED_SEEKING),\n on(Event.AUDIO_CHANGE).stayIn(State.PAUSED_SEEKING),\n on(Event.VIDEO_CHANGE).stayIn(State.PAUSED_SEEKING),\n on(Event.START_BUFFERING).stayIn(State.PAUSED_SEEKING),\n on(Event.END_BUFFERING).stayIn(State.PAUSED_SEEKING),\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: 'PLAY_SEEK', from: State.PAUSE, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PAUSED_SEEKING, to: State.PLAY_SEEKING},\n on('PLAY_SEEK').stayIn(State.PLAY_SEEKING),\n on(Event.SEEK).stayIn(State.PLAY_SEEKING),\n on(Event.AUDIO_CHANGE).stayIn(State.PLAY_SEEKING),\n on(Event.VIDEO_CHANGE).stayIn(State.PLAY_SEEKING),\n on(Event.START_BUFFERING).stayIn(State.PLAY_SEEKING),\n on(Event.END_BUFFERING).stayIn(State.PLAY_SEEKING),\n on(Event.SEEKED).stayIn(State.PLAY_SEEKING),\n\n // We are ending the seek\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n on(Event.START_BUFFERING).stayIn(State.END_PLAY_SEEKING),\n on(Event.END_BUFFERING).stayIn(State.END_PLAY_SEEKING),\n on(Event.SEEKED).stayIn(State.END_PLAY_SEEKING),\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n on(Event.SEEK).stayIn(State.END),\n on(Event.SEEKED).stayIn(State.END),\n on(Event.TIMECHANGED).stayIn(State.END),\n on(Event.END_BUFFERING).stayIn(State.END),\n on(Event.START_BUFFERING).stayIn(State.END),\n on(Event.END).stayIn(State.END),\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n on(Event.SEEKED).stayIn(State.PLAYING),\n\n {name: Event.PLAY, from: State.END, to: State.PLAYING},\n\n {name: Event.ERROR, from: this.getAllStatesBut(State.STARTUP), to: State.ERROR},\n {name: Event.PAUSE, from: State.ERROR, to: State.ERROR},\n\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: 'FINISH_PLAY_SEEKING', from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut(State.STARTUP), to: State.END},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n // in scenario, where VideoJS player is initialized with `muted: true` option, VideoJS player\n // triggers PlayerEvent `volumechange` before PlayerEvent `ready`\n on(Event.MUTE).stayIn(State.SETUP),\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE], to: State.CASTING},\n on(Event.PAUSE).stayIn(State.CASTING),\n on(Event.PLAY).stayIn(State.CASTING),\n on(Event.TIMECHANGED).stayIn(State.CASTING),\n on(Event.MUTE).stayIn(State.CASTING),\n on(Event.SEEK).stayIn(State.CASTING),\n on(Event.SEEKED).stayIn(State.CASTING),\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n on(Event.SEEK).stayIn(State.READY),\n on(Event.SEEKED).stayIn(State.READY),\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGED_PLAYING},\n {name: 'FINISH_AUDIOTRACK_CHANGING', from: State.AUDIOTRACK_CHANGED_PLAYING, to: State.PLAYING},\n // States which should ignore audioTrack changes\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.PAUSE),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.READY),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.REBUFFERING),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.END_PLAY_SEEKING),\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGED_PLAYING},\n {name: 'FINISH_SUBTITLE_CHANGING', from: State.SUBTITLE_CHANGED_PLAYING, to: State.PLAYING},\n // States which should ignore subtitle changes\n on(Event.SUBTITLE_CHANGE).stayIn(State.PAUSE),\n on(Event.SUBTITLE_CHANGE).stayIn(State.READY),\n on(Event.SUBTITLE_CHANGE).stayIn(State.REBUFFERING),\n on(Event.SUBTITLE_CHANGE).stayIn(State.END_PLAY_SEEKING),\n on(Event.SUBTITLE_CHANGE).stayIn(State.SOURCE_CHANGING),\n on(Event.SUBTITLE_CHANGE).stayIn(State.SUBTITLE_CHANGING),\n\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStatesBut(State.READY), to: State.SOURCE_CHANGING},\n on(Event.MANUAL_SOURCE_CHANGE).stayIn(State.READY),\n on(Event.MANUAL_SOURCE_CHANGE).stayIn(State.SETUP),\n on(Event.TIMECHANGED).stayIn(State.SOURCE_CHANGING),\n\n // Context: videojs `play()` can be called before source is loaded\n //\n // This means that we should transition to STARTUP state already, even while source is still loading,\n // to be able to measure the startup time correctly. Because once video is loaded, it will start playing\n // and player event 'timeupdate' will be emitted.\n //\n // If we would not do this state transition, player event 'loadedmetadata' (SOURCE_LOADED) would move us\n // to READY state, which would be incorrect, because:\n // - the most important, we would not be able to measure the time from play() to first frame as startup time\n // - we would be stuck in READY state, and not able to move to state PLAYING, on emitted player event\n // 'timeupdate', because such transition doesn't exist in the state machine (STARTUP state is required)\n {name: Event.PLAY, from: State.SOURCE_CHANGING, to: State.STARTUP},\n // Context: videojs `play()` can be called before source is loaded\n //\n // This means that when source is loaded, and `play()` was already called, so we are in STARTUP state and\n // measuring startup time, we should stay in STARTUP state, because player event 'timeupdate' will be emitted,\n // and it will move us to PLAYING state later.\n on(Event.SOURCE_LOADED).stayIn(State.STARTUP),\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE_REBUFFERING),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE_REBUFFERING),\n {name: 'FINISH_QUALITYCHANGE_REBUFFERING', from: State.QUALITYCHANGE_REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n ],\n callbacks: {\n onafterevent: (event, from, to, timestamp) => {\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n if (to === State.AUDIOTRACK_CHANGED_PLAYING) {\n this.stateMachine.FINISH_AUDIOTRACK_CHANGING(timestamp);\n }\n if (to === State.SUBTITLE_CHANGED_PLAYING) {\n this.stateMachine.FINISH_SUBTITLE_CHANGING(timestamp);\n }\n },\n onenterstate: (event, from, to, timestamp, eventObject) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log('[ENTER] ' + padRight(to, 20) + 'EVENT: ' + padRight(event, 20) + ' from ' + padRight(from, 14));\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.SEEK) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.SEEKED) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (\n event === 'PLAY_SEEK' &&\n to === State.PLAY_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.seekTimestamp = this.onEnterStateTimestamp;\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject): any => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n logger.log(`[LEAVE] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to ${padRight(to, 20)}`);\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.PAUSED_SEEKING && to !== State.END_PLAY_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (event === 'PLAY_SEEK' && from === State.PAUSE) {\n return true;\n }\n\n if (from === State.READY && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && (to === State.PLAYING || to === State.EXIT_BEFORE_VIDEOSTART)) {\n this.clearVideoStartTimeout();\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.PAUSED_SEEKING) {\n const seekDuration = timestamp - this.seekTimestamp;\n this.stateMachineCallbacks.paused_seeking(seekDuration, fnName);\n } else if (from === State.END_PLAY_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n this.stateMachineCallbacks.end_play_seeking(seekDuration, fnName);\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n logMissingCallbackWarning(from, [\n State.READY,\n State.SOURCE_CHANGING,\n State.MUTING_PAUSE,\n State.MUTING_PLAY,\n State.AUDIOTRACK_CHANGED_PLAYING,\n State.SUBTITLE_CHANGED_PLAYING,\n ]);\n }\n }\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n },\n onseek: (event, from, to, timestamp) => {\n this.seekTimestamp = timestamp;\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n override callEvent(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties,\n timestamp: number,\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n exec.call(this.stateMachine, timestamp, eventObject);\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n override onSsaiPlaybackInteraction(_timestamp: number, _eventObject: AnalyticsEventBase): void {\n // TODO: [AN-4077] Implement SSAI ad handling for video.js player\n }\n}\n","import {StateMachine} from 'javascript-state-machine';\n\nimport type {HeartbeatListener, HeartbeatService} from '../../core/HeartbeatService';\nimport {Event, EventMap} from '../../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {AnalyticsEventBase, ErrorEvent, VideoStartFailedEvent} from '../../types/EventData';\nimport {NoExtraProperties} from '../../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../../types/StateMachineCallbacks';\nimport {logger} from '../../utils/Logger';\nimport * as Utils from '../../utils/Utils';\nimport {AnalyticsStateMachine} from '../AnalyticsStateMachine';\nimport {customStateMachineErrorCallback, on} from '../stateMachineUtils';\n\nenum State {\n ERROR = 'ERROR',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n PAUSE = 'PAUSE',\n PLAYING = 'PLAYING',\n QUALITY_CHANGE = 'QUALITY_CHANGE',\n READY = 'READY',\n REBUFFERING = 'REBUFFERING',\n SEEKING = 'SEEKING',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n UNLOADED = 'UNLOADED',\n}\n\nexport class AmazonIVSStateMachine extends AnalyticsStateMachine implements HeartbeatListener {\n constructor(\n stateMachineCallbacks: StateMachineCallbacks,\n private heartbeatService: HeartbeatService,\n opts: AnalyticsStateMachineOptions,\n ) {\n super(stateMachineCallbacks, opts);\n }\n\n override createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine {\n this.onEnterStateTimestamp = opts.starttime;\n return StateMachine.create({\n initial: State.SETUP,\n error: customStateMachineErrorCallback,\n events: [\n // STARTUP\n {name: Event.READY, from: State.SETUP, to: State.READY},\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n {name: Event.PLAYING, from: State.STARTUP, to: State.PLAYING},\n\n // PLAYBACK\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PLAYING, from: State.PAUSE, to: State.PLAYING},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n {name: Event.UNLOAD, from: State.PLAYING, to: State.UNLOADED},\n {name: Event.PLAYING, from: State.ERROR, to: State.PLAYING}, // recover from error and continue playing\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITY_CHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITY_CHANGE, to: State.PLAYING},\n\n // SEEKING\n {name: Event.SEEK, from: State.PLAYING, to: State.SEEKING},\n {name: Event.SEEKED, from: State.SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.SEEKING, to: State.PAUSE},\n\n // BUFFERING\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.PLAYING, from: State.REBUFFERING, to: State.PLAYING},\n\n // EBVS\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n // ERROR\n {name: Event.ERROR, from: getAllStatesBut([State.STARTUP, State.EXIT_BEFORE_VIDEOSTART]), to: State.ERROR},\n\n // EVENTS TO IGNORE\n on(Event.PAUSE).stayIn(State.PAUSE),\n on(Event.PAUSE).stayIn(State.STARTUP),\n on(Event.PAUSE).stayIn(State.REBUFFERING),\n on(Event.PLAY).stayIn(State.PLAYING),\n on(Event.PLAYING).stayIn(State.PLAYING),\n on(Event.START_BUFFERING).stayIn(State.PAUSE),\n on(Event.START_BUFFERING).stayIn(State.REBUFFERING),\n on(Event.VIDEOSTART_TIMEOUT).stayIn(State.PLAYING),\n on(Event.VIDEOSTART_TIMEOUT).stayIn(State.PAUSE),\n on(Event.VIDEOSTART_TIMEOUT).stayIn(State.SEEKING),\n on(Event.UNLOAD).stayIn(State.READY),\n on(Event.UNLOAD).stayIn(State.SEEKING),\n\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITY_CHANGE),\n on(Event.VIDEO_CHANGE).stayIn(State.STARTUP),\n on(Event.VIDEO_CHANGE).stayIn(State.REBUFFERING),\n on(Event.VIDEO_CHANGE).stayIn(State.PAUSE),\n on(Event.VIDEO_CHANGE).stayIn(State.ERROR),\n on(Event.VIDEO_CHANGE).stayIn(State.EXIT_BEFORE_VIDEOSTART),\n on(Event.VIDEO_CHANGE).stayIn(State.READY),\n on(Event.VIDEO_CHANGE).stayIn(State.SEEKING),\n\n // Seeking\n on(Event.SEEK).stayIn(State.SEEKING),\n on(Event.SEEK).stayIn(State.PAUSE),\n on(Event.SEEK).stayIn(State.QUALITY_CHANGE),\n on(Event.SEEK).stayIn(State.REBUFFERING),\n on(Event.SEEK).stayIn(State.ERROR),\n on(Event.SEEK).stayIn(State.STARTUP),\n on(Event.SEEK).stayIn(State.READY),\n on(Event.SEEK).stayIn(State.EXIT_BEFORE_VIDEOSTART),\n on(Event.SEEKED).stayIn(State.PAUSE),\n on(Event.SEEKED).stayIn(State.QUALITY_CHANGE),\n on(Event.SEEKED).stayIn(State.REBUFFERING),\n on(Event.SEEKED).stayIn(State.ERROR),\n on(Event.SEEKED).stayIn(State.STARTUP),\n on(Event.SEEKED).stayIn(State.READY),\n on(Event.SEEKED).stayIn(State.EXIT_BEFORE_VIDEOSTART),\n ],\n callbacks: {\n onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: AnalyticsEventBase,\n ) => {\n if (from == 'none' || to === undefined || event === undefined) {\n return;\n }\n\n if (eventObject) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n logger.log(`[ENTER ${timestamp}] EVENT: ${event} \\nfrom: ${from}\\t to: ${to}`);\n this.onEnterStateTimestamp = timestamp || Utils.getCurrentTimestamp();\n this.getStateHandler()[to].onenterstate(event, eventObject);\n },\n onleavestate: (\n _event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: AnalyticsEventBase,\n ) => {\n if (!timestamp || from == 'none' || from === undefined || to === undefined) {\n return;\n }\n\n if (eventObject) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n this.getStateHandler()[from].onleavestate(stateDuration, to);\n },\n },\n });\n }\n\n override callEvent(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties,\n timestamp: number,\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n exec.call(this.stateMachine, timestamp, eventObject);\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n override onSsaiPlaybackInteraction(_timestamp: number, _eventObject: AnalyticsEventBase): void {\n // TODO: [AN-4290] Implement SSAI ad handling for AmazonIVS\n }\n\n onHeartbeat(eventObject: AnalyticsEventBase) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n const timestamp = Utils.getCurrentTimestamp();\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n this.stateMachineCallbacks.heartbeat(stateDuration, 'playing', {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n private getStateHandler = (): StateHandlerList => {\n return {\n [State.SETUP]: {\n onenterstate: () => undefined,\n onleavestate: (duration: number) => {\n this.stateMachineCallbacks.setup(duration, State.SETUP.toLowerCase());\n },\n },\n [State.READY]: {\n onenterstate: () => undefined,\n onleavestate: () => undefined,\n },\n [State.STARTUP]: {\n onenterstate: () => {\n this.setVideoStartTimeout();\n },\n onleavestate: (duration, to) => {\n this.clearVideoStartTimeout();\n if (to == State.PLAYING) {\n this.stateMachineCallbacks.startup(duration, State.STARTUP.toLowerCase());\n }\n },\n },\n [State.PLAYING]: {\n onenterstate: () => {\n this.heartbeatService.startHeartbeat();\n },\n onleavestate: (duration) => {\n this.heartbeatService.stopHeartbeat();\n this.stateMachineCallbacks.playing(duration, State.PLAYING.toLowerCase());\n },\n },\n [State.PAUSE]: {\n onenterstate: () => undefined,\n onleavestate: (duration) => {\n this.stateMachineCallbacks.pause(duration, State.PAUSE.toLowerCase());\n },\n },\n [State.REBUFFERING]: {\n onenterstate: () => {\n this.startRebufferingHeartbeatInterval();\n },\n onleavestate: (duration) => {\n this.resetRebufferingHelpers();\n this.stateMachineCallbacks.rebuffering(duration, State.REBUFFERING.toLowerCase());\n },\n },\n [State.EXIT_BEFORE_VIDEOSTART]: {\n onenterstate: (event: string, eventData: AnalyticsEventBase) => {\n const failedEvent: VideoStartFailedEvent = {\n reason: this.getReasonForVideoStartFailure(event),\n };\n const isErrorEvent = event === Event.ERROR;\n const shouldSendVideoStartupSample = !isErrorEvent;\n this.stateMachineCallbacks.videoStartFailed(failedEvent, shouldSendVideoStartupSample);\n if (isErrorEvent) {\n this.stateMachineCallbacks.error(eventData as ErrorEvent);\n }\n },\n onleavestate: () => undefined,\n },\n [State.ERROR]: {\n onenterstate: (_event: string, eventData: AnalyticsEventBase) => {\n this.stateMachineCallbacks.error(eventData as ErrorEvent);\n },\n onleavestate: () => undefined,\n },\n [State.UNLOADED]: {\n onenterstate: () => {\n this.stateMachineCallbacks.unload(0, State.UNLOADED);\n },\n onleavestate: () => undefined,\n },\n [State.QUALITY_CHANGE]: {\n onenterstate: (_event, eventData) => {\n this.stateMachine.FINISH_QUALITYCHANGE(this.onEnterStateTimestamp, eventData);\n },\n onleavestate: () => {\n this.stateMachineCallbacks.qualitychange(0, State.QUALITY_CHANGE.toLowerCase());\n },\n },\n [State.SEEKING]: {\n onenterstate: () => undefined,\n onleavestate: (duration) => {\n this.stateMachineCallbacks.end_play_seeking(duration, State.SEEKING.toLowerCase());\n },\n },\n };\n };\n}\n\nconst getAllStatesBut = (states: string[]) => {\n return getAllStates().filter((i) => states.indexOf(i) < 0);\n};\n\nconst getAllStates = () => {\n return Object.keys(State).map((key) => State[key]);\n};\n\ntype StateHandler = {\n onenterstate: (event: string, eventData: AnalyticsEventBase) => void;\n onleavestate: (duration: number, to: string) => void;\n};\n\ntype StateHandlerList = Record;\n","import * as StateMachine from 'javascript-state-machine';\n\nimport {HeartbeatListener, HeartbeatService} from '../../core/HeartbeatService';\nimport {Event, EventMap} from '../../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {AnalyticsEventBase} from '../../types/EventData';\nimport {NoExtraProperties} from '../../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../../types/StateMachineCallbacks';\nimport {EventDebugging} from '../../utils/EventDebugging';\nimport {logger, padRight} from '../../utils/Logger';\nimport {noOp} from '../../utils/Utils';\nimport {AnalyticsStateMachine} from '../AnalyticsStateMachine';\nimport {\n createHeartbeatPayload,\n customStateMachineErrorCallback,\n logMissingCallbackWarning,\n on,\n} from '../stateMachineUtils';\n\nenum State {\n AD_PAUSE = 'AD_PAUSE',\n AD_PLAYING = 'AD_PLAYING',\n AD_READY = 'AD_READY',\n /** This event is called when an ad is played directly after the player startup phase */\n AD_STARTUP = 'AD_STARTUP',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n CASTING = 'CASTING',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n END = 'END',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n ERROR = 'ERROR',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n INITIAL_SOURCE_CHANGE = 'INITIAL_SOURCE_CHANGE',\n MUTING_PAUSE = 'MUTING_PAUSE',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_READY = 'MUTING_READY',\n PAUSE = 'PAUSE',\n PLAY_SEEKING = 'PLAY_SEEKING',\n PLAYING = 'PLAYING',\n QUALITYCHANGE = 'QUALITYCHANGE',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n READY = 'READY',\n REBUFFERING = 'REBUFFERING',\n SETUP = 'SETUP',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n STARTUP = 'STARTUP',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n}\n\nexport class Bitmovin8AnalyticsStateMachine extends AnalyticsStateMachine implements HeartbeatListener {\n private debuggingStates: EventDebugging[] = [];\n private enabledDebugging = false;\n\n private seekTimestamp: number;\n private seekedTimestamp: number;\n private seekStarted: boolean;\n private seekEnded: boolean;\n // used for ads, because when AdFinished event is fired and call to state machine is made\n // data form player indicate that video is playing from beginning even if ad is in middle of video\n private lastTrackedVideoEndObject?: AnalyticsEventBase;\n\n private readonly heartbeatService: HeartbeatService;\n\n constructor(\n stateMachineCallbacks: StateMachineCallbacks,\n heartbeatService: HeartbeatService,\n opts: AnalyticsStateMachineOptions,\n ) {\n super(stateMachineCallbacks, opts);\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekStarted = false;\n this.seekEnded = false;\n this.heartbeatService = heartbeatService;\n }\n\n getAllStatesBut(states: string[]) {\n return this.getAllStates().filter((i) => states.indexOf(i) < 0);\n }\n\n getAllStates() {\n return Object.keys(State).map((key) => State[key]);\n }\n\n override createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine {\n return StateMachine.create({\n initial: State.SETUP,\n error: customStateMachineErrorCallback,\n events: [\n {\n name: Event.SOURCE_LOADED,\n from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING, State.INITIAL_SOURCE_CHANGE],\n to: State.READY,\n },\n\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n {name: Event.PLAYING, from: State.READY, to: State.PLAYING},\n on(Event.READY).stayIn(State.READY),\n on(Event.VIDEO_CHANGE).stayIn(State.READY),\n on(Event.AUDIO_CHANGE).stayIn(State.READY),\n\n {name: Event.ERROR, from: [State.STARTUP, State.AD_STARTUP], to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: [State.STARTUP, State.AD_STARTUP], to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n on(Event.PLAY).stayIn(State.STARTUP),\n on(Event.PLAYING).stayIn(State.STARTUP),\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n on(Event.START_BUFFERING).stayIn(State.STARTUP),\n on(Event.END_BUFFERING).stayIn(State.STARTUP),\n on(Event.VIDEO_CHANGE).stayIn(State.STARTUP),\n on(Event.AUDIO_CHANGE).stayIn(State.STARTUP),\n on(Event.READY).stayIn(State.STARTUP),\n {name: Event.PAUSE, from: State.STARTUP, to: State.READY},\n\n on(Event.PLAYING).stayIn(State.PLAYING),\n on(Event.TIMECHANGED).stayIn(State.PLAYING),\n on(Event.END_BUFFERING).stayIn(State.PLAYING),\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.END_BUFFERING, from: State.REBUFFERING, to: State.PLAYING},\n on(Event.TIMECHANGED).stayIn(State.REBUFFERING),\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE),\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE_PAUSE),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE_PAUSE),\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n //#region Seeking\n\n // start seeking\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n\n // mark the seeked as finished\n {name: Event.PLAY, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.PLAYING, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n // seek while previous seek not completed\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n\n // seek completely finished and cont playing\n {name: Event.PLAYING, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n //#region disable transitions\n // ignore transitions in PLAY_SEEKING\n on(Event.SEEK).stayIn(State.PLAY_SEEKING),\n on(Event.AUDIO_CHANGE).stayIn(State.PLAY_SEEKING),\n on(Event.VIDEO_CHANGE).stayIn(State.PLAY_SEEKING),\n on(Event.START_BUFFERING).stayIn(State.PLAY_SEEKING),\n on(Event.END_BUFFERING).stayIn(State.PLAY_SEEKING),\n\n // ignore transitions in END_PLAY_SEEKING\n on(Event.START_BUFFERING).stayIn(State.END_PLAY_SEEKING),\n on(Event.END_BUFFERING).stayIn(State.END_PLAY_SEEKING),\n on(Event.SEEKED).stayIn(State.END_PLAY_SEEKING),\n on(Event.PLAY).stayIn(State.END_PLAY_SEEKING),\n\n // ignore Seek events during PAUSE\n on(Event.SEEK).stayIn(State.PAUSE),\n on(Event.SEEKED).stayIn(State.PAUSE),\n\n // ignore seeked during Playing because of not allowed keyboard seeking\n on(Event.SEEKED).stayIn(State.PLAYING),\n //#endregion\n //#endregion\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n\n on(Event.SEEK).stayIn(State.END),\n on(Event.SEEKED).stayIn(State.END),\n on(Event.TIMECHANGED).stayIn(State.END),\n on(Event.END_BUFFERING).stayIn(State.END),\n on(Event.START_BUFFERING).stayIn(State.END),\n on(Event.END).stayIn(State.END),\n\n {name: Event.PLAY, from: State.END, to: State.STARTUP},\n\n {name: Event.ERROR, from: this.getAllStatesBut([State.STARTUP]), to: State.ERROR},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut([State.STARTUP, State.AD_STARTUP]), to: State.END},\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n on(Event.SUBTITLE_CHANGE).stayIn(State.PAUSE),\n on(Event.SUBTITLE_CHANGE).stayIn(State.REBUFFERING),\n on(Event.SUBTITLE_CHANGE).stayIn(State.END_PLAY_SEEKING),\n on(Event.SUBTITLE_CHANGE).stayIn(State.SUBTITLE_CHANGING),\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.PAUSE),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.REBUFFERING),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.END_PLAY_SEEKING),\n on(Event.AUDIOTRACK_CHANGED).stayIn(State.AUDIOTRACK_CHANGING),\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n // #region Ads\n {name: Event.START_AD, from: State.STARTUP, to: State.AD_STARTUP},\n {name: Event.END_AD, from: State.AD_STARTUP, to: State.STARTUP},\n on(Event.PLAY).stayIn(State.AD_STARTUP),\n on(Event.PAUSE).stayIn(State.AD_STARTUP),\n\n {name: Event.START_AD, from: State.READY, to: State.AD_READY},\n /** After the pre-rolls, the main content will always start playing, no matter if autoplay: true/false */\n {name: Event.END_AD, from: State.AD_READY, to: State.STARTUP},\n on(Event.PLAY).stayIn(State.AD_READY),\n on(Event.PAUSE).stayIn(State.AD_READY),\n\n {name: Event.START_AD, from: State.PAUSE, to: State.AD_PAUSE},\n {name: Event.END_AD, from: State.AD_PAUSE, to: State.PAUSE},\n on(Event.PLAY).stayIn(State.AD_PAUSE),\n on(Event.PAUSE).stayIn(State.AD_PAUSE),\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD_PLAYING},\n {name: Event.END_AD, from: State.AD_PLAYING, to: State.PLAYING},\n on(Event.PLAY).stayIn(State.AD_PLAYING),\n on(Event.PAUSE).stayIn(State.AD_PLAYING),\n {name: Event.END, from: State.AD_PLAYING, to: State.END},\n\n // Ignore timechanged events during ads\n on(Event.TIMECHANGED).stayIn(State.AD_STARTUP),\n on(Event.TIMECHANGED).stayIn(State.AD_READY),\n on(Event.TIMECHANGED).stayIn(State.AD_PAUSE),\n on(Event.TIMECHANGED).stayIn(State.AD_PLAYING),\n\n // Ignore End Ad events when no ad has started\n on(Event.END_AD).stayIn(State.PLAYING),\n on(Event.END_AD).stayIn(State.PAUSE),\n on(Event.END_AD).stayIn(State.READY),\n on(Event.END_AD).stayIn(State.STARTUP),\n // #endregion\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE, State.PLAYING], to: State.CASTING},\n on(Event.PAUSE).stayIn(State.CASTING),\n on(Event.PLAY).stayIn(State.CASTING),\n on(Event.PLAYING).stayIn(State.CASTING),\n on(Event.TIMECHANGED).stayIn(State.CASTING),\n on(Event.MUTE).stayIn(State.CASTING),\n on(Event.UN_MUTE).stayIn(State.CASTING),\n on(Event.SEEK).stayIn(State.CASTING),\n on(Event.SEEKED).stayIn(State.CASTING),\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n on(Event.SEEK).stayIn(State.READY),\n on(Event.SEEKED).stayIn(State.READY),\n on(Event.SEEKED).stayIn(State.STARTUP),\n\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStatesBut([State.SETUP]), to: State.SOURCE_CHANGING},\n {name: Event.MANUAL_SOURCE_CHANGE, from: State.SETUP, to: State.INITIAL_SOURCE_CHANGE},\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n\n // {name: Event.READY, from: State.SOURCE_CHANGING, to: State.READY},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n on(Event.VIDEO_CHANGE).stayIn(State.QUALITYCHANGE_REBUFFERING),\n on(Event.AUDIO_CHANGE).stayIn(State.QUALITYCHANGE_REBUFFERING),\n {name: 'FINISH_QUALITYCHANGE_REBUFFERING', from: State.QUALITYCHANGE_REBUFFERING, to: State.REBUFFERING},\n ],\n callbacks: {\n onbeforeevent: (event, from, to, _timestamp: number, _eventObject: AnalyticsEventBase): any => {\n if (from === State.REBUFFERING && to === State.QUALITYCHANGE_REBUFFERING) {\n return false;\n }\n },\n onafterevent: (event, from, to, timestamp: number, eventObject) => {\n if (event === Event.MANUAL_SOURCE_CHANGE && from === State.SETUP) {\n this.stateMachineCallbacks.initialSourceChange(eventObject);\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n\n onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: AnalyticsEventBase,\n ) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log(\n `[ENTER ${timestamp}] ${padRight(to, 20)} EVENT: ${padRight(event, 20)} from: ${padRight(from, 14)}`,\n );\n\n if (\n eventObject &&\n to !== State.END_PLAY_SEEKING &&\n from !== State.PLAY_SEEKING &&\n from !== State.AD_STARTUP &&\n from !== State.AD_READY &&\n from !== State.AD_PLAYING &&\n from !== State.AD_PAUSE &&\n !(event === Event.SEEK && from === State.END_PLAY_SEEKING)\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject: AnalyticsEventBase) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n\n logger.log(\n `[LEAVE ${timestamp}] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to: ${padRight(to, 20)}`,\n );\n\n this.addStatesToLog(event, from, to, timestamp, eventObject);\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.END_PLAY_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (eventObject && event !== Event.END_AD) {\n this.lastTrackedVideoEndObject = eventObject;\n }\n\n if ((from === State.READY || from === State.AD_STARTUP) && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && (to === State.PLAYING || to === State.AD_STARTUP)) {\n this.clearVideoStartTimeout();\n }\n\n const fromStateName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.END_PLAY_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n\n // do not enter here if\n // 1. no seek has started because of SEEK\n // 2. no seek has ended because of SEEKED event\n // 3. leave of END_PLAY_SEEKING was triggered by another SEEK event (continuous seeking)\n if (this.seekStarted && this.seekEnded && event !== Event.SEEK) {\n this.seekStarted = this.seekEnded = false;\n this.stateMachineCallbacks.end_play_seeking(seekDuration, fromStateName);\n }\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fromStateName);\n } else if (\n from === State.AD_PAUSE ||\n from === State.AD_READY ||\n from === State.AD_PLAYING ||\n from === State.AD_STARTUP\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(this.lastTrackedVideoEndObject);\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(this.lastTrackedVideoEndObject);\n this.stateMachineCallbacks.ad(stateDuration, 'ad');\n } else if (event === Event.START_AD && from === State.STARTUP) {\n noOp();\n } else if (event === Event.SOURCE_LOADED && from === State.INITIAL_SOURCE_CHANGE) {\n noOp();\n } else if (from === State.SETUP) {\n // Setting Player Startup Time to fixed value of 1ms.\n // We can not get correct Player Startup Time from bitmovin player, because it does not have an \"onInitialized\" event\n this.stateMachineCallbacks.setup(1, State.SETUP.toLowerCase());\n } else if (event === Event.PAUSE && from === State.STARTUP && to === State.READY) {\n // fired PAUSE event in STARTUP state indicates we are moving back to READY,\n // so we have to clean setTimeout, and we should not call any stateMachineCallbacks\n this.clearVideoStartTimeout();\n } else if (from !== State.ERROR) {\n const callbackFunction = this.stateMachineCallbacks[fromStateName];\n if (typeof callbackFunction === 'function') {\n try {\n callbackFunction(stateDuration, fromStateName, eventObject);\n } catch (e) {\n logger.error('Exception occurred in State Machine callback ' + fromStateName, eventObject, e);\n }\n } else {\n logMissingCallbackWarning(from, [State.READY, State.SOURCE_CHANGING]);\n }\n }\n\n if (\n eventObject &&\n to !== State.END_PLAY_SEEKING &&\n from !== State.PLAY_SEEKING &&\n to !== State.PLAY_SEEKING &&\n from !== State.AD_STARTUP &&\n from !== State.AD_READY &&\n from !== State.AD_PLAYING &&\n from !== State.AD_PAUSE\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n }\n },\n onseek: (event, from, to, timestamp) => {\n if (!this.seekStarted) {\n this.seekTimestamp = timestamp;\n this.seekStarted = true;\n }\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n this.seekEnded = true;\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n [`onenter${State.PLAYING}`]: (event, from, to, timestamp) => {\n this.onEnterStateTimestamp = timestamp;\n this.heartbeatService.startHeartbeat();\n },\n [`onleave${State.PLAYING}`]: () => {\n this.heartbeatService.stopHeartbeat();\n },\n },\n });\n }\n\n /**\n * calls the heartbeat callback to send out a sample\n * uses timestamp and eventObject.currentTime to reset time measurements\n * @param timestamp current timestamp\n * @param eventObject contains player information\n * @param triggeredBySsai boolean to mark the sample as SSAI triggered\n */\n private sendCurrentStateSample(timestamp: number, eventObject: AnalyticsEventBase, triggeredBySsai = false) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n const state = this.stateMachine.current.toLowerCase();\n const payload = createHeartbeatPayload(stateDuration, state as Lowercase, triggeredBySsai);\n this.stateMachineCallbacks.heartbeat(stateDuration, state, payload);\n\n this.onEnterStateTimestamp = timestamp;\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n override callEvent(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties,\n timestamp: number,\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n try {\n exec.call(this.stateMachine, timestamp, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + eventType, exec, eventObject, e);\n }\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n override onSsaiPlaybackInteraction(timestamp: number, eventObject: AnalyticsEventBase) {\n // We don't allow this in any other state because it could interrupt the natural flow of the states\n // only PLAYING is considered a state which we can interrupt just like the heartbeat does\n // also we don't want to send samples with state we usually don't send samples like `ready`\n if (this.currentState != State.PLAYING) {\n return;\n }\n\n // Because ssai playback interaction can happen before Ssai Service is active (e.g. first ssai startAd call),\n // we need to manually mark sample as triggered by ssai\n //\n // This is also including the last sample marking, before a ssai ad block (due to ssai being spiky by design)\n this.sendCurrentStateSample(timestamp, eventObject, true);\n }\n\n private addStatesToLog(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any,\n ) {\n if (this.enabledDebugging) {\n this.debuggingStates.push(new EventDebugging(event, from, to, timestamp, eventObject));\n }\n }\n\n getStates() {\n return this.debuggingStates;\n }\n\n setEnabledDebugging(enabled: boolean) {\n this.enabledDebugging = enabled;\n }\n\n onHeartbeat(eventObject: AnalyticsEventBase): void {\n const timestamp = Date.now();\n this.sendCurrentStateSample(timestamp, eventObject);\n }\n}\n","import type {StateMachineErrorCallback, StateMachineEventDef} from 'javascript-state-machine';\n\nimport {SSAI_RELATED_SAMPLE_MARKER} from '../core/ssai/ssaiUtils';\nimport {HeartbeatPayload} from '../types/StateMachineCallbacks';\nimport {logger} from '../utils/Logger';\n\ntype OnReturn = {\n stayIn: (state: string) => StateMachineEventDef;\n};\n\nexport function on(event: string): OnReturn {\n return {\n stayIn: (state: string) => ({name: event, from: state, to: state}),\n };\n}\n\n/**\n * By default, if you try to call an event method that is not allowed in the current state,\n * the state machine will throw an exception.\n * To handle this problem ourselves, we define a custom error handler that will log the error.\n *\n * @see https://github.com/jakesgordon/javascript-state-machine/blob/2.4.0/README.md#handling-failures\n */\nexport const customStateMachineErrorCallback: StateMachineErrorCallback = (\n eventName,\n from,\n to,\n args,\n errorCode,\n errorMessage,\n _ex,\n) => {\n let msg = `StateMachine error callback: ${errorMessage}`;\n msg += `, eventName: ${eventName}, from: ${from}, to: ${to}`;\n if (args != null) {\n msg += `, args: ${JSON.stringify(args)}`;\n }\n msg += `, errorCode: ${errorCode}`;\n\n logger.warn(msg);\n};\n\nexport const createHeartbeatPayload = (\n duration: number,\n state: Lowercase,\n triggeredBySsai = false,\n): HeartbeatPayload => {\n let payload: HeartbeatPayload = {};\n switch (state) {\n case 'playing':\n payload = {played: duration};\n break;\n case 'buffering':\n payload = {buffered: duration};\n break;\n case 'paused':\n payload = {paused: duration};\n break;\n default:\n break;\n }\n\n if (triggeredBySsai) {\n payload[SSAI_RELATED_SAMPLE_MARKER] = true;\n }\n\n return payload;\n};\n\n/**\n * For unknown reason, we want to report states that does not map to callback function names\n * in javascript-state-machine `onleavestate` callback\n *\n * This does not apply to Amazon IVS state machine, that was written in different code style and does not include such `onleavestate` callback logic\n *\n */\nexport const logMissingCallbackWarning = (state: string | undefined, ignoreStates: string[] = []) => {\n if (state == null) {\n return;\n }\n\n const shouldReportMissingCallback = ignoreStates.find((ignoredState) => state === ignoredState) == null;\n if (shouldReportMissingCallback) {\n logger.warn('Could not find callback function for ' + state);\n }\n};\n","import {logger} from '../utils/Logger';\nimport {isValidString} from '../utils/stringUtils';\nimport {toBoolean} from '../utils/Utils';\n\nimport type {\n AdPosition,\n SsaiAdBreakMetadata,\n SsaiAdMetadata,\n SsaiAdQuartile,\n SsaiAdQuartileMetadata,\n} from './AdapterAPI';\n\nexport function isAdPosition(anything: unknown): anything is AdPosition {\n // invalid, when not defined as one of string values we expect\n return anything === 'preroll' || anything === 'midroll' || anything === 'postroll';\n}\n\n/** User input validation, if passed SSAI API argument is valid */\nexport function isValidSsaiAdBreakMetadata(anything: unknown): boolean {\n // value `undefined` / `null` is considered to be valid, because that value is optional\n if (anything == null) {\n return true;\n }\n\n // invalid, when value was defined, but not as an object\n if (typeof anything !== 'object') {\n logger.errorMessageToUser('Invalid SsaiAdBreakMetadata: not an object');\n return false;\n }\n\n const maybeSsaiAdBreakMetadata = anything as SsaiAdBreakMetadata;\n\n // invalid, when `adPosition` was defined, but not as an ad position string we expect\n if (maybeSsaiAdBreakMetadata.adPosition != null && !isAdPosition(maybeSsaiAdBreakMetadata.adPosition)) {\n logger.errorMessageToUser(\"Invalid SsaiAdBreakMetadata: 'adPosition' property is not valid\");\n return false;\n }\n\n return true;\n}\n\n/** User input validation, if passed SSAI API argument is valid */\nexport function isValidSsaiAdMetadata(anything: unknown): boolean {\n // value `undefined` / `null` is considered to be valid, because that value is optional\n if (anything == null) {\n return true;\n }\n\n // invalid, when value was defined, but not as an object\n if (typeof anything !== 'object') {\n logger.errorMessageToUser('Invalid SsaiAdMetadata: not an object');\n return false;\n }\n\n const maybeSsaiAdMetadata = anything as SsaiAdMetadata;\n\n // invalid, when `adId` was defined, but not as a string\n if (maybeSsaiAdMetadata.adId != null && !isValidString(maybeSsaiAdMetadata.adId)) {\n logger.errorMessageToUser(\"Invalid SsaiAdMetadata: 'adId' property is not string\");\n return false;\n }\n\n // invalid, when `adSystem` was defined, but not as a string\n if (maybeSsaiAdMetadata.adSystem != null && !isValidString(maybeSsaiAdMetadata.adSystem)) {\n logger.errorMessageToUser(\"Invalid SsaiAdMetadata: 'adSystem' property is not string\");\n return false;\n }\n\n // invalid, when `customData` was defined, but not as an object\n if (maybeSsaiAdMetadata.customData != null && typeof maybeSsaiAdMetadata.customData !== 'object') {\n logger.errorMessageToUser(\"Invalid SsaiAdMetadata: 'customData' property is not an object\");\n return false;\n }\n\n return true;\n}\n\nfunction isSsaiAdQuartile(anything: unknown): anything is SsaiAdQuartile {\n return anything === 'completed' || anything === 'first' || anything === 'midpoint' || anything === 'third';\n}\n\n/** User input validation, if passed SSAI API argument is valid */\nexport function isValidSsaiAdQuartile(anything: unknown): boolean {\n if (!isSsaiAdQuartile(anything)) {\n logger.errorMessageToUser('Invalid SsaiAdQuartile');\n return false;\n }\n\n return true;\n}\n\n/**\n * Utility function to sanitize the failedBeaconUrl value in the SsaiAdQuartileMetadata (if defined), to be string\n * with max length 500 characters to guard our sent samples against big payloads\n */\nexport function sanitizeSsaiAdQuartileMetadataFailedBeaconUrl(anything: T): T {\n const maybeSsaiAdQuartileMetadata = anything as SsaiAdQuartileMetadata;\n\n if (isValidString(maybeSsaiAdQuartileMetadata?.failedBeaconUrl)) {\n maybeSsaiAdQuartileMetadata.failedBeaconUrl = maybeSsaiAdQuartileMetadata.failedBeaconUrl.substring(0, 500);\n }\n\n return maybeSsaiAdQuartileMetadata as T;\n}\n\nexport function isValidSsaiAdQuartileMetadata(anything: unknown): boolean {\n // value `undefined` / `null` is considered to be valid, because that value is optional\n if (anything == null) {\n return true;\n }\n\n // invalid, when value was defined, but not as an object\n if (typeof anything !== 'object') {\n logger.errorMessageToUser('Invalid SsaiAdQuartileMetadata: not an object');\n return false;\n }\n\n const maybeSsaiAdQuartileMetadata = anything as SsaiAdQuartileMetadata;\n\n // invalid, when `failedBeaconUrl` was defined but not as a string\n if (\n maybeSsaiAdQuartileMetadata.failedBeaconUrl != null &&\n !isValidString(maybeSsaiAdQuartileMetadata.failedBeaconUrl)\n ) {\n logger.errorMessageToUser(\"Invalid SsaiAdQuartileMetadata: 'failedBeaconUrl' property is not string\");\n return false;\n }\n\n return true;\n}\n\nexport function sanitizeSessionMetadataAudioLanguage(anything: unknown): string | undefined {\n // value `undefined` / `null` is considered to be valid (to \"reset\" session metadata property)\n if (anything == null) {\n // sanitize to use `undefined` in code\n return undefined;\n }\n\n return String(anything).substring(0, 50);\n}\n\nexport function sanitizeSessionMetadataSubtitleEnabled(anything: unknown): boolean | undefined {\n // value `undefined` / `null` is considered to be valid (to \"reset\" session metadata property)\n if (anything == null) {\n // sanitize to use `undefined` in code\n return undefined;\n }\n\n return toBoolean(anything);\n}\n\nexport function sanitizeSessionMetadataSubtitleLanguage(anything: unknown): string | undefined {\n // value `undefined` / `null` is considered to be valid (to \"reset\" session metadata property)\n if (anything == null) {\n // sanitize to use `undefined` in code\n return undefined;\n }\n\n return String(anything).substring(0, 100);\n}\n","import type {\n Ad,\n AdBreak,\n AdBreakEvent,\n AdClickedEvent,\n AdEvent,\n AdManifestLoadedEvent,\n AdQuartileEvent,\n AdTagConfig,\n ErrorEvent,\n} from 'bitmovin-player';\n\nimport {AdModuleAPI} from '../adapters/internal/ads/AdModuleAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\nimport {ViewportTracker} from '../utils/ViewportTracker';\nimport {VERSION} from '../Version';\n\nimport {Analytics} from './Analytics';\n\nenum AdQuartile {\n FIRST_QUARTILE = 'firstQuartile',\n MIDPOINT = 'midpoint',\n THIRD_QUARTILE = 'thirdQuartile',\n}\n\nexport class AdAnalytics {\n static readonly MODULE_NAME = 'ads';\n private static readonly TIMEOUT_CURRENT_TIME_INTERVAL = 100;\n\n private onBeforeUnLoadEvent = false;\n private analytics: Analytics;\n private adapter: AdModuleAPI;\n private viewportTracker: ViewportTracker;\n\n private activeAdBreakSample?: AdBreakSample;\n private activeAdSample?: AdSample;\n\n private adManifestLoadedEvents: AdManifestLoadedEvent[] = [];\n private adStartupTimestamp?: number;\n private beginPlayingTimestamp?: number;\n private enterViewportTimestamp?: number;\n private isPlaying = false;\n private currentTime?: number;\n private currentTimeInterval?: number;\n private adPodPosition = 0;\n\n constructor(analytics: Analytics, adapter: AdModuleAPI) {\n this.analytics = analytics;\n this.adapter = adapter;\n\n this.adapter.adCallbacks.onAdStarted = (event) => this.onAdStarted(event);\n this.adapter.adCallbacks.onAdFinished = (event) => this.onAdFinished(event);\n this.adapter.adCallbacks.onAdBreakStarted = (event) => this.onAdBreakStarted(event);\n this.adapter.adCallbacks.onAdBreakFinished = (event) => this.onAdBreakFinished(event);\n this.adapter.adCallbacks.onAdClicked = (event) => this.onAdClicked(event);\n this.adapter.adCallbacks.onAdError = (event) => this.onAdError(event);\n this.adapter.adCallbacks.onAdManifestLoaded = (event) => this.onAdManifestLoaded(event);\n this.adapter.adCallbacks.onPlay = () => this.onPlay();\n this.adapter.adCallbacks.onPause = () => this.onPause();\n this.adapter.adCallbacks.onBeforeUnload = () => this.onBeforeUnload();\n this.adapter.adCallbacks.onAdSkipped = (event) => this.onAdSkipped(event);\n this.adapter.adCallbacks.onAdQuartile = (event) => this.onAdQuartile(event);\n\n this.viewportTracker = new ViewportTracker(this.adapter.getContainer(), () => this.onIntersectionChanged(), 0.5);\n }\n\n release() {\n this.clearCurrentTimeInterval();\n this.viewportTracker.dispose();\n }\n\n onIntersectionChanged() {\n if (!this.activeAdSample) {\n return;\n }\n if (this.isContainerInViewport()) {\n this.enterViewportTimestamp = Utils.getCurrentTimestamp();\n } else {\n if (this.enterViewportTimestamp) {\n this.activeAdSample.timeInViewport =\n (this.activeAdSample.timeInViewport || 0) + Utils.getCurrentTimestamp() - this.enterViewportTimestamp;\n }\n }\n }\n\n isContainerInViewport(): boolean {\n return this.viewportTracker ? this.viewportTracker.isInViewport() : true;\n }\n\n onPlay() {\n if (this.adapter && this.adapter.isLinearAdActive() && this.activeAdSample) {\n const timestamp = Utils.getCurrentTimestamp();\n this.beginPlayingTimestamp = timestamp;\n this.enterViewportTimestamp = timestamp;\n this.isPlaying = true;\n }\n }\n\n onPause() {\n if (this.adapter && this.adapter.isLinearAdActive() && this.activeAdSample) {\n this.updatePlayingTime(this.activeAdSample);\n this.isPlaying = false;\n }\n }\n\n onAdManifestLoaded(event: AdManifestLoadedEvent) {\n const adTagConfig = event.adConfig as AdTagConfig;\n if (adTagConfig && adTagConfig.tag && adTagConfig.tag.type === 'vmap') {\n this.sendAnalyticsRequest(new AdBreakSample(event.adConfig, event));\n } else if (event.adBreak) {\n this.adManifestLoadedEvents.push(event);\n }\n }\n\n onAdBreakStarted(event: AdBreakEvent) {\n this.adPodPosition = 0;\n this.activeAdBreakSample = new AdBreakSample(event.adBreak, this.getAdManifestLoadedEvent(event.adBreak));\n this.adStartupTimestamp = Utils.getCurrentTimestamp();\n }\n\n onAdBreakFinished(_event: AdBreakEvent) {\n this.resetActiveAd();\n this.activeAdBreakSample = undefined;\n }\n\n onAdStarted(event: AdEvent) {\n if (!event.ad.isLinear) {\n return;\n }\n\n this.resetActiveAd();\n this.activeAdSample = new AdSample(event.ad);\n this.currentTime = undefined;\n this.activeAdSample.adStartupTime = this.adStartupTimestamp\n ? Utils.getCurrentTimestamp() - this.adStartupTimestamp\n : undefined;\n\n this.startAd(this.activeAdSample);\n }\n\n onAdFinished(_event: AdEvent) {\n if (!this.activeAdBreakSample || !this.activeAdSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.completed = 1;\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.adDuration);\n }\n\n onAdSkipped(_event: AdEvent) {\n if (!this.activeAdBreakSample || !this.activeAdSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.skipped = 1;\n adSample.skipPosition = this.currentTime;\n adSample.skipPercentage = Utils.calculatePercentage(\n this.activeAdSample.skipPosition,\n this.activeAdSample.adDuration,\n );\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.skipPosition);\n }\n\n onAdError(event: ErrorEvent) {\n const {adConfig, adBreak, code, message} = event.data || {\n adBreak: undefined,\n adConfig: undefined,\n code: undefined,\n message: undefined,\n };\n\n const adBreakSample = new AdBreakSample(\n adBreak || adConfig,\n adBreak ? this.getAdManifestLoadedEvent(adBreak) : undefined,\n );\n\n adBreakSample.errorCode = code || event.code;\n adBreakSample.errorData = JSON.stringify(event.data);\n adBreakSample.errorMessage = message || event.name;\n\n let adSample;\n let errorPosition;\n if (\n this.activeAdSample &&\n adBreak &&\n adBreak.ads &&\n (adBreak.ads as any[]).includes((ad: Ad) => ad.id === (this.activeAdSample as AdSample).adId)\n ) {\n adSample = this.activeAdSample;\n errorPosition = adSample.errorPosition = this.currentTime;\n adSample.errorPercentage = Utils.calculatePercentage(adSample.errorPosition, adSample.adDuration);\n }\n this.completeAd(adBreakSample, adSample, errorPosition);\n }\n\n onAdClicked(event: AdClickedEvent) {\n if (!this.activeAdSample) {\n return;\n }\n this.activeAdSample.adClickthroughUrl = event.clickThroughUrl;\n this.activeAdSample.clicked = 1;\n this.activeAdSample.clickPosition = this.currentTime;\n this.activeAdSample.clickPercentage = Utils.calculatePercentage(\n this.activeAdSample.clickPosition,\n this.activeAdSample.adDuration,\n );\n }\n\n onAdQuartile(event: AdQuartileEvent) {\n if (!this.activeAdSample) {\n return;\n }\n if (event.quartile === AdQuartile.FIRST_QUARTILE) {\n this.activeAdSample.quartile1 = 1;\n } else if (event.quartile === AdQuartile.MIDPOINT) {\n this.activeAdSample.midpoint = 1;\n } else if (event.quartile === AdQuartile.THIRD_QUARTILE) {\n this.activeAdSample.quartile3 = 1;\n }\n }\n\n onBeforeUnload() {\n if (this.onBeforeUnLoadEvent) {\n return;\n }\n this.onBeforeUnLoadEvent = true;\n if (!this.activeAdSample || !this.activeAdBreakSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.closed = 1;\n adSample.closePosition = this.currentTime;\n adSample.closePercentage = Utils.calculatePercentage(adSample.closePosition, adSample.adDuration);\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.closePosition);\n }\n\n createNewAdAnalyticsSample(analyticsSample: Sample): AdAnalyticsSample {\n const moduleInfo = this.adapter.getAdModuleInfo();\n return {\n ...new AdAnalyticsSample(analyticsSample),\n analyticsVersion: VERSION,\n adModule: moduleInfo.name,\n adModuleVersion: moduleInfo.version,\n playerStartupTime: this.analytics.playerStartupTime,\n pageLoadTime: this.analytics.pageLoadTime,\n autoplay: this.analytics.autoplay,\n pageLoadType: Utils.getPageLoadType(),\n };\n }\n\n private getAdManifestLoadedEvent(adBreak: AdBreak) {\n if (!adBreak) {\n return undefined;\n }\n return this.adManifestLoadedEvents.find((i) => i.adBreak && i.adBreak.id === adBreak.id);\n }\n\n private sendAnalyticsRequest(adBreakSample: AdBreakSample, adSample?: AdSample) {\n const sample = {\n ...this.createNewAdAnalyticsSample(this.analytics.sample),\n ...adBreakSample,\n ...(adSample || new AdSample()),\n };\n sample.time = Utils.getCurrentTimestamp();\n sample.adImpressionId = Utils.generateUUID();\n sample.percentageInViewport = Utils.calculatePercentage(sample.timeInViewport, sample.timePlayed);\n this.analytics.backend.sendAdRequest(sample);\n }\n\n private updatePlayingTime(adSample: AdSample) {\n const timestamp = Utils.getCurrentTimestamp();\n if (this.beginPlayingTimestamp && this.isPlaying) {\n if (adSample.timePlayed !== undefined) {\n adSample.timePlayed += timestamp - this.beginPlayingTimestamp;\n }\n if (this.isContainerInViewport() && this.enterViewportTimestamp && adSample.timeInViewport !== undefined) {\n adSample.timeInViewport += timestamp - this.enterViewportTimestamp;\n }\n }\n }\n\n private startAd(adSample: AdSample) {\n adSample.started = 1;\n adSample.timePlayed = 0;\n adSample.timeInViewport = 0;\n adSample.adPodPosition = this.adPodPosition;\n const timestamp = Utils.getCurrentTimestamp();\n this.beginPlayingTimestamp = timestamp;\n this.enterViewportTimestamp = this.isContainerInViewport() ? timestamp : undefined;\n this.isPlaying = true;\n this.currentTime = 0;\n this.adPodPosition++;\n this.currentTimeInterval = window.setInterval(() => {\n try {\n if (\n adSample &&\n adSample.adDuration !== undefined &&\n adSample.adDuration > 0 &&\n this.adapter.isLinearAdActive()\n ) {\n this.currentTime = Utils.calculateTime(Math.max(this.adapter.currentTime(), 0));\n }\n } catch (e) {\n logger.log('AdStarted monitoring interval failed and got cleared', e);\n this.resetActiveAd();\n }\n }, AdAnalytics.TIMEOUT_CURRENT_TIME_INTERVAL);\n }\n\n private completeAd(adBreakSample: AdBreakSample, adSample: AdSample = new AdSample(), exitPosition?: number) {\n adSample.exitPosition = exitPosition;\n adSample.playPercentage = Utils.calculatePercentage(adSample.exitPosition, adSample.adDuration);\n\n // reset startupTimestamp for the next ad, in case there are multiple ads in one ad break\n this.adStartupTimestamp = Utils.getCurrentTimestamp();\n this.updatePlayingTime(adSample);\n this.isPlaying = false;\n this.sendAnalyticsRequest(adBreakSample, adSample);\n }\n\n private resetActiveAd() {\n this.clearCurrentTimeInterval();\n this.activeAdSample = undefined;\n }\n\n private clearCurrentTimeInterval() {\n window.clearInterval(this.currentTimeInterval);\n delete this.currentTime;\n }\n}\n","import {InternalAdapterAPI} from '../adapters/internal/InternalAdapterAPI';\nimport {AD_TYPE} from '../enums/AdType';\nimport {ErrorCode} from '../enums/ErrorCode';\nimport {PlayerSize} from '../enums/PlayerSize';\nimport {ErrorDetailTrackingSettingsProvider} from '../features/errordetails/ErrorDetailTracking';\nimport {OnErrorDetailEventObject} from '../features/errordetails/OnErrorDetailEventObject';\nimport {FeatureManager} from '../features/FeatureManager';\nimport {AnalyticsConfig, CollectorConfig, removeSourceRelatedFields} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {CustomDataValues, extractCustomDataFieldsOnly} from '../types/CustomDataValues';\nimport * as EventData from '../types/EventData';\nimport {FeatureConfigContainer} from '../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../types/PlaybackInfo';\nimport {Sample} from '../types/Sample';\nimport {HeartbeatPayload} from '../types/StateMachineCallbacks';\nimport Timespan from '../types/Timespan';\nimport {CodecHelper} from '../utils/CodecHelper';\nimport {logger} from '../utils/Logger';\nimport {isBlank, isValidString} from '../utils/stringUtils';\nimport * as Utils from '../utils/Utils';\nimport {VERSION} from '../Version';\n\nimport {AdAnalytics} from './AdAnalytics';\nimport {Backend} from './Backend';\nimport {BackendFactory} from './BackendFactory';\nimport {EventDispatcher, Subscribable} from './EventDispatcher';\nimport {NoOpBackend} from './NoOpBackend';\nimport {SessionPersistenceHandler} from './SessionPersistenceHandler';\nimport {\n isSsaiEngagementErrorData,\n isSsaiEngagementQuartileData,\n isSsaiEngagementStartedData,\n SsaiEngagementInteractionData,\n} from './ssai/ssaiEngagementInteractionData';\nimport {\n createErrorAdSample,\n createQuartileAdSample,\n createStartedAdSample,\n SSAI_RELATED_SAMPLE_MARKER,\n} from './ssai/ssaiUtils';\n\nexport class Analytics {\n get version(): string {\n return VERSION;\n }\n\n static version: string = VERSION;\n\n private readonly adAnalytics: AdAnalytics | undefined;\n\n pageLoadTime = 0;\n playerStartupTime = 0;\n videoStartupTime = 0;\n autoplay: boolean | undefined = undefined;\n sample: Sample;\n backend!: Backend;\n errorDetailTrackingSettingsProvider: ErrorDetailTrackingSettingsProvider;\n\n private config: AnalyticsConfig;\n private droppedSampleFrames = 0;\n private startupTime = 0;\n\n private authenticationCallback: AuthenticationCallback = {\n authenticationCompleted: (success: boolean, featureConfigs?: FeatureConfigContainer) => {\n this.featureManager.configureFeatures(success, featureConfigs);\n },\n };\n\n // used only in tests to inject mocks\n constructor(\n config: AnalyticsConfig,\n private adapter: InternalAdapterAPI,\n private readonly backendFactory: BackendFactory,\n private readonly sessionHandler: SessionPersistenceHandler,\n private readonly featureManager: FeatureManager,\n private readonly onErrorDetailEventDispatcher: EventDispatcher,\n ) {\n this.sessionHandler = new SessionPersistenceHandler(config);\n this.adapter = adapter;\n this.backendFactory = backendFactory;\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.config = this.buildDefaultAnalyticsConfigValues(config);\n this.errorDetailTrackingSettingsProvider = {\n get domain() {\n return that.getDomain(that.config);\n },\n get licenseKey() {\n return that.config.key ?? '';\n },\n get impressionId() {\n return that.getCurrentImpressionId() ?? '';\n },\n get collectorConfig() {\n return that.config.config;\n },\n };\n\n const licenseKeyReceivedUnsubscriber = this.adapter.onLicenseKeyReceived.subscribe(\n (eventArgs: {licenseKey: string}) => {\n if (!this.config.key) {\n this.config.key = eventArgs.licenseKey;\n }\n licenseKeyReceivedUnsubscriber();\n },\n );\n\n this.sample = this.setupSample();\n this.init();\n this.setupStateMachineCallbacks();\n const features = this.adapter.initialize(this);\n this.featureManager.registerFeatures(features);\n\n if (this.adapter.adModule) {\n this.adAnalytics = new AdAnalytics(this, this.adapter.adModule);\n }\n\n this.checkForErrorsInConfig(config);\n }\n\n get errorDetailSubscribable(): Subscribable {\n return this.onErrorDetailEventDispatcher;\n }\n\n getPlayerInformationFromAdapter() {\n const player = this.config.player || this.adapter.getPlayerName();\n return {\n player,\n version: player + '-' + this.adapter.getPlayerVersion(),\n playerTech: this.adapter.getPlayerTech(),\n };\n }\n\n init() {\n if (\n this.adapter.supportsDeferredLicenseLoading !== true &&\n (!isValidString(this.config.key) || isBlank(this.config.key))\n ) {\n logger.errorMessageToUser('Invalid analytics license key provided');\n return;\n }\n\n logger.initialize(this.config.debug);\n\n this.featureManager.resetFeatures();\n this.backend = this.createBackend(this.config);\n this.videoStartupTime = 0;\n\n this.setConfigParameters();\n\n this.generateNewImpressionId();\n this.setUserId();\n\n if (this.adapter.videoCompletionTracker) {\n this.adapter.videoCompletionTracker.reset();\n }\n\n this.adapter.qualityChangeService.resetValues();\n this.adapter.ssaiService.resetSourceRelatedState();\n }\n\n release() {\n this.backend = new NoOpBackend();\n this.adAnalytics?.release();\n this.adapter.qualityChangeService.stopResetInterval();\n }\n\n setConfigParameters() {\n this.sample.key = this.config.key;\n this.sample.playerKey = this.config.playerKey;\n if (this.config.player) {\n this.sample.player = this.config.player;\n }\n this.sample.domain = this.getDomainFromConfig(this.config) ?? Utils.sanitizePath(window.location.hostname);\n this.sample.deviceInformation = createDeviceInformationFromConfig(this.config);\n this.sample.cdnProvider = this.config.cdnProvider;\n this.sample.videoId = this.config.videoId;\n this.sample.videoTitle = this.config.title;\n this.sample.customUserId = this.config.userId ?? this.config.customUserId;\n\n Utils.transferCustomDataFields(this.config, this.sample);\n\n this.sample.experimentName = this.config.experimentName;\n }\n\n generateNewImpressionId() {\n this.sample.impressionId = Utils.generateUUID();\n }\n\n setUserId() {\n this.sample.userId = this.sessionHandler.userId;\n }\n\n setupStateMachineCallbacks() {\n // All of these are called in the onLeaveState Method.\n // So it's the last sample\n this.adapter.stateMachineCallbacks.setup = (duration: number, state: string) => {\n logger.log(\n 'Setup bitmovin analytics ' + this.sample.analyticsVersion + ' with impressionId: ' + this.sample.impressionId,\n );\n\n this.setDuration(duration);\n this.setState(state);\n this.playerStartupTime = this.sample.playerStartupTime = duration;\n\n if (window.performance && window.performance.timing) {\n const loadTime = Utils.getCurrentTimestamp() - window.performance.timing.navigationStart;\n this.pageLoadTime = this.sample.pageLoadTime = loadTime;\n }\n\n this.startupTime = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n\n this.sample.pageLoadTime = 0;\n };\n\n this.adapter.stateMachineCallbacks.startup = (duration: number, state: string) => {\n this.sample.supportedVideoCodecs = CodecHelper.supportedVideoFormats;\n this.setState(state);\n\n // videoStartupTime has to be > 0 on startup sample\n // it is used to mark a successfull impression and billing depends on it\n const sanitizedStartupDuration = Math.max(duration, 1);\n\n const startupTimeSum = (this.startupTime || 0) + sanitizedStartupDuration;\n this.sample.startupTime = startupTimeSum;\n this.startupTime = startupTimeSum;\n\n this.setDuration(sanitizedStartupDuration);\n this.videoStartupTime = sanitizedStartupDuration;\n this.sample.videoStartupTime = sanitizedStartupDuration;\n\n this.autoplay = this.sample.autoplay = this.adapter.getAutoPlay();\n this.adapter.qualityChangeService.setStartupHasFinished();\n\n const drmPerformance = this.adapter.getDrmPerformanceInfo();\n if (drmPerformance != null) {\n this.sample.drmType = drmPerformance.drmType;\n this.sample.drmLoadTime = drmPerformance.drmLoadTime;\n }\n\n this.sendAnalyticsRequestAndClearValues();\n this.sample.autoplay = undefined;\n };\n\n this.adapter.stateMachineCallbacks.playing = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n this.sample.played = duration;\n this.setCompletionValues();\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.unload = (duration: number, state: string) => {\n let videoStartForClosedState = this.sample.videoTimeStart;\n if (state === 'playing') {\n this.setDuration(duration);\n this.setState(state);\n this.sample.played = duration;\n this.setCompletionValues();\n this.sendUnloadRequest();\n if (Utils.isNumber(this.sample.videoTimeEnd)) {\n videoStartForClosedState = this.sample.videoTimeEnd;\n }\n }\n\n if (this.videoStartupTime > 0) {\n this.setVideoTimeStart(videoStartForClosedState);\n this.setVideoTimeEnd(videoStartForClosedState);\n this.clearValues();\n this.setState('closed');\n this.sendUnloadRequest();\n }\n };\n\n this.adapter.stateMachineCallbacks.heartbeat = (\n duration: number,\n state: string,\n heartbeatPayload: HeartbeatPayload,\n ) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample = {\n ...this.sample,\n ...heartbeatPayload,\n };\n\n if (state === 'playing') {\n this.setCompletionValues();\n }\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.qualitychange = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.qualitychange_pause = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.qualitychange_rebuffering = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.videoChange = (event: any) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.setPlaybackVideoPropertiesFromEvent(event);\n };\n\n this.adapter.stateMachineCallbacks.audioChange = (event: any) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.setPlaybackAudioPropertiesFromEvent(event);\n };\n\n this.adapter.stateMachineCallbacks.audiotrack_changing = () => {\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.pause = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.paused = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.paused_seeking = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.seeked = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.end_play_seeking = (duration: number, state: string) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample.seeked = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.rebuffering = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.buffered = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.videoStartFailed = (\n event: Readonly,\n sendRequest = true,\n ) => {\n this.setState('startup');\n this.sample.videoStartFailed = true;\n this.sample.videoStartFailedReason = event.reason.reason;\n if (event.reason.errorCode != null) {\n this.sample.errorCode = event.reason.errorCode.code;\n this.sample.errorMessage = event.reason.errorCode.message;\n if (sendRequest) {\n this.onErrorDetailEventDispatcher.dispatch({\n ...event.reason.errorCode,\n });\n }\n }\n if (sendRequest) {\n this.sendAnalyticsRequestAndClearValues();\n }\n };\n\n this.adapter.stateMachineCallbacks.error = (event: Readonly) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n\n this.setState('error');\n this.sample.errorCode = event.code;\n this.sample.errorMessage = event.message;\n this.sample.errorData = JSON.stringify(event.legacyData);\n this.sample.errorSegments = this.adapter.segments.map((s) => s.name);\n\n if (this.adapter.onError) {\n this.adapter.onError();\n }\n\n this.onErrorDetailEventDispatcher.dispatch({\n code: event.code,\n message: event.message,\n errorData: event.data,\n });\n\n this.sendAnalyticsRequestAndClearValues();\n\n delete this.sample.errorCode;\n delete this.sample.errorMessage;\n delete this.sample.errorData;\n };\n\n this.adapter.stateMachineCallbacks.ad = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n this.sample.ad = AD_TYPE.CSAI;\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.mute = () => {\n this.sample.isMuted = true;\n };\n\n this.adapter.stateMachineCallbacks.unMute = () => {\n this.sample.isMuted = false;\n };\n\n this.adapter.stateMachineCallbacks.subtitle_changing = () => {\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent = (event: any) => {\n if (Utils.isNumber(event.currentTime)) {\n this.setVideoTimeEnd(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent = (event: any) => {\n if (Utils.isNumber(event.currentTime)) {\n this.setVideoTimeStart(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.manualSourceChange = (event: {config: AnalyticsConfig}) => {\n this.adapter.resetSourceRelatedState();\n this.sample = this.setupSample();\n this.startupTime = 0;\n this.config = Object.keys(event.config).length > 0 ? event.config : this.config;\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.playlistTransition = (_event: EventData.AnalyticsEventBase) => {\n this.sample = this.setupSample();\n this.startupTime = 0;\n // init is needed because of resetting sequence number which\n // is done inside SequenceNumberBackend\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.initialSourceChange = (event: {config: AnalyticsConfig}) => {\n this.config = event.config;\n this.setConfigParameters();\n };\n\n // The video has ended and we set up for a new impression\n this.adapter.stateMachineCallbacks.end = () => {\n this.sample = this.setupSample();\n this.startupTime = 0;\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.release = () => {\n this.release();\n };\n\n this.adapter.stateMachineCallbacks.customdatachange = (\n _duration?: number,\n _state?: string,\n event?: {values: CustomDataValues},\n ) => {\n if (event && event.values) {\n this.changeCustomData(event.values);\n }\n };\n }\n\n guardAgainstMissingVideoTitle = (oldConfig: AnalyticsConfig, newConfig: AnalyticsConfig | undefined) => {\n if (oldConfig && newConfig && oldConfig.title && !newConfig.title) {\n logger.error('The new analytics configuration does not contain the field `title`');\n }\n };\n\n guardAgainstMissingIsLive = (oldConfig: AnalyticsConfig, newConfig: AnalyticsConfig | undefined) => {\n if (oldConfig != null && newConfig != null && oldConfig.isLive && newConfig.isLive == null) {\n logger.error(\n 'The new analytics configuration does not contain the field `isLive`. It will default to `false` which might be unintended? Once stream playback information is available the type will be populated.',\n );\n }\n };\n\n sourceChange = (config: AnalyticsConfig | undefined) => {\n logger.log('Processing Source Change for Analytics', config);\n if (config == null) {\n this.adapter.sourceChange(this.config);\n return;\n }\n\n this.guardAgainstMissingVideoTitle(this.config, config);\n this.guardAgainstMissingIsLive(this.config, config);\n\n const newConfig = {\n ...removeSourceRelatedFields(this.config),\n ...config,\n config: mergeCollectorConfig(this.config.config, config.config),\n };\n this.adapter.sourceChange(newConfig);\n };\n\n setCustomDataOnce = (values: CustomDataValues) => {\n const oldConfig = {...this.config};\n this.setState('customdatachange');\n this.changeCustomData(values);\n this.sendAnalyticsRequestAndClearValues();\n // this method doesn't call changeCustomData() second time because in that method we have check for null values\n // to prevent overriding existing customData values with null if some field in object doesn't have value\n // because of that if some customData field had previous value null and it got changed to something else\n // it will not be possible to return it back to null using that method\n this.config = {...oldConfig};\n this.setConfigParameters();\n };\n\n setCustomData = (values: CustomDataValues) => {\n this.adapter.setCustomData(values);\n };\n\n getCurrentImpressionId = (): string | undefined => {\n return this.sample.impressionId;\n };\n\n getUserId = (): string => {\n return this.sessionHandler.userId;\n };\n\n setDuration(duration: number) {\n this.sample.duration = duration;\n }\n\n setState(state: string) {\n this.sample.state = state;\n }\n\n setPlaybackVideoPropertiesFromEvent(event: any) {\n if (Utils.isNumber(event.width)) {\n this.sample.videoPlaybackWidth = event.width;\n }\n if (Utils.isNumber(event.height)) {\n this.sample.videoPlaybackHeight = event.height;\n }\n if (Utils.isNumber(event.bitrate)) {\n this.sample.videoBitrate = event.bitrate;\n }\n if (isValidString(event.codec)) {\n this.sample.videoCodec = event.codec;\n }\n }\n\n setPlaybackAudioPropertiesFromEvent(event: any) {\n if (Utils.isNumber(event.bitrate)) {\n this.sample.audioBitrate = event.bitrate;\n }\n if (isValidString(event.codec)) {\n this.sample.audioCodec = event.codec;\n }\n }\n\n setPlaybackInfoFromAdapter() {\n const info = this.adapter.getCurrentPlaybackInfo();\n if (!info) {\n return;\n }\n\n // For the setup sample we should only consider the config isLive flag\n // because the players can not recognize live streams correctly at this point in time\n this.sample.isLive = this.getIsLiveFromConfigOrPlaybackInfo(\n this.config,\n this.sample.state === 'setup' ? undefined : info.isLive,\n );\n\n if (isValidString(info.size)) {\n this.sample.size = info.size;\n }\n if (isValidString(info.playerTech)) {\n this.sample.playerTech = info.playerTech;\n }\n if (Utils.isNumber(info.videoDuration)) {\n this.sample.videoDuration = Utils.calculateTime(info.videoDuration || 0);\n }\n if (isValidString(info.streamFormat)) {\n this.sample.streamFormat = info.streamFormat;\n }\n if (isValidString(info.mpdUrl)) {\n this.sample.mpdUrl = info.mpdUrl;\n }\n if (isValidString(info.m3u8Url)) {\n this.sample.m3u8Url = info.m3u8Url;\n }\n if (isValidString(info.progUrl)) {\n this.sample.progUrl = info.progUrl;\n }\n if (Utils.isNumber(info.videoWindowWidth)) {\n this.sample.videoWindowWidth = info.videoWindowWidth;\n }\n if (Utils.isNumber(info.videoWindowHeight)) {\n this.sample.videoWindowHeight = info.videoWindowHeight;\n }\n if (Utils.isNumber(info.screenHeight)) {\n this.sample.screenHeight = info.screenHeight;\n }\n if (Utils.isNumber(info.screenWidth)) {\n this.sample.screenWidth = info.screenWidth;\n }\n if (Utils.isBoolean(info.isMuted)) {\n this.sample.isMuted = info.isMuted;\n }\n if (Utils.isBoolean(info.isCasting)) {\n this.sample.isCasting = info.isCasting;\n }\n if (isValidString(info.castTech)) {\n this.sample.castTech = info.castTech;\n }\n if (isValidString(info.videoTitle) && !this.config.title) {\n this.sample.videoTitle = info.videoTitle;\n }\n if (isValidString(info.audioCodec)) {\n this.sample.audioCodec = info.audioCodec;\n }\n if (isValidString(info.videoCodec)) {\n this.sample.videoCodec = info.videoCodec;\n }\n if (isValidString(info.audioLanguage)) {\n this.sample.audioLanguage = info.audioLanguage;\n }\n if (Utils.isBoolean(info.subtitleEnabled)) {\n this.sample.subtitleEnabled = info.subtitleEnabled;\n }\n if (isValidString(info.subtitleLanguage)) {\n this.sample.subtitleLanguage = info.subtitleLanguage;\n } else {\n this.sample.subtitleLanguage = undefined;\n }\n if (Utils.isNumber(info.droppedFrames)) {\n this.sample.droppedFrames = Math.max(info.droppedFrames - this.droppedSampleFrames, 0);\n this.droppedSampleFrames = info.droppedFrames;\n }\n }\n\n setupSample(): Sample {\n this.droppedSampleFrames = 0;\n\n return {\n platform: 'web',\n playerStartupTime: 0,\n pageLoadType: Utils.getPageLoadType(),\n path: Utils.sanitizePath(window.location.pathname),\n language: navigator.language || (navigator as any).userLanguage,\n userAgent: navigator.userAgent,\n screenWidth: screen.width,\n screenHeight: screen.height,\n isLive: this.config.isLive ?? false,\n videoDuration: 0,\n size: PlayerSize.Window,\n time: 0,\n videoWindowWidth: 0,\n videoWindowHeight: 0,\n droppedFrames: 0,\n played: 0,\n buffered: 0,\n paused: 0,\n ad: 0,\n seeked: 0,\n videoPlaybackWidth: 0,\n videoPlaybackHeight: 0,\n videoBitrate: 0,\n audioBitrate: 0,\n videoTimeStart: 0,\n videoTimeEnd: 0,\n videoStartupTime: 0,\n duration: 0,\n startupTime: 0,\n analyticsVersion: VERSION,\n pageLoadTime: 0,\n completedTotal: 0,\n ...this.getPlayerInformationFromAdapter(),\n };\n }\n\n sendAnalyticsRequest() {\n this.setPlaybackInfoFromAdapter();\n this.sample.time = Utils.getCurrentTimestamp();\n this.sample.downloadSpeedInfo = this.adapter.downloadSpeedInfo;\n\n this.adapter.ssaiService.manipulate(this.sample);\n\n // Initial quality info should be available for the first sample after setup, so if there is no quality info yet, we try to set it *before* sending a sample.\n // In the general case, a qualitychange event first triggers a sample of the state we were in before the qualitychange sample itself is sent.\n // So to only report quality updates on the qualitychange sample and not the ones before it, we need to update the quality info *after* sending a sample,\n // making it available for future samples (e.g. qualitychange sample).\n // We only check videoBitrate and not audioBitrate since the latter is often reported as null/0 anyways.\n if (this.sample.videoBitrate == null || this.sample.videoBitrate <= 0) {\n setQualityInfoOnSample(this.sample, this.adapter.getCurrentPlaybackInfo());\n const copySample = {...this.sample};\n this.backend.sendRequest(copySample);\n } else {\n const copySample = {...this.sample};\n this.backend.sendRequest(copySample);\n setQualityInfoOnSample(this.sample, this.adapter.getCurrentPlaybackInfo());\n }\n }\n\n sendAnalyticsRequestAndClearValues() {\n this.sendAnalyticsRequest();\n this.clearValues();\n }\n\n sendSsaiEngagementAdSample(data: SsaiEngagementInteractionData) {\n if (this.config.config?.ssaiEngagementTrackingEnabled !== true) {\n // if not enabled in config, do not send SSAI engagement AdSample\n return;\n }\n\n if (isSsaiEngagementStartedData(data)) {\n const ssaiAdSample = createStartedAdSample(this.sample, data);\n\n this.backend.sendAdRequest(ssaiAdSample);\n return;\n }\n\n if (isSsaiEngagementQuartileData(data)) {\n const ssaiAdSample = createQuartileAdSample(this.sample, data);\n\n this.backend.sendAdRequest(ssaiAdSample);\n return;\n }\n\n if (isSsaiEngagementErrorData(data)) {\n const ssaiErrorAdSample = createErrorAdSample(this.sample, data);\n\n this.backend.sendAdRequest(ssaiErrorAdSample);\n return;\n }\n }\n\n sendUnloadRequest() {\n this.backend.sendUnloadRequest(this.sample);\n }\n\n clearValues() {\n this.sample.ad = 0;\n this.sample.paused = 0;\n this.sample.played = 0;\n this.sample.seeked = 0;\n this.sample.buffered = 0;\n\n this.sample.playerStartupTime = 0;\n this.sample.videoStartupTime = 0;\n this.sample.startupTime = 0;\n this.sample.castTech = undefined;\n\n this.sample.duration = 0;\n this.sample.droppedFrames = 0;\n\n this.sample.drmLoadTime = undefined;\n\n this.sample.videoStartFailed = undefined;\n this.sample.videoStartFailedReason = undefined;\n\n this.sample.completed = undefined;\n\n this.sample.adId = undefined;\n this.sample.adSystem = undefined;\n this.sample.adPosition = undefined;\n this.sample.adIndex = undefined;\n\n this.sample[SSAI_RELATED_SAMPLE_MARKER] = undefined;\n\n this.adapter.clearValues();\n }\n\n getIsLiveFromConfigOrPlaybackInfo(config: AnalyticsConfig, isLiveFromPlayback?: boolean): boolean {\n if (isLiveFromPlayback == null) {\n return config.isLive || false;\n }\n return Utils.isBoolean(isLiveFromPlayback) ? isLiveFromPlayback : false;\n }\n\n /**\n * This method sanitizes the input and updates the analytics config.\n * @param values Object containing the customData and other fields\n */\n private changeCustomData = (values: CustomDataValues) => {\n this.config = {\n ...this.config,\n ...extractCustomDataFieldsOnly(values),\n };\n this.setConfigParameters();\n };\n\n private buildDefaultAnalyticsConfigValues(config: AnalyticsConfig): AnalyticsConfig {\n if (!Utils.isBoolean(config.isLive)) {\n config.isLive = false;\n }\n return config;\n }\n\n private checkForErrorsInConfig(config: AnalyticsConfig) {\n if (config.customUserId != null && config.userId != null) {\n logger.warn(\n 'Configuration Warning: \\nCustomUserId and UserId are set in the config \\nValue of UserId will be used in sample \\nPlease only use one configuartion field to set your userId',\n );\n }\n }\n\n private getDomainFromConfig(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n return collectorConfig != null && collectorConfig.origin != null ? collectorConfig.origin : undefined;\n }\n\n private createBackend(config: AnalyticsConfig): Backend {\n const domain = this.getDomain(config);\n return this.backendFactory.createBackend(\n config,\n {key: config.key, domain, version: VERSION},\n this.adapter,\n this.authenticationCallback,\n );\n }\n\n private getDomain(config: AnalyticsConfig) {\n const domainFromConfig = this.getDomainFromConfig(config);\n return domainFromConfig || Utils.sanitizePath(window.location.hostname);\n }\n\n private setCompletionValues() {\n if (this.adapter.videoCompletionTracker) {\n const completed = this.adapter.videoCompletionTracker.addWatched({\n start: this.sample.videoTimeStart,\n end: this.sample.videoTimeEnd,\n } as Timespan);\n const completedTotal = this.adapter.videoCompletionTracker.getCompletionPercentage();\n\n if (!Number.isNaN(completed) && !Number.isNaN(completedTotal)) {\n this.sample.completed = completed;\n this.sample.completedTotal = completedTotal;\n }\n }\n }\n\n private setVideoTimeStart(value: number | undefined) {\n this.sample.videoTimeStart = value;\n }\n\n private setVideoTimeEnd(value: number | undefined) {\n this.sample.videoTimeEnd = value;\n }\n\n private sendQualityChange(state: string, duration: number): void {\n this.adapter.qualityChangeService.startResetInterval();\n\n this.adapter.qualityChangeService.increaseCounter();\n if (!this.adapter.qualityChangeService.isQualityChangeEventEnabled()) {\n this.setDuration(duration);\n this.adapter.stateMachineCallbacks.error({\n ...ErrorCode.QUALITY_CHANGE_THRESHOLD_EXCEEDED,\n legacyData: undefined,\n currentTime: undefined,\n data: {\n /*TODO additionalData: 'Add description for this error'*/\n },\n });\n } else {\n setQualityInfoOnSample(this.sample, this.adapter.getCurrentPlaybackInfo());\n this.setDuration(duration);\n this.setState(state);\n this.sendAnalyticsRequestAndClearValues();\n }\n }\n\n static create(config: AnalyticsConfig, adapter: InternalAdapterAPI): Analytics {\n const backendFactory: BackendFactory = new BackendFactory();\n const sessionHandler: SessionPersistenceHandler = new SessionPersistenceHandler(config);\n const featureManager = new FeatureManager();\n const onErrorDetailEventDispatcher = new EventDispatcher();\n return new Analytics(config, adapter, backendFactory, sessionHandler, featureManager, onErrorDetailEventDispatcher);\n }\n}\n\n// We separate the quality info from `setPlaybackInfoFromAdapter` to be able to explicity set/update the quality info only when it changes.\nexport function setQualityInfoOnSample(sample: Sample, playbackInfo: PlaybackInfo) {\n if (Utils.isNumber(playbackInfo.videoPlaybackHeight)) {\n sample.videoPlaybackHeight = playbackInfo.videoPlaybackHeight;\n }\n if (Utils.isNumber(playbackInfo.videoPlaybackWidth)) {\n sample.videoPlaybackWidth = playbackInfo.videoPlaybackWidth;\n }\n if (Utils.isNumber(playbackInfo.videoBitrate)) {\n sample.videoBitrate = playbackInfo.videoBitrate;\n }\n if (Utils.isNumber(playbackInfo.audioBitrate)) {\n sample.audioBitrate = playbackInfo.audioBitrate;\n }\n}\n\nexport function mergeCollectorConfig(\n oldCollectorConfig: CollectorConfig | undefined,\n newCollectorConfig: CollectorConfig | undefined,\n): CollectorConfig {\n if (newCollectorConfig != null) {\n // merging new config should enable the collector by default (unless explicitly disabled in the new config)\n return {...oldCollectorConfig, enabled: true, ...newCollectorConfig};\n }\n return oldCollectorConfig ?? {};\n}\n\nexport const createDeviceInformationFromConfig = (config: AnalyticsConfig): Sample['deviceInformation'] | undefined => {\n const deviceInformation: Sample['deviceInformation'] = {};\n\n if (isValidString(config.deviceType) && !isBlank(config.deviceType)) {\n // we are using `deviceInformation.model` field to pass `config.deviceType`, because of ingress\n // and how deviceInformation processing is implemented there.\n deviceInformation.model = config.deviceType;\n }\n\n if (isValidString(config.deviceClass) && !isBlank(config.deviceClass)) {\n deviceInformation.deviceClass = config.deviceClass;\n }\n\n if (Object.keys(deviceInformation).length === 0) {\n return undefined;\n }\n\n return deviceInformation;\n};\n","import {DeferredLicenseLoadingAdapterAPI} from '../adapters/internal/DeferredLicenseLoadingAdapterAPI';\nimport {AnalyticsConfig, CollectorConfig} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {LicensingRequest} from '../types/LicensingRequest';\nimport {LicenseCall} from '../utils/LicenseCall';\nimport {ANALYTICS_BACKEND_BASE_URL} from '../utils/Settings';\n\nimport {Backend} from './Backend';\nimport {DebuggingBackend} from './DebuggingBackend';\nimport {LicenseCheckingBackend} from './LicenseCheckingBackend';\nimport {LongPlaytimeFilteringBackend} from './LongPlaytimeFilteringBackend';\nimport {NoOpBackend} from './NoOpBackend';\nimport {SequenceNumberBackend} from './SequenceNumberBackend';\n\ninterface InternalCollectorConfig extends CollectorConfig {\n wrapBackend: (innerBackend: Backend) => Backend;\n}\n\nexport class BackendFactory {\n createBackend(\n analyticsConfig: AnalyticsConfig,\n licensingRequest: LicensingRequest,\n adapter: DeferredLicenseLoadingAdapterAPI,\n authenticationCallback: AuthenticationCallback,\n ): Backend {\n if (!this.isEnabled(analyticsConfig)) {\n return new NoOpBackend();\n }\n const inner = this.createInnerBackend(analyticsConfig, licensingRequest, adapter, authenticationCallback);\n return this.decorateWithDebuggingBackend(analyticsConfig, inner);\n }\n\n private decorateWithDebuggingBackend(config: AnalyticsConfig, backend: Backend): Backend {\n if (config.debug) {\n return new DebuggingBackend(config, backend);\n }\n return backend;\n }\n\n private decorateWithBackendFromConfigIfAvailable(analyticsConfig: AnalyticsConfig, innerBackend: Backend): Backend {\n if (\n analyticsConfig !== undefined &&\n analyticsConfig.config !== undefined &&\n (analyticsConfig.config as InternalCollectorConfig).wrapBackend !== undefined\n ) {\n return (analyticsConfig.config as InternalCollectorConfig).wrapBackend(innerBackend);\n }\n\n return innerBackend;\n }\n\n private isEnabled(analyticsConfig: AnalyticsConfig): boolean {\n return analyticsConfig.config === undefined || analyticsConfig.config.enabled !== false;\n }\n\n private createInnerBackend(\n analyticsConfig: AnalyticsConfig,\n licensingRequest: LicensingRequest,\n adapter: DeferredLicenseLoadingAdapterAPI,\n authenticationCallback: AuthenticationCallback,\n ): Backend {\n const backendUrl = (analyticsConfig.config && analyticsConfig.config.backendUrl) || ANALYTICS_BACKEND_BASE_URL;\n let innerBackend: Backend = new LicenseCheckingBackend(\n licensingRequest,\n LicenseCall,\n backendUrl,\n adapter,\n authenticationCallback,\n );\n innerBackend = this.decorateWithBackendFromConfigIfAvailable(analyticsConfig, innerBackend);\n\n const sequenceNumberAssigningBackend = new SequenceNumberBackend(innerBackend);\n return new LongPlaytimeFilteringBackend(sequenceNumberAssigningBackend);\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport type {AnalyticsConfig, AnalyticsDebugConfig} from '../types/AnalyticsConfig';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\n\nimport {Backend} from './Backend';\n\n/**\n * The `DebuggingBackend` is responsible for printing debugging information\n * before forwarding the requests to the specified underlying backend.\n *\n * This allows for inspection of specific fields in the sample data before it is sent.\n * The fields can be specified through the {@link AnalyticsDebugConfig#fields}.\n *\n * @implements {Backend}\n * */\nexport class DebuggingBackend implements Backend {\n private underlying: Backend;\n private debugFields?: string[];\n\n constructor(config: AnalyticsConfig, underlying: Backend) {\n this.underlying = underlying;\n if (config.debug && (config.debug as AnalyticsDebugConfig).fields) {\n this.debugFields = (config.debug as AnalyticsDebugConfig).fields;\n }\n }\n\n sendRequest(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendRequest(sample);\n }\n\n sendUnloadRequest(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendRequestSynchronous(sample);\n }\n\n sendAdRequest(sample: AdAnalyticsSample & AdBreakSample & AdSample) {\n this.underlying.sendAdRequest(sample);\n }\n\n private printFields(sample: Sample) {\n if (this.debugFields && this.debugFields.length) {\n const fields = {};\n this.debugFields.forEach((f) => (fields[f] = sample[f]));\n logger.table([fields]);\n }\n }\n}\n","import {DownloadSpeedInfo} from '../types/DownloadSpeedInfo';\nimport {SpeedMeasurement} from '../types/SpeedMeasurement';\nimport {Converter} from '../utils/Converter';\n\nimport {Measure} from './Measure';\n\nexport class DownloadSpeedMeter {\n protected measures: Measure[];\n\n constructor() {\n this.measures = [];\n }\n\n reset(): void {\n this.measures = [];\n }\n\n addMeasurement(measurement: SpeedMeasurement): void {\n if (measurement.httpStatus >= 400) {\n return;\n }\n const measure = new Measure(measurement);\n\n const threshold = Converter.bitsToBytes(300 * 1000 * 1000); // 300 Megabit per second in bytes\n if (measure.speed >= threshold) {\n return;\n }\n\n this.measures.push(measure);\n }\n\n getInfo(): DownloadSpeedInfo {\n return {\n segmentsDownloadCount: this.measures.length,\n segmentsDownloadSize: this.measures.map((m) => m.size).reduce(this.add, 0),\n segmentsDownloadTime: Math.ceil(this.totalTime() * 1000),\n avgDownloadSpeed: this.avgSpeed(),\n minDownloadSpeed: this.minSpeed(),\n maxDownloadSpeed: this.maxSpeed(),\n avgTimeToFirstByte: this.avgTimeToFirstByte(),\n };\n }\n\n private add(a: number, b: number): number {\n return a + b;\n }\n\n private avgSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n const totalSpeed = this.speeds().reduce((a, b) => {\n return a + b;\n }, 0);\n const numMeasurements = this.measures.length;\n return this.bytePerSecondToBitPerSecond(totalSpeed / numMeasurements);\n }\n\n private bytePerSecondToBitPerSecond(bps: number): number {\n return Converter.bytesToBits(bps);\n }\n\n private minSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.bytePerSecondToBitPerSecond(Math.min(...this.speeds()));\n }\n\n private speeds(): number[] {\n return this.measures.map((m) => {\n return m.speed;\n });\n }\n\n private maxSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.bytePerSecondToBitPerSecond(Math.max(...this.speeds()));\n }\n\n private totalTime(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.measures.reduce((a, b) => {\n return a + b.duration;\n }, 0);\n }\n\n private avgTimeToFirstByte(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n const avg =\n this.measures.reduce((a, b) => {\n return a + b.timeToFirstByte * 1000;\n }, 0) / this.measures.length;\n\n return Math.ceil(avg);\n }\n}\n","export interface Subscribable {\n subscribe(callback: EventHandler): () => void;\n unsubscribe(callback: EventHandler);\n}\n\ntype EventHandler = (args: TArgs) => void;\n\nexport class EventDispatcher implements Subscribable {\n private callbacks: Array> = [];\n\n subscribe(callback: EventHandler): () => void {\n this.callbacks.push(callback);\n\n return () => this.unsubscribe(callback);\n }\n\n dispatch(args: TArgs) {\n const callbacks = this.callbacks.slice(0);\n callbacks.forEach((callback) => {\n callback(args);\n });\n }\n\n unsubscribe(callback: EventHandler) {\n const index = this.callbacks.indexOf(callback);\n if (index > -1) {\n this.callbacks.splice(index, 1);\n }\n }\n\n get subscriberCount() {\n return this.callbacks.length;\n }\n}\n","import {AnalyticsEventBase} from '../types/EventData';\n\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 59700;\n\nexport interface HeartbeatListener {\n onHeartbeat: (eventObject: AnalyticsEventBase) => void;\n}\n\nexport class HeartbeatService {\n private heartbeatInterval: number | undefined;\n private listener: HeartbeatListener | undefined;\n private readonly getPlayerCurrentTime: () => number;\n\n constructor(getPlayerCurrentTime: () => number) {\n this.getPlayerCurrentTime = getPlayerCurrentTime;\n }\n\n setListener(listener: HeartbeatListener) {\n this.listener = listener;\n }\n\n startHeartbeat() {\n if (this.heartbeatInterval !== undefined) {\n this.clearHeartbeat();\n }\n this.heartbeatInterval = window.setInterval(() => {\n const eventData: AnalyticsEventBase = {\n currentTime: this.getPlayerCurrentTime(),\n };\n this.listener?.onHeartbeat(eventData);\n }, DEFAULT_HEARTBEAT_INTERVAL_MS);\n }\n\n stopHeartbeat() {\n this.clearHeartbeat();\n }\n\n private clearHeartbeat() {\n window.clearTimeout(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n}\n","import {DeferredLicenseLoadingAdapterAPI} from '../adapters/internal/DeferredLicenseLoadingAdapterAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {LicenseCallFunc, LicensingRequest, LicensingResponse, LicensingResult} from '../types/LicensingRequest';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport {ANALYTICS_LICENSECALL_TIMEOUT} from '../utils/Settings';\n\nimport {Backend} from './Backend';\nimport {NoOpBackend} from './NoOpBackend';\nimport {QueueBackend} from './QueueBackend';\nimport {RemoteBackend} from './RemoteBackend';\n\n/**\n * The `LicenseCheckingBackend` class is responsible for sending license requests\n * and routing samples to the appropriate backend based on the license status.\n *\n * The class manages a queue of samples during the license check process, ensuring that\n * samples are not lost while the license status is being determined. Once the license\n * is validated, the queued samples are flushed to the appropriate backend.\n *\n * @implements {Backend}\n */\nexport class LicenseCheckingBackend implements Backend {\n promise?: Promise;\n private licenseLazyLoadingTimeoutHandle?: number;\n private backend: Backend;\n private info: LicensingRequest;\n\n constructor(\n info: LicensingRequest,\n private licenseCall: LicenseCallFunc,\n private backendBaseUrl: string,\n private adapter: DeferredLicenseLoadingAdapterAPI,\n private authenticationCallback: AuthenticationCallback,\n ) {\n this.info = {...info};\n this.backend = new QueueBackend();\n this.licenseCall = licenseCall;\n\n if (info.key !== undefined && info.key !== '') {\n this.promise = this.wrapLicenseCheckPromiseWithCallback(this.performLicenseCheck(), this.authenticationCallback);\n } else if (adapter.supportsDeferredLicenseLoading === true) {\n adapter.onLicenseKeyReceived.subscribe(this.licenseKeyReceived);\n adapter.onLicenseCallFailed.subscribe(this.licenseCallFailed);\n this.licenseLazyLoadingTimeoutHandle = window.setTimeout(\n this.licenseLazyLoadingTimeout,\n ANALYTICS_LICENSECALL_TIMEOUT,\n );\n } else {\n authenticationCallback.authenticationCompleted(false, undefined);\n this.backend = new NoOpBackend();\n }\n }\n\n performLicenseCheck(): Promise {\n const {key, domain, version} = this.info;\n if (!key || key === '') {\n const error: LicensingResponse = {\n status: LicensingResult.Denied,\n message: 'No license key provided',\n };\n this.backend = new NoOpBackend();\n return Promise.resolve(error);\n }\n\n return this.licenseCall(key, domain, version, this.backendBaseUrl)\n .then((result) => {\n if (result.status === LicensingResult.Granted) {\n const remoteBackend = new RemoteBackend(true, this.backendBaseUrl, key);\n (this.backend as QueueBackend).flushTo(remoteBackend);\n this.backend = remoteBackend;\n } else {\n throw new Error(result.message);\n }\n return result;\n })\n .catch((err: Error) => {\n if (err.message === 'Ignoring Impression due to DNT Header being set') {\n logger.error('License Check for Bitmovin Analytics failed because of', err);\n } else {\n logger.errorMessageToUser('License Check for Bitmovin Analytics failed because of', err);\n }\n this.backend = new NoOpBackend();\n return {\n status: LicensingResult.Denied,\n message: err.message,\n };\n });\n }\n\n sendRequest(sample: Sample) {\n this.backend.sendRequest(sample);\n }\n sendUnloadRequest(sample: Sample) {\n this.backend.sendUnloadRequest(sample);\n }\n sendRequestSynchronous(sample: Sample) {\n this.backend.sendRequestSynchronous(sample);\n }\n sendAdRequest(sample: AdAnalyticsSample & AdBreakSample & AdSample) {\n this.backend.sendAdRequest(sample);\n }\n\n private licenseKeyReceived = (eventArgs: {licenseKey: string}) => {\n clearTimeout(this.licenseLazyLoadingTimeoutHandle);\n this.unsubscribeFromAdapter();\n this.info.key = eventArgs.licenseKey;\n this.promise = this.wrapLicenseCheckPromiseWithCallback(this.performLicenseCheck(), this.authenticationCallback);\n };\n\n private licenseCallFailed = () => {\n clearTimeout(this.licenseLazyLoadingTimeoutHandle);\n this.unsubscribeFromAdapter();\n this.backend = new NoOpBackend();\n this.authenticationCallback.authenticationCompleted(false, undefined);\n };\n\n private licenseLazyLoadingTimeout = () => {\n this.unsubscribeFromAdapter();\n this.backend = new NoOpBackend();\n this.authenticationCallback.authenticationCompleted(false, undefined);\n };\n\n private unsubscribeFromAdapter() {\n this.adapter.onLicenseKeyReceived.unsubscribe(this.licenseKeyReceived);\n this.adapter.onLicenseCallFailed.unsubscribe(this.licenseCallFailed);\n }\n\n private wrapLicenseCheckPromiseWithCallback(\n promise: Promise,\n authenticationCallback: AuthenticationCallback,\n ): Promise {\n return promise.then((response) => {\n authenticationCallback.authenticationCompleted(response.status === LicensingResult.Granted, response.features);\n return response;\n });\n }\n}\n","import {Sample} from '../types/Sample';\n\nimport {Backend} from './Backend';\n\n/**\n * The `LongPlaytimeFilteringBackend` is a decorator class that filters out samples\n * where the `played` time exceeds a specified threshold.\n *\n * If a sample's `played` time surpasses the threshold, it is not forwarded to the next backend.\n * Otherwise, the sample is passed along to the next backend for further processing.\n *\n * @implements {Backend}\n */\nexport class LongPlaytimeFilteringBackend implements Backend {\n nextBackend: Backend;\n\n constructor(next: Backend) {\n this.nextBackend = next;\n }\n\n sendRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.nextBackend.sendRequest(sample);\n }\n\n sendUnloadRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.nextBackend.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.nextBackend.sendRequestSynchronous(sample);\n }\n\n sendAdRequest(sample: any) {\n this.nextBackend.sendAdRequest(sample);\n }\n\n private isPlayedAboveThreshold(sample: Sample): boolean {\n return (sample.played == null ? 0 : sample.played) >= 90000;\n }\n}\n","import {SpeedMeasurement} from '../types/SpeedMeasurement';\n\nexport class Measure implements SpeedMeasurement {\n private download: SpeedMeasurement;\n\n get speed(): number {\n return this.download.size / this.download.duration;\n }\n get duration(): number {\n return this.download.duration;\n }\n get size(): number {\n return this.download.size;\n }\n get timeToFirstByte(): number {\n return this.download.timeToFirstByte;\n }\n get timestamp(): Date {\n return this.download.timestamp;\n }\n\n get httpStatus(): number {\n return this.download.httpStatus;\n }\n\n constructor(download: SpeedMeasurement) {\n this.download = download;\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\n\nimport {Backend} from './Backend';\n\n/**\n * The `NoOpBackend` is a no-operation implementation of the `Backend` interface.\n * It serves as a placeholder backend when the actual `Backend` functionality is disabled or not required.\n * E.g. in scenarios such as releasing the adapter or when the Collector is disabled via {@link CollectorConfig#enabled}.\n *\n * Using `NoOpBackend` ensures that the code does not need to handle cases where `Backend` might be undefined,\n * thereby simplifying the logic and reducing the need for null or undefined checks.\n *\n * @implements {Backend}\n */\nexport class NoOpBackend implements Backend {\n sendRequest(_sample: Sample) {\n // empty\n }\n sendUnloadRequest(_sample: Sample) {\n // empty\n }\n sendRequestSynchronous(_sample: Sample) {\n // empty\n }\n sendAdRequest(_sample: AdAnalyticsSample & AdBreakSample & AdSample) {\n // empty\n }\n}\n","import {ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD} from '../utils/Settings';\nimport * as Settings from '../utils/Settings';\n\nconst INITIAL_VALUE = 0;\n\nexport default class QualityChangeService {\n private qualityChangeCount = INITIAL_VALUE;\n private previousVideoBitrate = INITIAL_VALUE;\n private previousAudioBitrate = INITIAL_VALUE;\n private resetIntervalId?: number;\n private startupHasFinished = false;\n\n constructor(private qualityChangeThreshold: number = ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD) {}\n\n resetValues() {\n this.qualityChangeCount = INITIAL_VALUE;\n this.previousAudioBitrate = INITIAL_VALUE;\n this.previousVideoBitrate = INITIAL_VALUE;\n this.startupHasFinished = false;\n this.stopResetInterval();\n }\n\n isQualityChangeEventEnabled(): boolean {\n return this.qualityChangeCount <= this.qualityChangeThreshold;\n }\n\n increaseCounter() {\n this.qualityChangeCount++;\n }\n\n shouldAllowVideoQualityChange(newBitrate: number | undefined): boolean {\n return (\n this.startupHasFinished &&\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousVideoBitrate !== INITIAL_VALUE &&\n this.previousVideoBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n setVideoBitrate(newBitrate: number): void {\n // only bitrates after startup are relevant since some players\n // report initial bitrates before startup that differ from the\n // ones that are used after startup, which would lead to\n // wrong quality change events\n if (this.startupHasFinished) {\n this.previousVideoBitrate = newBitrate;\n }\n }\n\n setStartupHasFinished() {\n this.startupHasFinished = true;\n }\n\n shouldAllowAudioQualityChange(newBitrate: number | undefined): boolean {\n return (\n this.startupHasFinished &&\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousAudioBitrate !== INITIAL_VALUE &&\n this.previousAudioBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n setAudioBitrate(newBitrate: number): void {\n // only bitrates after startup are relevant since some players\n // report initial bitrates before startup that differ from the\n // ones that are used after startup, which would lead to\n // wrong quality change events\n if (this.startupHasFinished) {\n this.previousAudioBitrate = newBitrate;\n }\n }\n\n startResetInterval() {\n if (this.resetIntervalId !== undefined) {\n return;\n }\n\n this.resetIntervalId = window.setInterval(() => {\n this.resetCounter();\n }, Settings.ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL);\n }\n\n stopResetInterval() {\n if (this.resetIntervalId === undefined) {\n return;\n }\n\n window.clearInterval(this.resetIntervalId);\n delete this.resetIntervalId;\n }\n\n private resetCounter() {\n this.qualityChangeCount = 0;\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\n\nimport {Backend} from './Backend';\n\n/**\n * The `QueueBackend` class is responsible for queuing samples for deferred processing.\n * Samples are stored in different queues depending on the sample type and can be flushed\n * to another backend for further processing.\n *\n * This is useful e.g. to still collect sample data while waiting for a license call to succeed.\n *\n * @implements {Backend}\n */\nexport class QueueBackend implements Backend {\n queue: Sample[] = [];\n unloadQueue: Sample[] = [];\n syncQueue: Sample[] = [];\n adQueue: Array = [];\n\n sendRequest(sample: Sample) {\n this.queue.push(sample);\n }\n sendUnloadRequest(sample: Sample) {\n this.unloadQueue.push(sample);\n }\n sendRequestSynchronous(sample: Sample) {\n this.syncQueue.push(sample);\n }\n sendAdRequest(sample: AdAnalyticsSample & AdBreakSample & AdSample) {\n this.adQueue.push(sample);\n }\n\n flushTo(backend: Backend) {\n this.queue.forEach((e) => {\n backend.sendRequest(e);\n });\n this.unloadQueue.forEach((e) => {\n backend.sendUnloadRequest(e);\n });\n this.syncQueue.forEach((e) => {\n backend.sendRequestSynchronous(e);\n });\n this.adQueue.forEach((e) => {\n backend.sendAdRequest(e);\n });\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {AnalyticsCall} from '../utils/AnalyticsCall';\nimport {noOp} from '../utils/Utils';\n\nimport {Backend} from './Backend';\n\n/**\n * The `RemoteBackend` class is responsible for actually sending out the samples using the {@link AnalyticsCall} class.\n * Before each sample is sent, the `RemoteBackend` attaches a license key to the sample.\n *\n * @implements {Backend}\n */\nexport class RemoteBackend implements Backend {\n analyticsCall: AnalyticsCall;\n hasAdModule: boolean;\n\n constructor(\n hasAdModule: boolean,\n backendBaseUrl: string,\n private licenseKey: string,\n ) {\n this.hasAdModule = hasAdModule;\n this.analyticsCall = new AnalyticsCall(backendBaseUrl);\n }\n\n sendRequest(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendRequest(sample, noOp);\n }\n\n sendUnloadRequest(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendRequestSynchronous(sample, noOp);\n }\n\n sendAdRequest(sample: AdAnalyticsSample & AdBreakSample & AdSample) {\n sample.key = this.licenseKey;\n if (!this.hasAdModule) {\n return;\n }\n this.analyticsCall.sendAdRequest(sample);\n }\n}\n","import {SegmentInfo} from '../types/SegmentInfo';\n\nexport class SegmentTracker {\n protected segments: SegmentInfo[];\n\n constructor() {\n this.segments = [];\n }\n\n reset(): void {\n this.segments = [];\n }\n\n addSegment(segment: SegmentInfo): void {\n this.segments.push(segment);\n }\n\n removeSegment(url: string): void {\n this.segments = this.segments.filter((s) => s.url !== url);\n }\n\n getSegments(): SegmentInfo[] {\n return this.segments;\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {SEQUENCE_NUMBER_LIMIT} from '../utils/Settings';\n\nimport {Backend} from './Backend';\n\n/**\n * The `SequenceNumberBackend` is a decorator class that increments a samples sequence number and filters out samples\n * where the `sequenceNumber` exceeds a specified threshold.\n *\n * If a sample's `sequenceNumber` surpasses the threshold, it is not forwarded to the next backend.\n * Otherwise, the sample is passed along to the next backend for further processing.\n *\n * @implements {Backend}\n */\nexport class SequenceNumberBackend implements Backend {\n nextBackend: Backend;\n sequenceNumber = 0;\n\n constructor(underlying: Backend) {\n this.nextBackend = underlying;\n }\n\n sendRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n if (this.isSequenceNumberAboveThreshold(sample)) {\n return;\n }\n this.nextBackend.sendRequest(sample);\n }\n\n sendUnloadRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n if (this.isSequenceNumberAboveThreshold(sample)) {\n return;\n }\n this.nextBackend.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n if (this.isSequenceNumberAboveThreshold(sample)) {\n return;\n }\n this.nextBackend.sendRequestSynchronous(sample);\n }\n\n sendAdRequest(sample: AdAnalyticsSample & AdBreakSample & AdSample) {\n if (this.isSequenceNumberAboveThreshold(sample)) {\n return;\n }\n this.nextBackend.sendAdRequest(sample);\n }\n\n private updateSampleBeforeSending(sample: Sample) {\n sample.sequenceNumber = this.sequenceNumber++;\n }\n\n private isSequenceNumberAboveThreshold(sample: Sample): boolean {\n return (sample.sequenceNumber ?? 0) > SEQUENCE_NUMBER_LIMIT;\n }\n}\n","import type {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {deleteCookie, getCookie, setCookie} from '../utils/documentCookieUtils';\nimport {isBlank, isValidString} from '../utils/stringUtils';\nimport * as Utils from '../utils/Utils';\nimport {isNumber} from '../utils/Utils';\n\nexport const COOKIE_NAME_BITMOVIN_ANALYTICS_UUID = 'bitmovin_analytics_uuid';\n/** One year in seconds */\nexport const COOKIE_DEFAULT_MAX_AGE = 365 * 24 * 60 * 60;\n\nexport class SessionPersistenceHandler {\n readonly userId: string;\n\n constructor(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n\n const shouldNotUseCookies = collectorConfig?.cookiesEnabled === false;\n\n if (shouldNotUseCookies) {\n deleteCookie(COOKIE_NAME_BITMOVIN_ANALYTICS_UUID);\n this.userId = Utils.generateUUID();\n return;\n }\n\n const existingUserId = getCookie(COOKIE_NAME_BITMOVIN_ANALYTICS_UUID);\n this.userId = !isBlank(existingUserId) ? existingUserId : Utils.generateUUID();\n\n const cookieDomain = validateCookieDomainValue(collectorConfig?.cookiesDomain);\n const cookieMaxAge = validateCookieMaxAgeValue(collectorConfig?.cookiesMaxAge);\n\n // we set also expires, because max-age is not supported on old browsers like IE8\n const nowMillis = Date.now();\n const expirationDate = new Date(nowMillis + cookieMaxAge * 1000);\n const cookieExpires = expirationDate.toUTCString();\n\n setCookie(COOKIE_NAME_BITMOVIN_ANALYTICS_UUID, this.userId, {\n domain: cookieDomain,\n expires: cookieExpires,\n maxAge: cookieMaxAge,\n });\n }\n}\n\nexport const validateCookieDomainValue = (value: unknown): string | undefined => {\n if (value == null) {\n return undefined;\n }\n\n if (!isValidString(value)) {\n return undefined;\n }\n\n if (isBlank(value)) {\n return undefined;\n }\n\n return encodeURIComponent(value);\n};\n\nexport const validateCookieMaxAgeValue = (value: unknown): number => {\n if (value == null) {\n return COOKIE_DEFAULT_MAX_AGE;\n }\n\n if (!isNumber(value)) {\n return COOKIE_DEFAULT_MAX_AGE;\n }\n\n return value;\n};\n","import type {CodecInfo} from '../types/CodecInfo';\nimport type {PlaybackInfo} from '../types/PlaybackInfo';\nimport {isBlank} from '../utils/stringUtils';\n\n/**\n * This class is used to store source specific information for the player\n * mainly as a fallback if sourceInfo cannot be determined by the player since the source is already unloaded\n */\nexport class SourceInfoFallbackService {\n private streamFormat: PlaybackInfo['streamFormat'];\n private audioCodec: PlaybackInfo['audioCodec'];\n private videoCodec: PlaybackInfo['videoCodec'];\n\n reset() {\n this.streamFormat = undefined;\n this.audioCodec = undefined;\n this.videoCodec = undefined;\n }\n\n setStreamFormat(streamFormat: PlaybackInfo['streamFormat']) {\n this.streamFormat = streamFormat;\n }\n\n applyStreamFormat(playbackInfo: PlaybackInfo) {\n if (isBlank(this.streamFormat)) {\n return;\n }\n playbackInfo.streamFormat = this.streamFormat;\n }\n\n /**\n * Apply fallback values to {@link PlaybackInfo} if available.\n * If provided {@link CodecInfo} values are available, we store them as new fallback values, before we apply them.\n */\n applyAndStoreCodecInfo(playbackInfo: PlaybackInfo, codecInfo: CodecInfo | undefined) {\n if (codecInfo?.audioCodec != null) {\n this.audioCodec = codecInfo.audioCodec;\n }\n if (codecInfo?.videoCodec != null) {\n this.videoCodec = codecInfo.videoCodec;\n }\n\n if (!isBlank(this.audioCodec)) {\n playbackInfo.audioCodec = this.audioCodec;\n }\n if (!isBlank(this.videoCodec)) {\n playbackInfo.videoCodec = this.videoCodec;\n }\n }\n}\n","import Timespan from '../types/Timespan';\n\nenum TimespanOverlappingType {\n None,\n Overlapping,\n FirstContainedInSecond,\n SecondContainedInFirst,\n}\n\nexport default class VideoCompletionTracker {\n private watched: Timespan[] = [];\n private videoDuration: null | number = null;\n\n reset(): void {\n this.watched = [];\n }\n\n /**\n * sets video Duration\n * @param videoDuration in sec\n */\n setVideoDuration(videoDuration: number): void {\n this.videoDuration = videoDuration * 1000;\n }\n\n /**\n * Adds the watched timespan to the tracker\n * @param watched watched timespan you want to add to the tracker\n * @returns how much time(video parts which have not been seen yet) was added to the tracker\n */\n addWatched(watched: Timespan): number {\n if (this.videoDuration == null) {\n throw new Error('no video duration set for completion tracker');\n }\n\n this.watched.push(watched);\n const overlappingTimespan = this.mergeWatched(this.watched);\n return (this.getDuration(watched) - overlappingTimespan) / this.videoDuration;\n }\n\n /**\n * returns the relative value of how much the user watch the content of the video\n */\n getCompletionPercentage(): number {\n if (this.videoDuration == null) {\n throw new Error('no video duration set for completion tracker');\n }\n\n let watched = 0;\n for (const w of this.watched) {\n watched += this.getDuration(w);\n }\n return watched / this.videoDuration;\n }\n\n /**\n * Recursive Method to merge All Watched Blocks\n * @param watched\n *\n * @returns how much timespan was overlapping while merging the watchBlocks\n */\n private mergeWatched(watched: Timespan[]): number {\n for (let i = 0; i < watched.length; i++) {\n const time1 = watched[i];\n for (let k = i + 1; k < watched.length; k++) {\n const time2 = watched[k];\n let overlappingTimespan = 0;\n const overlapType = this.getOverlappingType(time1, time2);\n\n if (overlapType === TimespanOverlappingType.Overlapping) {\n this.mergeAndReplace(time1, i, time2, k);\n overlappingTimespan = this.getOverlappingTimespan(time1, time2);\n } else if (overlapType === TimespanOverlappingType.FirstContainedInSecond) {\n this.watched.splice(i, 1);\n overlappingTimespan = this.getDuration(time1);\n } else if (overlapType === TimespanOverlappingType.SecondContainedInFirst) {\n this.watched.splice(k, 1);\n overlappingTimespan = this.getDuration(time2);\n }\n if (overlapType !== TimespanOverlappingType.None) {\n return overlappingTimespan + this.mergeWatched(this.watched);\n }\n }\n }\n return 0;\n }\n\n private getOverlappingType(first: Timespan, second: Timespan): TimespanOverlappingType {\n if (\n (this.isMomentInTimespan(first.end, second) && first.start < second.start) ||\n (this.isMomentInTimespan(first.start, second) && first.end > second.end)\n ) {\n return TimespanOverlappingType.Overlapping;\n } else if (this.isMomentInTimespan(first.start, second) && this.isMomentInTimespan(first.end, second)) {\n return TimespanOverlappingType.FirstContainedInSecond;\n } else if (this.isMomentInTimespan(second.start, first) && this.isMomentInTimespan(second.end, first)) {\n return TimespanOverlappingType.SecondContainedInFirst;\n }\n return TimespanOverlappingType.None;\n }\n\n private isMomentInTimespan(moment: number, timespan: Timespan): boolean {\n return moment >= timespan.start && moment < timespan.end;\n }\n\n private mergeAndReplace(first: Timespan, firstIndex: number, second: Timespan, secondIndex: number): void {\n const end = first.end > second.end ? first.end : second.end;\n const start = first.start < second.start ? first.start : second.start;\n const newWatchedTimespan: Timespan = {start, end};\n this.watched.splice(firstIndex, 1, newWatchedTimespan);\n this.watched.splice(secondIndex, 1);\n }\n\n private getOverlappingTimespan(first: Timespan, second: Timespan): number {\n const end = first.end < second.end ? first.end : second.end;\n const start = first.start >= second.start ? first.start : second.start;\n return end - start;\n }\n\n private getDuration(watched: Timespan): number {\n return Math.abs(watched.end - watched.start);\n }\n}\n","import type {SsaiAdBreakMetadata, SsaiAdMetadata, SsaiAdQuartile, SsaiAdQuartileMetadata} from '../../api/AdapterAPI';\nimport {AD_TYPE} from '../../enums/AdType';\nimport {ErrorCode} from '../../enums/ErrorCode';\nimport {customDataValuesKeys, extractCustomDataFieldsOnly} from '../../types/CustomDataValues';\nimport type {AnalyticsEventBase} from '../../types/EventData';\nimport type {Sample} from '../../types/Sample';\nimport {generateUUID} from '../../utils/Utils';\n\nimport type {InternalSsaiMetadata, SsaiEngagementInteractionData} from './ssaiEngagementInteractionData';\nimport {\n getCurrentMonotonicTimestampInMs,\n getMonotonicTimestampInMsSince,\n SSAI_RELATED_SAMPLE_MARKER,\n} from './ssaiUtils';\n\nexport type SsaiEventHandler = {\n getPlayerCurrentTime: () => number;\n reportEngagementInteraction: (data: SsaiEngagementInteractionData) => void;\n reportPlaybackInteraction: (timestamp: number, eventData: AnalyticsEventBase) => void;\n};\n\nenum SsaiState {\n AD_BREAK_STARTED,\n ACTIVE,\n IDLE,\n}\n\n// we start with -1, to be able to increment it before sending the first sample\n// this way the current adIndex is the one of the current playing ad\nconst INITIAL_AD_INDEX_VALUE = -1;\n\nexport class SsaiService {\n /** if `undefined` then service is not active and should not do anything, why: initially we activate it only for Bitmovin8 */\n private eventHandler: SsaiEventHandler | undefined = undefined;\n\n /** Index of the current ad in the whole session */\n private adIndex: number = INITIAL_AD_INDEX_VALUE;\n\n private state: SsaiState = SsaiState.IDLE;\n private isFirstSampleOfAd = false;\n /**\n * represents the current playing ad metadata\n * is `undefined` when no ad is playing (after endAdBreak)\n * or omitted by customer\n */\n private currentAdMetadata: InternalSsaiMetadata | undefined;\n\n /**\n * The impression id for the currently playing ad\n * is undefined when no ad is playing\n */\n private currentAdImpressionId: string | undefined;\n\n /** List of quartiles already sent for the current ad */\n private sentAdQuartiles: SsaiAdQuartile[] = [];\n\n /**\n * Flags whether an error was sent during an ad to avoid sending multiple errors for one ad,\n * which would skew e.g. the ad abandonment rate.\n */\n private errorSent: boolean = false;\n\n /**\n * The timestamp marking when the `adStart` method was called.\n * This timestamp is used to calculate the time difference between the `adStart` call\n * and subsequent `adQuartileFinished` or `sendAdEngagementErrorSample` calls.\n */\n private timestampOfAdStart: number | undefined;\n\n activate(eventHandler: SsaiEventHandler) {\n this.eventHandler = eventHandler;\n }\n\n adBreakStart(adBreakMetadata?: SsaiAdBreakMetadata) {\n if (!isActivated(this.eventHandler)) {\n // nothing to do if service is not active\n return;\n }\n\n if (this.state != SsaiState.IDLE) {\n return;\n }\n\n this.state = SsaiState.AD_BREAK_STARTED;\n this.currentAdMetadata = {\n ...adBreakMetadata,\n };\n }\n\n adStart(adMetadata?: SsaiAdMetadata) {\n if (!isActivated(this.eventHandler)) {\n // nothing to do if service is not active\n return;\n }\n\n if (this.state == SsaiState.IDLE) {\n return;\n }\n\n const timestamp = new Date().getTime();\n const playerCurrentTime = this.eventHandler.getPlayerCurrentTime();\n\n // report playback sample - will be saved in our playback related data lake\n // - with the first adStart call we need to close the current normal playback sample (no ssai ad information yet because SsaiState is not yet set to active)\n // - with all following adStart calls, we will deliver previous ssai ad information (SsaiState is already set to active)\n this.eventHandler.reportPlaybackInteraction(timestamp, {currentTime: playerCurrentTime});\n\n this.state = SsaiState.ACTIVE;\n // to include the adIndex in the next sample which will be the first sample of this started ad\n this.isFirstSampleOfAd = true;\n this.adIndex++;\n\n this.resetAdData();\n\n // we are extracting the customData fields explicitly to make sure that\n // there is not a different object passed\n const customData = adMetadata?.customData != null ? extractCustomDataFieldsOnly(adMetadata.customData) : undefined;\n\n this.currentAdMetadata = {\n adPosition: this.currentAdMetadata?.adPosition,\n adId: adMetadata?.adId,\n adSystem: adMetadata?.adSystem,\n customData: customData,\n };\n\n this.currentAdImpressionId = generateUUID();\n this.timestampOfAdStart = getCurrentMonotonicTimestampInMs();\n\n // report engagement sample - will be saved in our ad related data lake\n this.eventHandler.reportEngagementInteraction({\n type: 'started',\n adIndex: this.adIndex,\n currentAdImpressionId: this.currentAdImpressionId,\n currentAdMetadata: this.currentAdMetadata != null ? this.currentAdMetadata : {},\n });\n }\n\n adQuartileFinished(adQuartile: SsaiAdQuartile, adQuartileMetadata: SsaiAdQuartileMetadata) {\n if (!isActivated(this.eventHandler)) {\n // nothing to do if service is not activated\n return;\n }\n\n if (this.state != SsaiState.ACTIVE) {\n return;\n }\n\n if (this.sentAdQuartiles.includes(adQuartile)) {\n //do nothing if adQuartile was already sent\n return;\n }\n\n this.eventHandler.reportEngagementInteraction({\n type: 'quartile',\n adIndex: this.adIndex,\n currentAdImpressionId: this.currentAdImpressionId!,\n currentAdMetadata: this.currentAdMetadata != null ? this.currentAdMetadata : {},\n quartile: adQuartile,\n quartileMetadata: adQuartileMetadata,\n timeSinceAdStartedInMs: getMonotonicTimestampInMsSince(this.timestampOfAdStart),\n });\n this.sentAdQuartiles.push(adQuartile);\n }\n\n adBreakEnd() {\n if (!isActivated(this.eventHandler)) {\n // nothing to do if service is not active\n return;\n }\n\n if (this.state == SsaiState.IDLE) {\n return;\n }\n\n if (this.state == SsaiState.ACTIVE) {\n const timestamp = new Date().getTime();\n const playerCurrentTime = this.eventHandler.getPlayerCurrentTime();\n this.eventHandler.reportPlaybackInteraction(timestamp, {currentTime: playerCurrentTime});\n }\n\n this.resetAdBreakData();\n }\n\n manipulate(sample: Sample): void {\n if (!isActivated(this.eventHandler)) {\n // nothing to do if service is not active\n return;\n }\n\n if (this.state != SsaiState.ACTIVE) {\n return;\n }\n\n sample.ad = AD_TYPE.SSAI;\n sample.adId = this.currentAdMetadata?.adId;\n sample.adSystem = this.currentAdMetadata?.adSystem;\n sample.adPosition = this.currentAdMetadata?.adPosition;\n // we only mark the first sample of an ssai ad with the index in the playback/audience data (non ad table)\n // this allows us to count the number of ads\n if (this.isFirstSampleOfAd) {\n sample.adIndex = this.adIndex;\n this.isFirstSampleOfAd = false;\n }\n\n const customData = this.currentAdMetadata?.customData;\n if (customData != null) {\n customDataValuesKeys.forEach((key) => {\n if (customData[key]) {\n sample[key] = customData[key];\n }\n });\n }\n\n sample[SSAI_RELATED_SAMPLE_MARKER] = true; // mark it as ssai sample\n }\n\n sendAdEngagementErrorSample(errorCode: number, errorMessage: string) {\n if (!isActivated(this.eventHandler)) {\n // nothing to do if service is not active\n return;\n }\n\n if (this.state !== SsaiState.ACTIVE) {\n return;\n }\n\n // only send one error sample per ad\n if (this.errorSent) {\n return;\n }\n\n // This error code is related to the Analytics product and is non-fatal.\n // It is not triggered by the Player and does not interrupt or affect playback,\n // so there is no need to report an ad error sample.\n if (errorCode === ErrorCode.QUALITY_CHANGE_THRESHOLD_EXCEEDED.code) {\n return;\n }\n\n this.eventHandler.reportEngagementInteraction({\n type: 'error',\n adIndex: this.adIndex,\n currentAdImpressionId: this.currentAdImpressionId!,\n currentAdMetadata: this.currentAdMetadata != null ? this.currentAdMetadata : {},\n errorCode,\n errorMessage,\n timeSinceAdStartedInMs: getMonotonicTimestampInMsSince(this.timestampOfAdStart),\n });\n this.errorSent = true;\n }\n\n resetSourceRelatedState() {\n this.resetAdBreakData();\n this.adIndex = INITIAL_AD_INDEX_VALUE;\n }\n\n private resetAdBreakData() {\n this.state = SsaiState.IDLE;\n this.isFirstSampleOfAd = false;\n delete this.currentAdMetadata;\n this.resetAdData();\n }\n\n private resetAdData() {\n delete this.currentAdMetadata?.customData;\n delete this.currentAdMetadata?.adId;\n delete this.currentAdMetadata?.adSystem;\n this.errorSent = false;\n this.currentAdImpressionId = undefined;\n this.sentAdQuartiles = [];\n this.timestampOfAdStart = undefined;\n }\n}\n\nfunction isActivated(eventHandler: SsaiEventHandler | undefined): eventHandler is SsaiEventHandler {\n return eventHandler != null;\n}\n","import {SsaiAdBreakMetadata, SsaiAdMetadata, SsaiAdQuartile, SsaiAdQuartileMetadata} from '../../api/AdapterAPI';\n\nexport type InternalSsaiMetadata = SsaiAdBreakMetadata & SsaiAdMetadata;\n\ntype SsaiEngagementBaseData = {\n adIndex: number;\n currentAdImpressionId: string;\n currentAdMetadata: InternalSsaiMetadata;\n type: 'error' | 'quartile' | 'started';\n};\n\nexport type SsaiEngagementErrorData = SsaiEngagementBaseData & {\n errorCode: number;\n errorMessage: string;\n timeSinceAdStartedInMs: number | undefined;\n type: 'error';\n};\n\nexport function isSsaiEngagementErrorData(data: SsaiEngagementInteractionData): data is SsaiEngagementErrorData {\n return data.type === 'error';\n}\n\nexport type SsaiEngagementQuartileData = SsaiEngagementBaseData & {\n quartile: SsaiAdQuartile;\n quartileMetadata: SsaiAdQuartileMetadata;\n timeSinceAdStartedInMs: number | undefined;\n type: 'quartile';\n};\n\nexport function isSsaiEngagementQuartileData(data: SsaiEngagementInteractionData): data is SsaiEngagementQuartileData {\n return data.type === 'quartile';\n}\n\nexport type SsaiEngagementStartedData = SsaiEngagementBaseData & {type: 'started'};\n\nexport function isSsaiEngagementStartedData(data: SsaiEngagementInteractionData): data is SsaiEngagementStartedData {\n return data.type === 'started';\n}\n\nexport type SsaiEngagementInteractionData =\n | SsaiEngagementErrorData\n | SsaiEngagementQuartileData\n | SsaiEngagementStartedData;\n","import type {SsaiAdQuartile, SsaiAdQuartileMetadata} from '../../api/AdapterAPI';\nimport {customDataValuesKeys} from '../../types/CustomDataValues';\nimport type {AdSample, Sample} from '../../types/Sample';\n\nimport type {\n InternalSsaiMetadata,\n SsaiEngagementErrorData,\n SsaiEngagementQuartileData,\n SsaiEngagementStartedData,\n} from './ssaiEngagementInteractionData';\n\n/**\n * Ssai marker property for {@link Sample} to indicate that this is \"ssai related sample\" and can cause the spike\n * on ingress side. It will be picked up in `AnalyticsCall` and used to send that \"ssai related sample\" as request\n * with ssai redirection. @see {@link ROUTING_URL_PARAM}\n *\n * What is \"ssai related sample\" ?\n * - \"last sample\" that was triggered to be sent, because of coming SSAI interaction, the SSAI ad break start (WITHOUT `sample.ad = 2`),\n * because it causes also the spike as all viewers are received same SSAI at the same time.\n * - all following samples, triggered by SSAI interaction while SSAI ad break is running (now WITH `sample.ad = 2`)\n *\n * We don't we need it with {@link AdSample} too?\n * Because all \"ssai related ad samples\" are triggered only during ssai ad break, so all have already\n * {@link AdSample#adType} property set and we can relay on that in `AnalyticsCall` to send them with ssai redirection.\n */\nexport const SSAI_RELATED_SAMPLE_MARKER = 'triggeredBySsai';\n\nexport function isSsaiRelatedSample(sample: AdSample | Sample): boolean {\n if (sample[SSAI_RELATED_SAMPLE_MARKER]) {\n delete sample[SSAI_RELATED_SAMPLE_MARKER]; // clean up the marker property that should not be present on the sample property\n return true;\n } else if ((sample as AdSample).adType === 2) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Due to ssai being spiky by design, we should mark all analytics requests (with samples / ad samples)\n * that are ssai related, with a specific URL parameter. The load balancer can then route traffic according to the URL\n * parameter to a different ingress instance, which gives us more flexibility when ssai spikes are coming in.\n */\nexport const ROUTING_URL_PARAM = 'routingParam';\nexport const ROUTING_URL_PARAM_VALUE_SSAI = 'ssai';\n\nexport function appendSsaiRoutingParam(url: string): string {\n return `${url}?${ROUTING_URL_PARAM}=${ROUTING_URL_PARAM_VALUE_SSAI}`;\n}\n\nfunction createAdSampleFromSample(sample: Sample): AdSample {\n return {\n audioBitrate: sample?.audioBitrate,\n audioCodec: sample?.audioCodec,\n analyticsVersion: sample?.analyticsVersion,\n adPlaybackHeight: sample?.videoPlaybackHeight,\n adPlaybackWidth: sample?.videoPlaybackWidth,\n cdnProvider: sample?.cdnProvider,\n customData1: sample?.customData1,\n customData2: sample?.customData2,\n customData3: sample?.customData3,\n customData4: sample?.customData4,\n customData5: sample?.customData5,\n customData6: sample?.customData6,\n customData7: sample?.customData7,\n customData8: sample?.customData8,\n customData9: sample?.customData9,\n customData10: sample?.customData10,\n customData11: sample?.customData11,\n customData12: sample?.customData12,\n customData13: sample?.customData13,\n customData14: sample?.customData14,\n customData15: sample?.customData15,\n customData16: sample?.customData16,\n customData17: sample?.customData17,\n customData18: sample?.customData18,\n customData19: sample?.customData19,\n customData20: sample?.customData20,\n customData21: sample?.customData21,\n customData22: sample?.customData22,\n customData23: sample?.customData23,\n customData24: sample?.customData24,\n customData25: sample?.customData25,\n customData26: sample?.customData26,\n customData27: sample?.customData27,\n customData28: sample?.customData28,\n customData29: sample?.customData29,\n customData30: sample?.customData30,\n customUserId: sample?.customUserId,\n domain: sample?.domain,\n experimentName: sample?.experimentName,\n key: sample?.key,\n language: sample?.language,\n path: sample?.path,\n platform: sample?.platform,\n player: sample?.player,\n playerKey: sample?.playerKey,\n playerTech: sample?.playerTech,\n size: sample?.size,\n screenHeight: sample?.screenHeight,\n screenWidth: sample?.screenWidth,\n streamFormat: sample?.streamFormat,\n userAgent: sample?.userAgent,\n userId: sample?.userId,\n version: sample?.version,\n videoBitrate: sample?.videoBitrate,\n videoCodec: sample?.videoCodec,\n videoId: sample?.videoId,\n videoImpressionId: sample?.impressionId,\n videoTitle: sample?.videoTitle,\n videoWindowHeight: sample?.videoWindowHeight,\n videoWindowWidth: sample?.videoWindowWidth,\n };\n}\n\nexport function createErrorAdSample(\n playbackSample: Sample,\n ssaiEngagementErrorData: SsaiEngagementErrorData,\n): AdSample {\n return buildAdSample({\n playbackSample,\n currentAdImpressionId: ssaiEngagementErrorData.currentAdImpressionId,\n adIndex: ssaiEngagementErrorData.adIndex,\n currentAdMetadata: ssaiEngagementErrorData.currentAdMetadata,\n quartile: undefined,\n quartileMetadata: undefined,\n errorCode: ssaiEngagementErrorData.errorCode,\n errorMessage: ssaiEngagementErrorData.errorMessage,\n timeSinceAdStartedInMs: ssaiEngagementErrorData.timeSinceAdStartedInMs,\n });\n}\n\nexport function createStartedAdSample(\n playbackSample: Sample,\n ssaiEngagementStartedData: SsaiEngagementStartedData,\n): AdSample {\n return buildAdSample({\n playbackSample,\n currentAdImpressionId: ssaiEngagementStartedData.currentAdImpressionId,\n adIndex: ssaiEngagementStartedData.adIndex,\n currentAdMetadata: ssaiEngagementStartedData.currentAdMetadata,\n quartile: 'started',\n quartileMetadata: undefined,\n errorCode: undefined,\n errorMessage: undefined,\n timeSinceAdStartedInMs: undefined,\n });\n}\n\nexport function createQuartileAdSample(\n playbackSample: Sample,\n ssaiEngagementQuartileData: SsaiEngagementQuartileData,\n): AdSample {\n return buildAdSample({\n playbackSample,\n currentAdImpressionId: ssaiEngagementQuartileData.currentAdImpressionId,\n adIndex: ssaiEngagementQuartileData.adIndex,\n currentAdMetadata: ssaiEngagementQuartileData.currentAdMetadata,\n quartile: ssaiEngagementQuartileData.quartile,\n quartileMetadata: ssaiEngagementQuartileData.quartileMetadata,\n timeSinceAdStartedInMs: ssaiEngagementQuartileData.timeSinceAdStartedInMs,\n errorCode: undefined,\n errorMessage: undefined,\n });\n}\n\nfunction buildAdSample({\n playbackSample,\n currentAdImpressionId,\n adIndex,\n currentAdMetadata,\n quartile,\n quartileMetadata,\n errorCode,\n errorMessage,\n timeSinceAdStartedInMs,\n}: {\n adIndex: number;\n currentAdImpressionId: string;\n currentAdMetadata: InternalSsaiMetadata;\n errorCode: number | undefined;\n errorMessage: string | undefined;\n playbackSample: Sample;\n quartile: 'started' | SsaiAdQuartile | undefined;\n quartileMetadata: SsaiAdQuartileMetadata | undefined;\n timeSinceAdStartedInMs: number | undefined;\n}): AdSample {\n const adEngagementSample: AdSample = {\n ...createAdSampleFromSample(playbackSample),\n adId: currentAdMetadata?.adId,\n adImpressionId: currentAdImpressionId,\n adIndex: adIndex,\n adPosition: currentAdMetadata?.adPosition,\n adSystem: currentAdMetadata?.adSystem,\n adType: 2,\n errorCode: errorCode,\n errorMessage: errorMessage,\n time: Date.now(),\n timeSinceAdStartedInMs: timeSinceAdStartedInMs,\n };\n\n // set quartile data\n switch (quartile) {\n case 'started':\n adEngagementSample.started = 1;\n break;\n case 'first':\n adEngagementSample.quartile1 = 1;\n adEngagementSample.quartile1FailedBeaconUrl = quartileMetadata?.failedBeaconUrl;\n break;\n case 'midpoint':\n adEngagementSample.midpoint = 1;\n adEngagementSample.midpointFailedBeaconUrl = quartileMetadata?.failedBeaconUrl;\n break;\n case 'third':\n adEngagementSample.quartile3 = 1;\n adEngagementSample.quartile3FailedBeaconUrl = quartileMetadata?.failedBeaconUrl;\n break;\n case 'completed':\n adEngagementSample.completed = 1;\n adEngagementSample.completedFailedBeaconUrl = quartileMetadata?.failedBeaconUrl;\n break;\n }\n\n // set ssai customData\n const customData = currentAdMetadata?.customData;\n if (customData != null) {\n customDataValuesKeys.forEach((key) => {\n if (customData[key]) {\n adEngagementSample[key] = customData[key];\n }\n });\n }\n\n return adEngagementSample;\n}\n\n/**\n * Returns the current timestamp in milliseconds using the `performance.now()` method if available\n * to ensure monotonic timestamps; otherwise, it falls back to using `Date.now()`.\n *\n * Date.now() is dependent on the system clock and not monotonic, it may have been impacted by system\n * and user clock adjustments. The performance.now() method is relative to the timeOrigin property\n * which is a monotonic clock: its current time never decreases and isn't subject to adjustments.\n */\nexport function getCurrentMonotonicTimestampInMs(): number {\n if (window.performance?.now == null || typeof window.performance.now !== 'function') {\n return Date.now();\n }\n\n // floor to return integer value (not double as performance.now() returns)\n return Math.floor(performance.now());\n}\n\nexport function getMonotonicTimestampInMsSince(timestampInMs: number | undefined): number | undefined {\n if (timestampInMs == null) {\n return undefined;\n }\n\n return getCurrentMonotonicTimestampInMs() - timestampInMs;\n}\n","/* eslint-disable perfectionist/sort-enums */\n\nexport enum AD_TYPE {\n NO_AD = 0,\n CSAI = 1,\n SSAI = 2,\n}\n\n/* eslint-enable perfectionist/sort-enums */\n","export enum CdnProvider {\n AKAMAI = 'akamai',\n BITGRAVITY = 'bitgravity',\n CHINACACHE = 'chinacache',\n CLOUDFLARE = 'cloudflare',\n CLOUDFRONT = 'cloudfront',\n FASTLY = 'fastly',\n MAXCDN = 'maxcdn',\n}\n","export enum CastTech {\n AirPlay = 'AirPlay',\n GoogleCast = 'GoogleCast',\n WebSocket = 'WebSocket',\n}\n","const videoCodecs = ['avc1', 'avc3', 'hvc1', 'av01', 'av1', 'hev1', 'vp9'];\n\nconst audioCodecs = ['mp4a', 'ec-3', 'ac-3', 'opus', 'audio/mp4'];\n\nexport function isVideoCodec(codec: string): boolean {\n if (!codec) {\n return false;\n }\n const index = videoCodecs.findIndex((videoCodec) => codec.startsWith(videoCodec));\n return index !== -1;\n}\n\nexport function isAudioCodec(codec: string): boolean {\n if (!codec) {\n return false;\n }\n const index = audioCodecs.findIndex((videoCodec) => codec.startsWith(videoCodec));\n return index !== -1;\n}\n","export class ErrorCode {\n static BITMOVIN_PLAYER_LICENSING_ERROR = new ErrorCode(1103, '');\n static SETUP_MISSING_LICENSE_WHITELIST = new ErrorCode(1105, '');\n static QUALITY_CHANGE_THRESHOLD_EXCEEDED = new ErrorCode(10000, 'ANALYTICS_QUALITY_CHANGE_THRESHOLD_EXCEEDED');\n static BUFFERING_TIMEOUT_REACHED = new ErrorCode(10001, 'ANALYTICS_BUFFERING_TIMEOUT_REACHED');\n static VIDEO_STARTUP_TIMEOUT_REACHED = new ErrorCode(10002, 'ANALYTICS_VIDEOSTART_TIMEOUT_REACHED');\n\n private constructor(\n readonly code: number,\n readonly message: string,\n ) {}\n}\n","import {\n AnalyticsEventBase,\n AudioChangeEvent,\n ErrorEvent,\n SourceChangeEvent,\n VideoChangeEvent,\n} from '../types/EventData';\n\nexport enum Event {\n AUDIO_CHANGE = 'audioChange',\n AUDIOTRACK_CHANGED = 'audioTrackChanged',\n CUSTOM_DATA_CHANGE = 'customDataChange',\n /**\n * Fired when the player has finished playback.\n */\n END = 'end',\n END_AD = 'adEnd',\n END_BUFFERING = 'endBuffering',\n END_CAST = 'endCasting',\n END_FULLSCREEN = 'endFullscreen',\n ERROR = 'playerError',\n MANUAL_SOURCE_CHANGE = 'manualSourceChangeInitiated',\n MUTE = 'mute',\n PAUSE = 'pause',\n PLAY = 'play',\n PLAYING = 'playing',\n PLAYLIST_TRANSITION = 'playlistTransition',\n READY = 'ready',\n SCREEN_RESIZE = 'resize',\n SEEK = 'seek',\n SEEKED = 'seeked',\n SETUP = 'setup',\n SOURCE_LOADED = 'sourceLoaded',\n SOURCE_UNLOADED = 'sourceUnloaded',\n START_AD = 'adStart',\n START_BUFFERING = 'startBuffering',\n START_CAST = 'startCasting',\n START_FULLSCREEN = 'startFullscreen',\n SUBTITLE_CHANGE = 'subtitleChange',\n TIMECHANGED = 'timechanged',\n UN_MUTE = 'unMute',\n /**\n * Fired when the player is unloaded/destroyed and the collector should be released.\n */\n UNLOAD = 'unload',\n VIDEO_CHANGE = 'videoChange',\n VIDEOSTART_TIMEOUT = 'VIDEOSTART_TIMEOUT',\n}\n\nexport interface EventMap {\n [Event.SETUP]: AnalyticsEventBase;\n [Event.READY]: AnalyticsEventBase;\n [Event.SOURCE_LOADED]: AnalyticsEventBase;\n [Event.PLAY]: AnalyticsEventBase;\n [Event.PLAYING]: AnalyticsEventBase;\n [Event.PAUSE]: AnalyticsEventBase;\n [Event.TIMECHANGED]: AnalyticsEventBase;\n [Event.SEEK]: AnalyticsEventBase;\n [Event.SEEKED]: AnalyticsEventBase;\n [Event.START_CAST]: AnalyticsEventBase;\n [Event.END_CAST]: AnalyticsEventBase;\n [Event.START_BUFFERING]: AnalyticsEventBase;\n [Event.END_BUFFERING]: AnalyticsEventBase;\n [Event.AUDIOTRACK_CHANGED]: AnalyticsEventBase;\n [Event.AUDIO_CHANGE]: AudioChangeEvent;\n [Event.VIDEO_CHANGE]: VideoChangeEvent;\n [Event.START_FULLSCREEN]: AnalyticsEventBase;\n [Event.END_FULLSCREEN]: AnalyticsEventBase;\n [Event.START_AD]: AnalyticsEventBase;\n [Event.SUBTITLE_CHANGE]: AnalyticsEventBase;\n [Event.END_AD]: AnalyticsEventBase;\n [Event.MUTE]: AnalyticsEventBase;\n [Event.UN_MUTE]: AnalyticsEventBase;\n [Event.ERROR]: ErrorEvent;\n [Event.SCREEN_RESIZE]: AnalyticsEventBase;\n [Event.UNLOAD]: AnalyticsEventBase;\n [Event.END]: AnalyticsEventBase;\n [Event.SOURCE_UNLOADED]: AnalyticsEventBase;\n [Event.MANUAL_SOURCE_CHANGE]: SourceChangeEvent;\n [Event.VIDEOSTART_TIMEOUT]: AnalyticsEventBase;\n [Event.CUSTOM_DATA_CHANGE]: AnalyticsEventBase;\n [Event.PLAYLIST_TRANSITION]: AnalyticsEventBase;\n}\n","import {endsWith} from '../utils/stringUtils';\n\nconst MP4 = 'video/mp4';\nconst WEBM = 'video/webm';\nconst HLS = 'application/x-mpegURL';\nconst DASH = 'application/dash+xml';\n\nexport const MIMETypes = {\n MP4,\n WEBM,\n HLS,\n DASH,\n};\n\nexport function getMIMETypeFromFileExtension(path: string): string | undefined {\n path = path.split(/[?#]/)[0].toLowerCase();\n\n if (endsWith(path, '.m3u8')) {\n return HLS;\n }\n if (endsWith(path, '.mp4') || endsWith(path, '.m4v') || endsWith(path, '.m4a')) {\n return MP4;\n }\n if (endsWith(path, '.webm')) {\n return WEBM;\n }\n if (endsWith(path, '.mpd')) {\n return DASH;\n }\n\n return undefined;\n}\n","/* eslint-disable perfectionist/sort-enums */\n\nexport enum PAGE_LOAD_TYPE {\n FOREGROUND = 1,\n BACKGROUND = 2,\n}\n\n/* eslint-enable perfectionist/sort-enums */\n","export enum Player {\n AMAZON_IVS = 'amazonivs',\n BITMOVIN = 'bitmovin',\n BITMOVIN_PWX = 'bitmovin-pwx',\n CHROMECAST_SHAKA = 'chromecast-shaka',\n DASHJS = 'dashjs',\n HLSJS = 'hlsjs',\n HTML5 = 'html5',\n JW = 'jw',\n RADIANT = 'radiant',\n SHAKA = 'shaka',\n VIDEOJS = 'videojs',\n}\n","export enum PlayerSize {\n Fullscreen = 'FULLSCREEN',\n Window = 'WINDOW',\n}\n","import {MIMETypes} from './MIMETypes';\n\nconst {MP4, WEBM, HLS, DASH} = MIMETypes;\n\nconst mapping = {\n [MP4]: 'progressive',\n [WEBM]: 'progressive',\n [HLS]: 'hls',\n [DASH]: 'dash',\n};\n\nexport enum StreamTypes {\n dash = 'dash',\n hls = 'hls',\n prog = 'progressive',\n}\n\nexport function getStreamTypeFromMIMEType(mimeType: string) {\n return mapping[mimeType];\n}\n","import {ErrorCode} from './ErrorCode';\n\nexport class VideoStartFailedReason {\n static PAGE_CLOSED = new VideoStartFailedReason('PAGE_CLOSED', null);\n static PLAYER_ERROR = new VideoStartFailedReason('PLAYER_ERROR', null);\n static TIMEOUT = new VideoStartFailedReason('TIMEOUT', ErrorCode.VIDEO_STARTUP_TIMEOUT_REACHED);\n static UNKNOWN = new VideoStartFailedReason('UNKNOWN', null);\n\n private constructor(\n readonly reason: string,\n readonly errorCode: ErrorCode | null,\n ) {}\n}\n","import {FeatureConfig} from './FeatureConfig';\n\nexport abstract class Feature {\n private _config?: TConfig = undefined;\n private _isEnabled = true;\n\n get config(): TConfig | undefined {\n return this._config;\n }\n\n get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n abstract reset(): void;\n abstract enabled(): void;\n abstract disabled(): void;\n abstract configured(authenticated: boolean, config?: TConfig): void;\n\n disable() {\n this._isEnabled = false;\n this.disabled();\n }\n\n configure(authenticated: boolean, configContainer?: TConfigContainer): TConfig | undefined {\n if (configContainer != null) {\n this._config = this.extractConfig(configContainer);\n }\n this.configured(authenticated, this._config);\n return this._config;\n }\n\n abstract extractConfig(configContainer: TConfigContainer): TConfig | undefined;\n}\n","import {logger} from '../utils/Logger';\n\nimport {Feature} from './Feature';\nimport {FeatureConfig} from './FeatureConfig';\n\nexport class FeatureManager {\n private features: Array> = [];\n\n registerFeatures(features: Array>) {\n this.features = features;\n }\n\n unregisterFeatures() {\n this.features.forEach((feature) => feature.disable());\n this.features = [];\n }\n\n resetFeatures() {\n this.features.forEach((feature) => feature.reset());\n }\n\n configureFeatures(authenticated: boolean, featureConfigs?: TConfigContainer) {\n this.features = this.features.filter((feature) => {\n const config = feature.configure(authenticated, featureConfigs);\n if (!authenticated || config?.enabled !== true) {\n logger.log(`Disabling feature ${feature.constructor.name} as it isn't enabled according to license callback.`);\n feature.disable();\n return false;\n }\n return true;\n });\n this.features.forEach((feature) => feature.enabled());\n }\n}\n","import {CollectorConfig} from '../../types/AnalyticsConfig';\nimport {post} from '../../utils/Http';\nimport {ANALYTICS_BACKEND_BASE_URL} from '../../utils/Settings';\nimport {joinUrls} from '../../utils/Utils';\nimport {HttpRequest} from '../httprequesttracking/HttpRequest';\n\nimport {ErrorData} from './ErrorData';\nimport {ErrorDetail} from './ErrorDetail';\n\nexport class ErrorDetailBackend {\n get queue(): ReadonlyArray {\n return this._queue;\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n static copyErrorDetailTruncateStringsAndUrls(\n errorDetail: ErrorDetail,\n maxStringLength: number,\n maxUrlLength: number,\n ): ErrorDetail {\n return {\n ...errorDetail,\n message: errorDetail.message?.substr(0, maxStringLength),\n data: this.copyErrorDataTruncateStrings(errorDetail.data, maxStringLength),\n httpRequests: errorDetail.httpRequests?.map((request) => this.copyHttpRequestTruncateUrls(request, maxUrlLength)),\n };\n }\n\n static copyHttpRequestTruncateUrls(httpRequest: HttpRequest, maxLength: number): HttpRequest {\n return {\n ...httpRequest,\n url: httpRequest.url?.substr(0, maxLength),\n lastRedirectLocation: httpRequest.lastRedirectLocation?.substr(0, maxLength),\n };\n }\n\n static copyErrorDataTruncateStrings(errorData: ErrorData, maxStringLength: number): ErrorData {\n return {\n ...errorData,\n exceptionMessage: errorData.exceptionMessage?.substr(0, maxStringLength),\n additionalData: errorData.additionalData?.substr(0, maxStringLength),\n };\n }\n\n static copyErrorDetailTruncateHttpRequests(errorDetail: ErrorDetail, maxRequests: number): ErrorDetail {\n return {\n ...errorDetail,\n httpRequests: errorDetail.httpRequests?.slice(-maxRequests),\n };\n }\n\n // We use these as upper limits to avoid clients bombing us with data, actual truncation to documented limits is\n // happening in ingress\n private static MAX_URL_LENGTH = 450;\n private static MAX_STRING_LENGTH = 400;\n\n private readonly backendUrl: string;\n private readonly _queue: ErrorDetail[] = [];\n private _enabled = false;\n\n constructor(collectorConfig: CollectorConfig | undefined) {\n this.backendUrl = joinUrls(collectorConfig?.backendUrl ?? ANALYTICS_BACKEND_BASE_URL, '/analytics/error');\n }\n\n limitHttpRequestsOfQueuedErrorDetails(max: number) {\n this._queue.forEach((value, index) => {\n this._queue[index] = ErrorDetailBackend.copyErrorDetailTruncateHttpRequests(value, max);\n });\n }\n\n send(errorDetail: ErrorDetail) {\n const errorDetailCopy = ErrorDetailBackend.copyErrorDetailTruncateStringsAndUrls(\n errorDetail,\n ErrorDetailBackend.MAX_STRING_LENGTH,\n ErrorDetailBackend.MAX_URL_LENGTH,\n );\n if (this.enabled) {\n post(this.backendUrl, errorDetailCopy, () => undefined);\n } else {\n this._queue.push(errorDetailCopy);\n }\n }\n\n flush() {\n const copy = [...this._queue];\n let element = copy.shift();\n while (element != null) {\n this.removeFromQueue(element);\n this.send(element);\n element = copy.shift();\n }\n }\n\n clear() {\n this._queue.splice(0, this._queue.length);\n }\n\n private removeFromQueue(element: ErrorDetail) {\n const index = this._queue.findIndex((value) => value === element);\n if (index >= 0) {\n this._queue.splice(index, 1);\n }\n }\n}\n","import {Subscribable} from '../../core/EventDispatcher';\nimport {CollectorConfig} from '../../types/AnalyticsConfig';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {logger} from '../../utils/Logger';\nimport {getCurrentTimestamp} from '../../utils/Utils';\nimport {VERSION} from '../../Version';\nimport {Feature} from '../Feature';\nimport {HttpRequestTracking} from '../httprequesttracking/HttpRequestTracking';\n\nimport {ErrorDetail} from './ErrorDetail';\nimport {ErrorDetailBackend} from './ErrorDetailBackend';\nimport {ErrorDetailTrackingConfig} from './ErrorDetailTrackingConfig';\nimport {OnErrorDetailEventObject} from './OnErrorDetailEventObject';\n\nexport interface ErrorDetailTrackingSettingsProvider {\n readonly licenseKey: string;\n readonly domain: string;\n readonly impressionId: string;\n readonly collectorConfig?: CollectorConfig;\n}\n\nexport class ErrorDetailTracking extends Feature {\n private errorIndex = 0;\n\n constructor(\n private settingsProvider: ErrorDetailTrackingSettingsProvider,\n private backend: ErrorDetailBackend,\n private subscribables: Array>,\n private httpRequestTracking: HttpRequestTracking | undefined,\n ) {\n super();\n subscribables.forEach((subscribable) => subscribable.subscribe(this.onErrorHandler));\n }\n\n reset(): void {\n this.httpRequestTracking?.reset();\n this.errorIndex = 0;\n }\n\n enabled(): void {\n this.backend.enabled = true;\n this.backend.flush();\n }\n\n disabled(): void {\n this.errorIndex = 0;\n this.httpRequestTracking?.disable();\n this.backend.clear();\n this.subscribables.forEach((subscribable) => subscribable.unsubscribe(this.onErrorHandler));\n }\n\n configured(_authenticated: boolean, config?: ErrorDetailTrackingConfig): void {\n const maxRequests = Math.max(config?.numberOfHttpRequests ?? 0, 0);\n this.httpRequestTracking?.configure(maxRequests);\n this.backend.limitHttpRequestsOfQueuedErrorDetails(maxRequests);\n }\n\n extractConfig(configContainer: FeatureConfigContainer): ErrorDetailTrackingConfig | undefined {\n return configContainer.errorDetails;\n }\n\n private onErrorHandler = (event: OnErrorDetailEventObject) => {\n try {\n if (!this.isEnabled) {\n return;\n }\n\n const httpRequests = this.httpRequestTracking?.httpRequests;\n const httpRequestsCopy = httpRequests == null ? undefined : [...httpRequests];\n const errorIndex = this.errorIndex;\n this.errorIndex++;\n\n const errorDetail: ErrorDetail = {\n platform: 'web',\n licenseKey: this.settingsProvider.licenseKey,\n domain: this.settingsProvider.domain,\n impressionId: this.settingsProvider.impressionId,\n analyticsVersion: VERSION,\n errorId: errorIndex,\n timestamp: getCurrentTimestamp(),\n code: event.code,\n message: event.message,\n data: event.errorData ?? {\n additionalData: undefined,\n exceptionMessage: undefined,\n exceptionStacktrace: undefined,\n },\n httpRequests: httpRequestsCopy,\n };\n\n logger.log(`ErrorDetailTracking.onError: ${JSON.stringify(errorDetail)}`);\n this.backend.send(errorDetail);\n } catch (error) {\n logger.error(`ErrorDetailTracking.onError: Error in handler`, error);\n }\n };\n}\n","import {Subscribable} from '../../core/EventDispatcher';\nimport {logger} from '../../utils/Logger';\nimport {Queue} from '../../utils/Queue';\n\nimport {HttpRequest} from './HttpRequest';\nimport {OnDownloadFinishedEventObject} from './OnDownloadFinishedEventObject';\n\nexport class HttpRequestTracking {\n private static DEFAULT_MAX_REQUESTS = 10;\n private _maxRequests: number = HttpRequestTracking.DEFAULT_MAX_REQUESTS;\n private _httpRequestQueue = new Queue();\n\n get maxRequests(): number {\n return this._maxRequests;\n }\n\n get httpRequests(): ReadonlyArray {\n return this._httpRequestQueue.items;\n }\n\n constructor(private subscribables: Array>) {\n subscribables.forEach((subscribable) => subscribable.subscribe(this.onDownloadFinishedHandler));\n }\n\n configure(maxRequests: number) {\n this._maxRequests = maxRequests;\n this._httpRequestQueue.limit(maxRequests);\n }\n\n disable() {\n this.subscribables.forEach((subscribable) => subscribable.unsubscribe(this.onDownloadFinishedHandler));\n this._httpRequestQueue.clear();\n }\n\n reset() {\n this._httpRequestQueue.clear();\n }\n\n private onDownloadFinishedHandler = (event: OnDownloadFinishedEventObject) => {\n try {\n this.addRequest(event.httpRequest);\n } catch (error) {\n logger.error(`HttpRequestTracking.onDownloadFinished: Error in handler`, error);\n }\n };\n\n private addRequest(httpRequest: HttpRequest) {\n this._httpRequestQueue.offer(httpRequest);\n this._httpRequestQueue.limit(this._maxRequests);\n }\n}\n","/*!\n * This file was created to avoid imports from 'bitmovin-player' package,\n * when we need to use enum HttpRequestType as value and not as type.\n */\n\nexport enum HttpRequestType {\n DRM_CERTIFICATE_FAIRPLAY = 'drm/certificate/fairplay',\n DRM_LICENSE_CLEARKEY = 'drm/license/clearkey',\n DRM_LICENSE_FAIRPLAY = 'drm/license/fairplay',\n DRM_LICENSE_PLAYREADY = 'drm/license/playready',\n DRM_LICENSE_PRIMETIME = 'drm/license/primetime',\n DRM_LICENSE_WIDEVINE = 'drm/license/widevine',\n INTERNAL = 'internal',\n KEY_HLS_AES = 'key/hls/aes',\n MANIFEST_ADS = 'manifest/ads',\n MANIFEST_DASH = 'manifest/dash',\n MANIFEST_HLS_MASTER = 'manifest/hls/master',\n MANIFEST_HLS_VARIANT = 'manifest/hls/variant',\n MANIFEST_SMOOTH = 'manifest/smooth',\n MEDIA_AUDIO = 'media/audio',\n MEDIA_SEGMENTINDEX = 'media/segmentindex',\n MEDIA_SUBTITLES = 'media/subtitles',\n MEDIA_THUMBNAILS = 'media/thumbnails',\n MEDIA_VIDEO = 'media/video',\n TIME_SYNC = 'time/sync',\n UNKNOWN = 'unknown',\n WEBRTC_SDP_ANSWER = 'webrtc/sdp/answer',\n WEBRTC_SDP_OFFER = 'webrtc/sdp/offer',\n WEBRTC_SDP_REQUEST = 'webrtc/sdp/request',\n}\n","import {Bitmovin8Adapter} from './adapters/bitmovin8/Bitmovin8Adapter';\n\n/*\n * @see https://github.com/bitmovin-engineering/bitdash/blob/ccd3227dac82d1416a471711b40ee0f65d7f9ddb/src/ModuleDefinition.ts#L17\n */\nexport const PlayerModule = {\n name: 'analytics',\n module: {\n Analytics: Bitmovin8Adapter,\n },\n hooks: {\n setup: (module: any, player: any) => {\n const config = player.getConfig();\n const isConfigMissing = !config;\n const isAnalyticsDisabled = config?.analytics === false;\n\n if (isConfigMissing || isAnalyticsDisabled) {\n return Promise.resolve();\n }\n\n const analyticsBitmovin8Adapter = module.Analytics;\n const analyticsModuleInstance = new analyticsBitmovin8Adapter(player);\n return Promise.resolve(analyticsModuleInstance);\n },\n },\n} as const;\n","import * as Utils from '../utils/Utils';\n\nimport {CustomDataValues} from './CustomDataValues';\nimport {Sample} from './Sample';\n\nexport class AdAnalyticsSample implements CustomDataValues {\n adModule?: string;\n adModuleVersion?: string;\n videoImpressionId?: string;\n userAgent?: string;\n language?: string;\n cdnProvider?: string;\n customData1?: string;\n customData2?: string;\n customData3?: string;\n customData4?: string;\n customData5?: string;\n customData6?: string;\n customData7?: string;\n customData8?: string;\n customData9?: string;\n customData10?: string;\n customData11?: string;\n customData12?: string;\n customData13?: string;\n customData14?: string;\n customData15?: string;\n customData16?: string;\n customData17?: string;\n customData18?: string;\n customData19?: string;\n customData20?: string;\n customData21?: string;\n customData22?: string;\n customData23?: string;\n customData24?: string;\n customData25?: string;\n customUserId?: string;\n experimentName?: string;\n domain?: string;\n key?: string;\n path?: string;\n player?: string;\n playerKey?: string;\n playerTech?: string;\n screenHeight?: number;\n screenWidth?: number;\n version?: string;\n size?: string;\n userId?: string;\n videoId?: string;\n videoTitle?: string;\n videoWindowHeight?: number;\n videoWindowWidth?: number;\n playerStartupTime?: number;\n analyticsVersion?: string;\n pageLoadTime?: number;\n pageLoadType?: number;\n autoplay?: boolean;\n platform = 'web';\n audioCodec?: string;\n videoCodec?: string;\n\n constructor(sample?: Sample) {\n if (!sample) {\n return;\n }\n this.videoImpressionId = sample.impressionId;\n this.userAgent = sample.userAgent;\n this.language = sample.language;\n this.cdnProvider = sample.cdnProvider;\n\n Utils.transferCustomDataFields(sample, this);\n\n this.customUserId = sample.customUserId;\n this.domain = sample.domain;\n this.experimentName = sample.experimentName;\n this.key = sample.key;\n this.path = sample.path;\n this.player = sample.player;\n this.playerKey = sample.playerKey;\n this.playerTech = sample.playerTech;\n this.screenHeight = sample.screenHeight;\n this.screenWidth = sample.screenWidth;\n this.version = sample.version;\n this.size = sample.size;\n this.userId = sample.userId;\n this.videoId = sample.videoId;\n this.videoTitle = sample.videoTitle;\n this.videoWindowHeight = sample.videoWindowHeight;\n this.videoWindowWidth = sample.videoWindowWidth;\n this.audioCodec = sample.audioCodec;\n this.videoCodec = sample.videoCodec;\n }\n}\n","import type {AdBreak, AdBreakConfig, AdConfig, AdManifestLoadedEvent, AdTagConfig} from 'bitmovin-player';\n\nimport * as Utils from '../utils/Utils';\n\nexport class AdBreakSample {\n adPosition?: string;\n adOffset?: string;\n adScheduleTime?: number;\n adReplaceContentDuration?: number;\n adPreloadOffset?: number;\n adTagPath?: string;\n adTagServer?: string;\n adTagType?: string;\n adTagUrl?: string;\n adIsPersistent?: boolean;\n adIdPlayer?: string;\n manifestDownloadTime?: number;\n errorCode?: number;\n errorData?: string;\n errorMessage?: string;\n adFallbackIndex = 0;\n\n constructor(adConfig?: AdConfig, adManifestLoadedEvent?: AdManifestLoadedEvent) {\n if (adManifestLoadedEvent) {\n this.manifestDownloadTime = Utils.calculateTime(adManifestLoadedEvent.downloadTiming.downloadTime);\n }\n\n if (adConfig) {\n this.adReplaceContentDuration = Utils.calculateTimeWithUndefined(adConfig.replaceContentDuration);\n this.adFallbackIndex = ((adConfig as any).currentFallbackIndex || -1) + 1;\n }\n\n const adBreakConfig = adConfig as AdBreakConfig;\n if (adBreakConfig) {\n if (adBreakConfig.position === 'pre' || adBreakConfig.position === 'post') {\n this.adPosition = adBreakConfig.position;\n } else {\n this.adPosition = 'mid';\n this.adOffset = adBreakConfig.position;\n }\n\n this.adPreloadOffset = Utils.calculateTimeWithUndefined(adBreakConfig.preloadOffset);\n }\n\n const adTagConfig = adConfig as AdTagConfig;\n if (adTagConfig) {\n this.adIsPersistent = adTagConfig.persistent;\n let tag = adTagConfig.tag;\n if (\n this.adFallbackIndex > 0 &&\n adTagConfig.fallbackTags &&\n adTagConfig.fallbackTags.length >= this.adFallbackIndex\n ) {\n tag = adTagConfig.fallbackTags[this.adFallbackIndex - 1];\n }\n if (tag) {\n this.adTagType = tag.type;\n this.adTagUrl = tag.url;\n }\n if (this.adTagUrl) {\n const adTagDetails = Utils.getHostnameAndPathFromUrl(this.adTagUrl);\n this.adTagServer = adTagDetails.hostname;\n this.adTagPath = adTagDetails.path;\n }\n }\n\n const adBreak = adConfig as AdBreak;\n if (adBreak) {\n this.adScheduleTime = Utils.calculateTimeWithUndefined(adBreak.scheduleTime);\n this.adIdPlayer = adBreak.id;\n }\n }\n}\n","import type {Ad, LinearAd, VastAdData} from 'bitmovin-player';\n\nimport * as Utils from '../utils/Utils';\n\nexport class AdSample {\n private static parseSkipAfter(skipAfter?: number) {\n if (skipAfter === undefined) {\n return undefined;\n }\n if (skipAfter === -1) {\n return skipAfter;\n }\n return Utils.calculateTime(skipAfter);\n }\n\n wrapperAdsCount?: number;\n adSkippable?: boolean;\n adSkippableAfter?: number;\n adClickthroughUrl?: string;\n adDescription?: string;\n adDuration?: number;\n adId?: string;\n adImpressionId?: string;\n adPlaybackHeight?: number;\n adPlaybackWidth?: number;\n adStartupTime?: number;\n adSystem?: string;\n adTitle?: string;\n advertiserName?: string;\n apiFramework?: string;\n audioBitrate?: number;\n clicked = 0;\n clickPosition?: number;\n closed = 0;\n closePosition?: number;\n completed = 0;\n creativeAdId?: string;\n creativeId?: string;\n dealId?: string;\n isLinear?: boolean;\n mediaPath?: string;\n mediaServer?: string;\n mediaUrl?: string;\n midpoint = 0;\n minSuggestedDuration?: number;\n percentageInViewport?: number;\n quartile1 = 0;\n quartile3 = 0;\n skipped = 0;\n skipPosition?: number;\n started = 0;\n streamFormat?: string;\n surveyUrl?: string;\n time?: number;\n timeHovered?: number;\n timeInViewport?: number;\n timePlayed?: number;\n timeUntilHover?: number;\n universalAdIdRegistry?: string;\n universalAdIdValue?: string;\n videoBitrate?: number;\n adPodPosition?: number;\n exitPosition?: number;\n playPercentage?: number;\n skipPercentage?: number;\n clickPercentage?: number;\n closePercentage?: number;\n errorPosition?: number;\n errorPercentage?: number;\n timeToContent?: number;\n timeFromContent?: number;\n\n constructor(ad?: Ad) {\n if (ad) {\n this.adClickthroughUrl = ad.clickThroughUrl;\n this.adId = ad.id;\n this.mediaUrl = ad.mediaFileUrl;\n const mediaUrlDetails = Utils.getHostnameAndPathFromUrl(this.mediaUrl || '');\n this.mediaPath = mediaUrlDetails.path;\n this.mediaServer = mediaUrlDetails.hostname;\n this.isLinear = ad.isLinear;\n this.adPlaybackHeight = ad.height;\n this.adPlaybackWidth = ad.width;\n\n if (ad.data) {\n this.videoBitrate = ad.data.bitrate === undefined ? undefined : ad.data.bitrate * 1000;\n this.streamFormat = ad.data.mimeType;\n // data.minBitrate\n // data.maxBitrate\n }\n\n const data = ad.data as VastAdData;\n if (data) {\n if (data.adSystem) {\n this.adSystem = data.adSystem.name;\n // this.adSystemVersion = data.adSystem.version;\n }\n if (data.advertiser) {\n this.advertiserName = data.advertiser.name;\n // this.advertiserId = data.advertiser.id;\n }\n // data.codec\n // data.delivery\n // data.pricing\n this.apiFramework = data.apiFramework;\n\n if (data.creative) {\n this.creativeAdId = data.creative.adId;\n this.creativeId = data.creative.id;\n\n if (data.creative.universalAdId) {\n this.universalAdIdRegistry = data.creative.universalAdId.idRegistry;\n this.universalAdIdValue = data.creative.universalAdId.value;\n }\n }\n this.adDescription = data.adDescription;\n this.minSuggestedDuration = Utils.calculateTimeWithUndefined(data.minSuggestedDuration);\n if (data.survey) {\n this.surveyUrl = data.survey.uri;\n // data.survey.type;\n }\n this.adTitle = data.adTitle;\n this.wrapperAdsCount = data.wrapperAdIds ? data.wrapperAdIds.length : 0;\n }\n }\n const linearAd = ad as LinearAd;\n if (linearAd) {\n this.adSkippableAfter = AdSample.parseSkipAfter(linearAd.skippableAfter);\n this.adSkippable =\n linearAd.skippable || (this.adSkippableAfter === undefined ? undefined : this.adSkippableAfter >= 0);\n this.adDuration = Utils.calculateTime(linearAd.duration);\n }\n }\n}\n","export interface AnalyticsDebugConfig {\n fields?: string[];\n}\nexport interface CollectorConfig {\n backendUrl?: string;\n enabled?: boolean;\n cookiesEnabled?: boolean;\n cookiesDomain?: string;\n cookiesMaxAge?: number;\n origin?: string;\n ssaiEngagementTrackingEnabled?: boolean;\n}\n\nexport interface AnalyticsConfig {\n // Analytics/Collector properties\n config?: CollectorConfig;\n debug?: AnalyticsDebugConfig | boolean;\n key?: string;\n playerKey?: string;\n\n // Device specific properties\n deviceType?: string;\n deviceClass?: 'Console' | 'Desktop' | 'Other' | 'Phone' | 'STB' | 'Tablet' | 'TV' | 'Wearable';\n player?: string;\n\n // Default Metadata\n userId?: string; // deprecated\n customUserId?: string;\n\n // Source specific properties\n cdnProvider?: string;\n videoId?: string;\n title?: string;\n isLive?: boolean;\n customData1?: any;\n customData2?: any;\n customData3?: any;\n customData4?: any;\n customData5?: any;\n customData6?: any;\n customData7?: any;\n customData8?: any;\n customData9?: any;\n customData10?: any;\n customData11?: any;\n customData12?: any;\n customData13?: any;\n customData14?: any;\n customData15?: any;\n customData16?: any;\n customData17?: any;\n customData18?: any;\n customData19?: any;\n customData20?: any;\n customData21?: any;\n customData22?: any;\n customData23?: any;\n customData24?: any;\n customData25?: any;\n customData26?: any;\n customData27?: any;\n customData28?: any;\n customData29?: any;\n customData30?: any;\n experimentName?: string;\n}\n\nexport function removeSourceRelatedFields(config: AnalyticsConfig): AnalyticsConfig {\n const sourceSpecificProperties = ['cdnProvider', 'videoId', 'title', 'isLive', 'experimentName'];\n const customDataFieldsRegex = /customData\\d{1,2}$/g;\n\n for (const key in config) {\n if (key.match(customDataFieldsRegex) != null || sourceSpecificProperties.includes(key)) {\n delete config[key];\n }\n }\n\n return config;\n}\n","export interface CustomDataValues {\n customData1?: string;\n customData2?: string;\n customData3?: string;\n customData4?: string;\n customData5?: string;\n customData6?: string;\n customData7?: string;\n customData8?: string;\n customData9?: string;\n customData10?: string;\n customData11?: string;\n customData12?: string;\n customData13?: string;\n customData14?: string;\n customData15?: string;\n customData16?: string;\n customData17?: string;\n customData18?: string;\n customData19?: string;\n customData20?: string;\n customData21?: string;\n customData22?: string;\n customData23?: string;\n customData24?: string;\n customData25?: string;\n customData26?: string;\n customData27?: string;\n customData28?: string;\n customData29?: string;\n customData30?: string;\n experimentName?: string;\n}\n\n/**\n * Lists all keys of the {@see CustomDataValues} interface.\n */\nexport const customDataValuesKeys: Array = [\n 'customData1',\n 'customData2',\n 'customData3',\n 'customData4',\n 'customData5',\n 'customData6',\n 'customData7',\n 'customData8',\n 'customData9',\n 'customData10',\n 'customData11',\n 'customData12',\n 'customData13',\n 'customData14',\n 'customData15',\n 'customData16',\n 'customData17',\n 'customData18',\n 'customData19',\n 'customData20',\n 'customData21',\n 'customData22',\n 'customData23',\n 'customData24',\n 'customData25',\n 'customData26',\n 'customData27',\n 'customData28',\n 'customData29',\n 'customData30',\n 'experimentName',\n];\n\n/**\n * The number of CustomDataXX fields in {@see CustomDataValues}.\n */\nexport const customDataFieldCount = customDataValuesKeys.filter((i) => i.match('customData\\\\d+')).length;\n\nexport const extractCustomDataFieldsOnly = (input: CustomDataValues): CustomDataValues => {\n const retVal: CustomDataValues = {};\n customDataValuesKeys.forEach((key) => {\n if (input[key]) {\n retVal[key] = input[key];\n }\n });\n return retVal;\n};\n","import {FeatureConfigContainer} from './FeatureConfigContainer';\n\nexport interface LicensingRequest {\n key?: string;\n domain: string;\n version: string;\n}\n\nexport enum LicensingResult {\n Denied = 'denied',\n Granted = 'granted',\n Skip = 'skip',\n}\n\nexport interface LicensingResponse {\n status: LicensingResult;\n message: string;\n features?: FeatureConfigContainer;\n}\n\nexport type LicenseCallFunc = (\n key: string,\n domain: string,\n version: string,\n baseUrl: string,\n) => Promise;\n","import {PlayerSize} from '../enums/PlayerSize';\n\nexport interface PlaybackInfo {\n isLive?: boolean;\n playerTech?: string;\n videoDuration?: number;\n streamFormat?: string;\n progUrl?: string;\n m3u8Url?: string;\n mpdUrl?: string;\n videoWindowWidth?: number;\n videoWindowHeight?: number;\n isMuted?: boolean;\n videoBitrate?: number;\n audioBitrate?: number;\n droppedFrames: number;\n isCasting?: boolean;\n castTech?: string;\n screenHeight?: number;\n screenWidth?: number;\n videoPlaybackHeight?: number;\n videoPlaybackWidth?: number;\n videoTitle?: string;\n size?: PlayerSize;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: string;\n subtitleEnabled?: boolean;\n subtitleLanguage?: string;\n}\n\nexport function normalizeVideoDuration(playerVideoDuration: null | number | undefined): number {\n // This covers Live streams and any case in which the duration is not known\n // which should report 0 as videoDuration\n if (\n playerVideoDuration === null ||\n playerVideoDuration === undefined ||\n Number.isNaN(playerVideoDuration) ||\n playerVideoDuration === Infinity\n ) {\n return 0;\n }\n return playerVideoDuration;\n}\n","import {AnalyticsConfig} from './AnalyticsConfig';\nimport {CustomDataValues} from './CustomDataValues';\nimport type {AnalyticsEventBase, ErrorEvent, VideoStartFailedEvent} from './EventData';\nimport {Sample} from './Sample';\n\nexport type HeartbeatPayload = (Pick | Pick | Pick) & {\n /** Flag indicating that the event was triggered by SSAI */\n triggeredBySsai?: boolean;\n};\n\nexport interface StateMachineCallbacks {\n setup: (duration: number, state: string) => void;\n startup: (duration: number, state: string) => void;\n playing: (duration: number, state: string) => void;\n heartbeat: (duration: number, state: string, payload: HeartbeatPayload) => void;\n qualitychange: (duration: number, state: string) => void;\n qualitychange_pause: (duration: number, state: string) => void;\n qualitychange_rebuffering: (duration: number, state: string) => void;\n videoChange: (event: any) => void;\n audioChange: (event: any) => void;\n audiotrack_changing: () => void;\n pause: (duration: number, state: string) => void;\n paused_seeking: (duration: number, state: string) => void;\n end_play_seeking: (duration: number, state: string) => void;\n rebuffering: (duration: number, state: string) => void;\n error: (event: Readonly) => void;\n end: (duration: number, state: string) => void;\n unload: (duration: number, state: string) => void;\n ad: (duration: number, state: string) => void;\n mute: () => void;\n unMute: () => void;\n subtitle_changing: () => void;\n setVideoTimeEndFromEvent: (event: AnalyticsEventBase | any) => void;\n setVideoTimeStartFromEvent: (event: AnalyticsEventBase | any) => void;\n videoStartFailed: (event: Readonly, sendRequest: boolean) => void;\n startCasting: (duration: number, event: any) => void;\n casting: (duration: number, event: any) => void;\n manualSourceChange: (event: {config: AnalyticsConfig}) => void;\n initialSourceChange: (event: {config: AnalyticsConfig}) => void;\n muting_ready: (duration: number, state: string, event: any) => void;\n customdatachange: (duration?: number, state?: string, event?: {values: CustomDataValues}) => void;\n\n /** shuts down the collection and removes/clears all timeouts, intervals, event listeners */\n release: () => void;\n playlistTransition: (event: Readonly) => void;\n}\n\n/**\n * {@link StateMachineCallbacks} object with each callback set to be empty function (doing nothing).\n *\n * Why?:\n * We need to set it as default value in {@link InternalAdapter} for use case, when {@link InternalAdapter}\n * is already created and listen to player events, but {@link Analytics} was not instantiated/initialized yet (that\n * should set correct {@link StateMachineCallbacks} implementation)\n */\nexport const defaultStateMachineCallbacks: StateMachineCallbacks = {\n setup: () => {},\n startup: () => {},\n playing: () => {},\n heartbeat: () => {},\n qualitychange: () => {},\n qualitychange_pause: () => {},\n qualitychange_rebuffering: () => {},\n videoChange: () => {},\n audioChange: () => {},\n audiotrack_changing: () => {},\n pause: () => {},\n paused_seeking: () => {},\n end_play_seeking: () => {},\n rebuffering: () => {},\n error: () => {},\n end: () => {},\n unload: () => {},\n ad: () => {},\n mute: () => {},\n unMute: () => {},\n subtitle_changing: () => {},\n setVideoTimeEndFromEvent: () => {},\n setVideoTimeStartFromEvent: () => {},\n videoStartFailed: () => {},\n startCasting: () => {},\n casting: () => {},\n manualSourceChange: () => {},\n initialSourceChange: () => {},\n muting_ready: () => {},\n customdatachange: () => {},\n release: () => {},\n playlistTransition: () => {},\n};\n","export interface SubtitleInfo {\n /**\n * Indicates if subtitles are displayed.\n */\n enabled: boolean;\n /**\n * The selected subtitle/captions language.\n */\n language?: string;\n}\n\nexport const isDifferentSubtitleInfo = (info1?: SubtitleInfo, info2?: SubtitleInfo): boolean => {\n if (info1 == null && info2 == null) {\n return false;\n }\n return !(info1 != null && info2 != null && info1.enabled === info2.enabled && info1.language === info2.language);\n};\n","import {appendSsaiRoutingParam, isSsaiRelatedSample} from '../core/ssai/ssaiUtils';\nimport type {AdSample, Sample} from '../types/Sample';\n\nimport {post} from './Http';\nimport {joinUrls, noOp} from './Utils';\n\nexport class AnalyticsCall {\n private readonly analyticsServerUrl: string;\n private readonly adAnalyticsServerUrl: string;\n\n constructor(baseUrl: string) {\n this.analyticsServerUrl = joinUrls(baseUrl, 'analytics');\n this.adAnalyticsServerUrl = joinUrls(baseUrl, 'analytics/a');\n }\n\n sendRequest(sample: Sample, callback: () => void) {\n let analyticsUrl = this.analyticsServerUrl;\n if (isSsaiRelatedSample(sample)) {\n analyticsUrl = appendSsaiRoutingParam(analyticsUrl);\n }\n\n post(analyticsUrl, sample, callback);\n }\n\n sendUnloadRequest(sample: Sample) {\n const sendBeaconFallback = (data: Sample) => this.sendRequestSynchronous(data, noOp);\n\n let analyticsUrl = this.analyticsServerUrl;\n if (isSsaiRelatedSample(sample)) {\n analyticsUrl = appendSsaiRoutingParam(analyticsUrl);\n }\n\n this.trySendBeacon(sendBeaconFallback, analyticsUrl, sample);\n }\n\n private trySendBeacon(\n fallbackFunction: (data: any) => void,\n url: string,\n data: unknown,\n requestHeaders: {[headerName: string]: string} = {},\n ) {\n if (typeof navigator.sendBeacon === 'undefined') {\n fallbackFunction(data);\n } else {\n /**\n * With a Blob we can send payload but also http headers\n * @see https://stackoverflow.com/questions/40523469/navigator-sendbeacon-to-pass-header-information\n */\n const blob = new Blob([JSON.stringify(data)], requestHeaders);\n const success = navigator.sendBeacon(url, blob);\n if (!success) {\n fallbackFunction(data);\n }\n }\n }\n\n sendRequestSynchronous(sample: Sample, callback: () => void) {\n let analyticsUrl = this.analyticsServerUrl;\n if (isSsaiRelatedSample(sample)) {\n analyticsUrl = appendSsaiRoutingParam(analyticsUrl);\n }\n\n post(analyticsUrl, sample, callback, false);\n }\n\n sendAdRequest(adSample: AdSample) {\n let adAnalyticsUrl = this.adAnalyticsServerUrl;\n if (isSsaiRelatedSample(adSample)) {\n adAnalyticsUrl = appendSsaiRoutingParam(adAnalyticsUrl);\n }\n\n const sendBeaconFallback = (data: AdSample) => post(adAnalyticsUrl, data, noOp);\n this.trySendBeacon(sendBeaconFallback, adAnalyticsUrl, adSample);\n }\n}\n","import {ProgressiveSourceConfig} from '../types/ProgressiveSourceConfig';\nimport {ProgressiveSourceInfo} from '../types/SourceInfo';\n\nexport const getSourceInfoFromBitmovinSourceConfig = (\n progressive: ProgressiveSourceConfig,\n player: any,\n): ProgressiveSourceInfo => {\n if (!progressive) {\n return {\n progBitrate: undefined,\n progUrl: undefined,\n };\n }\n\n if (typeof progressive === 'string') {\n return {\n progBitrate: 0,\n progUrl: progressive,\n };\n }\n\n if (Array.isArray(progressive) && progressive.length > 0) {\n const playbackVideoData = player.getPlaybackVideoData();\n let progressiveArrayIndex = 0;\n\n if (playbackVideoData !== null && playbackVideoData !== undefined && !isNaN(+playbackVideoData.id)) {\n progressiveArrayIndex = +playbackVideoData.id;\n }\n\n return {\n progBitrate: progressive[progressiveArrayIndex].bitrate || 0,\n progUrl: progressive[progressiveArrayIndex].url,\n };\n }\n\n if (typeof progressive === 'object' && !Array.isArray(progressive)) {\n return {\n progBitrate: progressive.bitrate || 0,\n progUrl: progressive.url,\n };\n }\n\n return {\n progBitrate: undefined,\n progUrl: undefined,\n };\n};\n","const videoFormatCodecMap: {[format: string]: string[]} = {\n avc: ['video/mp4; codecs=\"avc1.42000a\"'],\n vp9: ['video/mp4; codecs=\"vp09.00.50.08\"'],\n av1: ['video/mp4; codecs=\"av01.0.08M.08\"'],\n hevc: ['video/mp4; codecs=\"hev1.1.6.L93.B0\"'],\n};\n\nexport class CodecHelper {\n static get supportedVideoFormats(): string[] | undefined {\n if (!('MediaSource' in window)) {\n return undefined;\n }\n const codecs = Object.getOwnPropertyNames(videoFormatCodecMap).filter((format) =>\n videoFormatCodecMap[format].some((codec) => this.isCodecSupported(codec)),\n );\n return codecs;\n }\n\n static isCodecSupported(codec: string): boolean {\n if (!('MediaSource' in window)) {\n return false;\n }\n\n return MediaSource.isTypeSupported(codec);\n }\n}\n","import * as Utils from './Utils';\n\nexport class Converter {\n static bytesToBits(bytes: number): number {\n return bytes * 8;\n }\n static bitsToBytes(bits: number): number {\n return Math.round(bits / 8);\n }\n static bytesToKiloBytes(bytes: number): number {\n return Utils.calculateTime(bytes * 1000);\n }\n static kiloBytesToMegaBytes(kiloByte: number): number {\n return kiloByte * 1000;\n }\n}\n","export class EventDebugging {\n event: string | undefined;\n from: string | undefined;\n to: string | undefined;\n timestamp: number;\n eventObject: any;\n\n constructor(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any,\n ) {\n this.event = event;\n this.from = from;\n this.to = to;\n this.timestamp = timestamp;\n this.eventObject = eventObject;\n }\n}\n","import {logger} from './Logger';\n\nexport function post(url: string, body: any, callback: any, async = true): void {\n let xhttp: any;\n let isLegacyXDomainRequestUsed = false;\n\n if ((window as any).XDomainRequest) {\n // XDomainRequest is the only way of having an XHR that supports CORS in IE8 and 9. At the time of IE8,\n // Microsoft decided to come up with their own CORS XHR instead of the standard CORS XMLHttpRequest\n // which is now used in IE10.\n // Since IE10, XDomainRequest has been deprecated and since IE11 removed.\n xhttp = new (window as any).XDomainRequest();\n isLegacyXDomainRequestUsed = true;\n } else {\n xhttp = new XMLHttpRequest();\n }\n\n const responseCallback = () => {\n if (xhttp.readyState == XMLHttpRequest.DONE) {\n if (xhttp.responseText <= 0) {\n return;\n }\n\n const sampleResponse = JSON.parse(xhttp.responseText);\n\n callback(sampleResponse);\n }\n };\n\n if (isLegacyXDomainRequestUsed) {\n xhttp.onload = responseCallback;\n } else {\n xhttp.onreadystatechange = responseCallback;\n }\n\n try {\n xhttp.open('POST', url, async);\n\n // XDomainRequest restriction: No custom headers may be added to the request\n // https://learn.microsoft.com/en-us/archive/blogs/ieinternals/xdomainrequest-restrictions-limitations-and-workarounds\n if (!isLegacyXDomainRequestUsed) {\n xhttp.setRequestHeader('Content-Type', 'text/plain');\n }\n\n xhttp.send(JSON.stringify(body));\n } catch (e) {\n logger.error('Failed to send POST request.', e);\n }\n}\n","import {LicensingResponse} from '../types/LicensingRequest';\n\nimport {post} from './Http';\nimport {joinUrls} from './Utils';\n\nexport function LicenseCall(key: string, domain: string, version: string, baseUrl: string): Promise {\n const licenseServerUrl = joinUrls(baseUrl, '/licensing');\n const licensingRequest = {\n analyticsVersion: version,\n domain,\n key,\n };\n\n return new Promise((resolve) => {\n post(licenseServerUrl, licensingRequest, (response) => {\n resolve(response);\n });\n });\n}\n","import {AnalyticsConfig} from '../types/AnalyticsConfig';\n\n/**\n * Uses a Singleton design pattern.\n *\n * We want to ensure that only one object of its kind exists and provides a single point of access to it,\n * to be able to control enabled/disabled `console` logs for customer in whole code base.\n */\nclass Logger {\n private static instance: Logger;\n\n static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n\n return Logger.instance;\n }\n\n private analyticsDebugConfig: Readonly;\n\n private constructor() {}\n\n initialize(analyticsDebugConfig: AnalyticsConfig['debug']) {\n this.analyticsDebugConfig = analyticsDebugConfig;\n }\n\n //#region Console API\n log(message?: unknown, ...optionalParams: unknown[]) {\n if (!this.enabled) {\n return;\n }\n console.log(message, optionalParams); //eslint-disable-line no-console\n }\n\n table(tabularData: unknown, properties?: readonly string[]) {\n if (!this.enabled) {\n return;\n }\n console.table(tabularData, properties); //eslint-disable-line no-console\n }\n\n warn(message?: unknown, ...optionalParams: unknown[]) {\n if (!this.enabled) {\n return;\n }\n console.warn(message, optionalParams); //eslint-disable-line no-console\n }\n\n error(message?: unknown, ...optionalParams: unknown[]) {\n if (!this.enabled) {\n return;\n }\n console.error(message, optionalParams); //eslint-disable-line no-console\n }\n\n /**\n * Outputs an error message to user/customer console.\n *\n * Does not relay on {@link Logger#enabled}! because it should deliver the error information to user/customer.\n */\n errorMessageToUser(message?: unknown, ...optionalParams: unknown[]) {\n console.error(message, ...optionalParams); //eslint-disable-line no-console\n }\n //#endregion\n\n /** `true` if {@link AnalyticsConfig#debug} was set */\n private get enabled() {\n return (this.analyticsDebugConfig as boolean) || false;\n }\n}\n\nexport const padRight = (str: string | undefined, length: number) => {\n const padStr = new Array(length).join(' ');\n return (str + padStr).slice(0, length);\n};\n\nexport const logger = Logger.getInstance();\n","export class Queue {\n private readonly _items: T[] = [];\n\n get items(): ReadonlyArray {\n return this._items;\n }\n\n get length() {\n return this._items.length;\n }\n\n offer(item: T) {\n this._items.push(item);\n }\n\n poll(): T | undefined {\n return this._items.shift();\n }\n\n clear() {\n this._items.splice(0);\n }\n\n limit(maxElements: number) {\n while (this._items.length > maxElements) {\n this.poll();\n }\n }\n}\n","export const MESSAGE_NAMESPACE = 'urn:x-cast:com.bitmovin.analytics.cast';\nexport const ANALYTICS_BACKEND_BASE_URL = 'https://analytics-ingress-global.bitmovin.com';\n\nexport const ANALYTICS_LICENSECALL_TIMEOUT = 1000 * 60;\nexport const ANALYTICS_VIDEOSTART_TIMEOUT = 1000 * 60; // in milliseconds\n\nexport const ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD = 50;\nexport const ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL = 60 * 60 * 1000;\n\n/**\n * Time (in milliseconds) of consecutive buffering until a REBUFFER_TIMEOUT_ERROR is raised.\n */\nexport const ANALYTICS_REBUFFER_TIMEOUT = 1000 * 60 * 2;\n\n/**\n * minimal time (in seconds) a seek event should have in order to be recogniced as seek\n */\nexport const ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD = 3;\n\n/**\n * Has to be greater or equal than Ingress side limit (currently 1000).\n */\nexport const SEQUENCE_NUMBER_LIMIT = 1000;\n","import {PAGE_LOAD_TYPE} from '../enums/PageLoadType';\nimport type {CustomDataValues} from '../types/CustomDataValues';\nimport * as CustomDataUtils from '../types/CustomDataValues';\n\nimport {endsWith, startsWith} from './stringUtils';\n\nexport const isBoolean = (bool: unknown): bool is boolean => bool != null && typeof bool === 'boolean';\n\nexport const toBoolean = (anything: unknown): boolean => Boolean(anything).valueOf();\n\nexport const isNumber = (num: unknown): num is number => num != null && typeof num === 'number';\n\nexport const sanitizePath = (path: string): string => {\n return path.replace(/\\/$/g, '');\n};\n\nexport const calculateTimeWithUndefined = (time?: number): number | undefined => {\n if (time === undefined) {\n return time;\n }\n time = time * 1000;\n return Math.round(time);\n};\n\nexport const calculateTime = (time: number): number => {\n time = time * 1000;\n return Math.round(time);\n};\n\n/**\n * @deprecated Use directly `Date.now()` instead\n *\n * Return the current time in milliseconds.\n */\nexport const getCurrentTimestamp = (): number => {\n return Date.now();\n};\n\nexport const generateUUID = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n/**\n * Empty function returns undefined\n *\n * @deprecated\n */\nexport const noOp = () => undefined;\n\nexport const getCustomDataString = (customData: any): string | undefined => {\n if (typeof customData === 'object') {\n return JSON.stringify(customData);\n } else if (typeof customData === 'function') {\n return getCustomDataString(customData());\n } else if (typeof customData === 'undefined') {\n return customData;\n } else if (typeof customData !== 'string') {\n return String(customData);\n }\n\n return customData;\n};\n\nexport const transferCustomDataFields = (fromConfig: CustomDataValues, toConfig: CustomDataValues) => {\n for (let i = 1; i <= CustomDataUtils.customDataFieldCount; i++) {\n const customDataField = `customData${i}`;\n toConfig[customDataField] = getCustomDataString(fromConfig[customDataField]);\n }\n};\n\nexport const getDocumentPropWithPrefix = (prop: string): string | undefined => {\n const prefixes = ['webkit', 'moz', 'ms', 'o'];\n if (prop in document) {\n return prop;\n }\n\n const pascalCase = prop.charAt(0).toUpperCase() + prop.slice(1);\n for (const prefix of prefixes) {\n if (prefix + pascalCase in document) {\n return prefix + pascalCase;\n }\n }\n return undefined;\n};\n\nexport const isVideoInFullscreen = () => {\n const fullscreenProp = getDocumentPropWithPrefix('fullscreenElement');\n return fullscreenProp !== undefined && document[fullscreenProp] && document[fullscreenProp].nodeName === 'VIDEO';\n};\n\nexport const getHiddenProp = (): string | undefined => {\n return getDocumentPropWithPrefix('hidden');\n};\n\nexport function getPageLoadType(): PAGE_LOAD_TYPE {\n const hiddenProp = getHiddenProp();\n if (hiddenProp != null && document[hiddenProp] === true) {\n return PAGE_LOAD_TYPE.BACKGROUND;\n }\n return PAGE_LOAD_TYPE.FOREGROUND;\n}\n\nexport const getHostnameAndPathFromUrl = (url: string) => {\n const domElement = document.createElement('a');\n domElement.href = url;\n\n return {hostname: domElement.hostname, path: domElement.pathname};\n};\n\nexport const calculatePercentage = (numerator?: number, denominator?: number): number | undefined => {\n if (denominator === undefined || denominator === 0) {\n return undefined;\n }\n return Math.round(((numerator || 0) / denominator) * 100);\n};\n\nexport const getURLResourceName = (url: string): string => {\n if (url.length === 0) {\n return '';\n }\n return url.split('/').pop() || '';\n};\n\nexport const joinUrls = (...args: string[]): string => {\n return args.reduce((prev, current) => {\n const prevUrlValue = endsWith(prev, '/') && current !== undefined ? prev.substr(0, prev.length - 1) : prev;\n const nextUrlValue = startsWith(current, '/') ? current.substr(1) : current;\n return prevUrlValue + '/' + nextUrlValue;\n });\n};\n","import {logger} from './Logger';\nimport * as Utils from './Utils';\n\nexport class ViewportTracker {\n private onIntersectionChanged: () => void;\n private observer?: IntersectionObserver;\n private element: HTMLElement;\n private inViewport?: boolean = undefined;\n private threshold: number;\n private hidden: string | undefined;\n private visibilityChange?: string;\n\n constructor(element: HTMLElement, onIntersectionChanged: () => void, threshold = 1.0) {\n this.threshold = threshold;\n this.onIntersectionChanged = onIntersectionChanged;\n this.element = element;\n\n try {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: '0px',\n threshold,\n };\n this.observer = new IntersectionObserver((entries, observer) => this.handleIntersect(entries, observer), options);\n this.observer.observe(element);\n } catch (_error) {\n logger.log(\"Couldn't create instance of IntersectionObserver. timeInViewport will always be reported as 100%.\");\n }\n\n this.hidden = Utils.getHiddenProp();\n if (this.hidden) {\n this.visibilityChange = this.hidden.replace('hidden', '') + 'visibilitychange';\n document.addEventListener(\n this.visibilityChange,\n (this.handleVisibilityChange = this.handleVisibilityChange.bind(this)),\n false,\n );\n }\n }\n\n isHidden() {\n return this.hidden && document[this.hidden];\n }\n\n isInViewport(): boolean {\n return !this.isHidden() && (this.inViewport == null ? true : this.inViewport);\n }\n\n dispose() {\n if (this.observer) {\n this.observer.unobserve(this.element);\n this.observer.disconnect();\n }\n if (this.visibilityChange) {\n document.removeEventListener(this.visibilityChange, this.handleVisibilityChange, false);\n }\n }\n\n private handleVisibilityChange() {\n this.onIntersectionChanged();\n }\n\n private handleIntersect(entries: IntersectionObserverEntry[], _observer: IntersectionObserver) {\n entries.forEach((i) => {\n if (i.target === this.element) {\n this.inViewport = !(i.intersectionRatio < this.threshold);\n }\n });\n this.onIntersectionChanged();\n }\n}\n","interface EventListener {\n eventName: string;\n func: EventListenerOrEventListenerObject;\n}\n\nexport class WindowEventTracker {\n private trackedObjects: EventListener[] = [];\n\n addEventListener(eventName: string, func: EventListenerOrEventListenerObject) {\n this.trackedObjects.push({eventName, func});\n window.addEventListener(eventName, func);\n }\n\n release() {\n while (this.trackedObjects.length !== 0) {\n const obj = this.trackedObjects.pop();\n if (obj === undefined) {\n continue;\n }\n\n window.removeEventListener(obj.eventName, obj.func);\n }\n }\n}\n","export const setCookie = (\n name: string,\n value: string,\n attributes?: {domain?: string; expires?: string; maxAge?: number},\n): void => {\n let newCookie = name + '=' + value + '; path=/';\n\n if (attributes?.domain) {\n newCookie += `; domain=${attributes.domain}`;\n }\n\n if (attributes?.expires) {\n newCookie += `; expires=${attributes.expires}`;\n }\n\n if (attributes?.maxAge) {\n newCookie += `; max-age=${attributes.maxAge}`;\n }\n\n document.cookie = newCookie;\n};\n\n/** @see https://www.w3schools.com/js/js_cookies.asp */\nexport const getCookie = (cname: string): string => {\n const name = cname + '=';\n const allCookies = document.cookie.split(';');\n for (const c of allCookies) {\n let cookie = c;\n while (cookie.charAt(0) === ' ') {\n cookie = cookie.substring(1); //trim spaces (if any) between ';' and next attribute\n }\n if (cookie.indexOf(name) === 0) {\n return cookie.substring(name.length, c.length);\n }\n }\n return '';\n};\n\n/** @see https://www.w3schools.com/js/js_cookies.asp */\nexport const deleteCookie = (cname: string): void => {\n document.cookie = `${cname}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n};\n","import type {InternalAdapterAPI} from '../adapters/internal/InternalAdapterAPI';\nimport type {Analytics} from '../core/Analytics';\n\nimport {logger} from './Logger';\n\nexport const BITMOVIN_ANALYTICS_AUGMENTED_MARKER = '__bitmovinAnalyticsHasBeenSetup';\n\n/**\n * Checks if analytics has already been initialized on this player instance,\n * aka. if {@link BITMOVIN_ANALYTICS_AUGMENTED_MARKER} is present on the player instance.\n *\n * @param player\n */\nexport function hasPlayerAlreadyBeenAugmented(player: any): boolean {\n return player[BITMOVIN_ANALYTICS_AUGMENTED_MARKER] === true;\n}\n\n/**\n * Marks the player instance as already instrumented by analytics,\n * aka. sets {@link BITMOVIN_ANALYTICS_AUGMENTED_MARKER} on the player instance.\n */\nexport function markPlayerInstanceAsAugmented(player: any) {\n player[BITMOVIN_ANALYTICS_AUGMENTED_MARKER] = true;\n}\n\n/**\n * In context of player augmentation, if player was already augmented, adapter properties\n * {@link Analytics} or {@link InternalAdapterAPI} will stay `undefined`, this type guard\n * is utility to help us check if the instance is defined.\n */\nexport function isDefined(instance: null | T | undefined): instance is T {\n if (instance == null) {\n logger.log(\"Bitmovin Analytics: Adapter hasn't been initialized yet\");\n return false;\n }\n\n return true;\n}\n","export const isValidString = (s: unknown): s is string => s != null && typeof s === 'string';\n\nexport const isEmpty = (s: null | string | undefined): boolean => s == null || s.length === 0;\n\nexport const isBlank = (s: null | string | undefined): boolean => isEmpty(s) || isEmpty(s?.trim());\n\nexport const endsWith = (s: string, suffix: string): boolean => {\n if (!isValidString(s) || !isValidString(suffix)) {\n return false;\n }\n\n // our target is ES5, so we can't use String.prototype.endsWith without checking for it\n if (String.prototype.endsWith != null) {\n return s.endsWith(suffix);\n }\n\n return s.substring(s.length - suffix.length) === suffix;\n};\n\nexport const startsWith = (s: string, prefix: string): boolean => {\n if (!isValidString(s) || !isValidString(prefix)) {\n return false;\n }\n\n // our target is ES5, so we can't use String.prototype.startsWith without checking for it\n if (String.prototype.startsWith != null) {\n return s.startsWith(prefix);\n }\n return s.substring(0, prefix.length) === prefix;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import {AmazonIVSAdapter} from './adapters/amazonIVS/AmazonIVSAdapter';\nimport {Bitmovin8Adapter} from './adapters/bitmovin8/Bitmovin8Adapter';\nimport {BitmovinPwxAnalyticsPackage} from './adapters/bitmovinPwx/BitmovinPwxAnalyticsPackage';\nimport {CAFv3Adapter} from './adapters/cafv3/CAFv3Adapter';\nimport {DashjsAdapter} from './adapters/dashjs/DashjsAdapter';\nimport {HlsAdapter} from './adapters/hlsjs/HlsAdapter';\nimport {HTMLVideoElementAdapter} from './adapters/html5/HTMLVideoElementAdapter';\nimport {ShakaAdapter} from './adapters/shaka/ShakaAdapter';\nimport {VideojsAdapter} from './adapters/videojs/VideoJsAdapter';\nimport {CdnProvider} from './enums/CDNProvider';\nimport {Player} from './enums/Player';\nimport {PlayerModule} from './playerModule';\nimport {VERSION} from './Version';\n\nexport {VERSION as version};\n\nexport type {AnalyticsConfig} from './types/AnalyticsConfig';\n\nexport {Player as Players};\nexport {CdnProvider as CdnProviders};\n\nexport {AmazonIVSAdapter};\nexport {Bitmovin8Adapter};\nexport {CAFv3Adapter};\nexport {DashjsAdapter};\nexport {HTMLVideoElementAdapter};\nexport {HlsAdapter};\nexport {ShakaAdapter};\nexport {VideojsAdapter};\n\nexport const adapters = {\n AmazonIVSAdapter,\n Bitmovin8Adapter,\n CAFv3Adapter,\n DashjsAdapter,\n HTMLVideoElementAdapter,\n HlsAdapter,\n ShakaAdapter,\n VideojsAdapter,\n};\n\nexport {BitmovinPwxAnalyticsPackage};\n\nexport {PlayerModule};\n\nexport default {\n PlayerModule: PlayerModule,\n};\n"],"names":["root","factory","exports","module","define","amd","self","StateMachine","VERSION","Result","SUCCEEDED","NOTRANSITION","CANCELLED","PENDING","Error","INVALID_TRANSITION","PENDING_TRANSITION","INVALID_CALLBACK","WILDCARD","ASYNC","create","cfg","target","initial","state","terminal","fsm","events","callbacks","map","transitions","add","e","from","Array","isArray","name","n","length","push","to","event","hasOwnProperty","buildEvent","current","is","indexOf","this","can","transition","undefined","cannot","concat","isFinished","error","args","msg","states","Object","keys","sort","defer","doCallback","func","apply","beforeAnyEvent","afterAnyEvent","leaveAnyState","enterAnyState","changeState","beforeThisEvent","afterThisEvent","leaveThisState","enterThisState","beforeEvent","afterEvent","leaveState","specific","general","enterState","prototype","slice","call","arguments","cancel","leave","config","player","opts","hasPlayerAlreadyBeenAugmented","logger","errorMessageToUser","markPlayerInstanceAsAugmented","sourceUrlProvider","SourceUrlProvider","internalAdapter","AmazonIVSInternalAdapter","analytics","Analytics","wrapPlayerLoad","originalLoad","load","m3u8Url","getCurrentImpressionId","isDefined","getUserId","setCustomData","values","setCustomDataOnce","sourceChange","version","AmazonIVSAdapter","supportsDeferredLicenseLoading","getPlayerVersion","getVersion","getPlayerName","Player","AMAZON_IVS","getPlayerTech","getAutoPlay","isAutoplay","getDrmPerformanceInfo","heartbeatService","HeartbeatService","getPosition","stateMachine","AmazonIVSStateMachine","stateMachineCallbacks","setListener","playerContext","AmazonIVSPlayerContext","listener","AmazonIVSPlayerEventListener","qualityChangeService","playerStatisticsProvider","getHTMLVideoElement","windowEventListener","WindowEventListener","windowEventTracker","initialize","_analytics","startMonitoring","RELEASE","subscribe","release","resetSourceRelatedState","drmPerformanceInfo","reset","getCurrentPlaybackInfo","videoElement","droppedFrames","getDroppedFrames","isLive","getDuration","Infinity","isMuted","playerTech","videoWindowWidth","clientWidth","videoWindowHeight","clientHeight","videoPlaybackHeight","videoHeight","videoPlaybackWidth","videoWidth","videoBitrate","getQuality","bitrate","videoDuration","normalizeVideoDuration","size","Utils","isVideoInFullscreen","PlayerSize","Fullscreen","Window","getVideoAndAudioCodecs","getCommonPlaybackInfo","streamFormat","StreamTypes","hls","_config","codecs","split","videoCodec","audioCodec","InternalAdapter","dispatcher","onError","payload","errorEvent","currentTime","position","code","message","data","exceptionMessage","exceptionStacktrace","source","eventCallback","Event","ERROR","ErrorService","State","EVENT_DELAY_MS","IDLE","cancelPause","PAUSE_SCHEDULED","PAUSE_CANCELLED","schedulePauseEvent","eventObject","setTimeout","triggerPause","PAUSE","PauseEventDispatcher","pauseDispatcher","ignorePause","onStartupPlaying","onPause","onPlaying","playing","onRebuffering","startBuffering","onQualityChange","qualityChange","onSeek","seek","onSeeked","seeked","START_BUFFERING","PLAYING","shouldAllowVideoQualityChange","setVideoBitrate","VIDEO_CHANGE","SEEK","SEEKED","PlaybackService","StartupState","SETUP","STARTUP_FINISHED","onInitialized","finishSetup","onPlay","startStartup","finishStartup","READY","STARTUP","PLAY","resetValues","setStartupHasFinished","VideoStartupService","videoStartupService","playbackService","errorService","log","onDurationChanged","JSON","stringify","finishedStartup","onQualityChanged","onTimeUpdate","AmazonIVSPlayerEventHandler","IVS_PLAYER_EVENT","DURATION_CHANGED","INITIALIZED","QUALITY_CHANGED","REBUFFERING","SEEK_COMPLETED","TIME_UPDATE","PLAYBACK_RATE_CHANGED","PLAYBACK_BLOCKED","eventHandler","startMonitoringIVSPlayer","startMonitoringHTMLVideoElement","video","addEventListener","bind","COLLECTOR_EVENTS","observer","trigger","forEach","handler","eventBus","CollectorEventBus","CollectorEvents","onPageUnload","UNLOAD","UNLOADED","adCallbacks","AdCallbacks","isLinearAdActive","ads","getContainer","getAdModuleInfo","getModuleInfo","getCurrentTime","register","on","PlayerEvent","Play","issuer","Paused","AdStarted","onAdStarted","AdFinished","onAdFinished","AdBreakStarted","onAdBreakStarted","AdBreakFinished","onAdBreakFinished","AdClicked","onAdClicked","AdQuartile","onAdQuartile","AdSkipped","onAdSkipped","AdError","onAdError","AdManifestLoaded","onAdManifestLoaded","handlePageClose","onBeforeUnload","Bitmovin8AdModule","ssai","adBreakStart","adBreakMetadata","sanitizedAdBreakMetadata","sanitizeBitmovin8AdapterSsaiAdBreakMetadataAdPosition","isValidSsaiAdBreakMetadata","ssaiService","adStart","adMetadata","isValidSsaiAdMetadata","setConfigParameters","adQuartileFinished","adQuartile","adQuartileMetadata","isValidSsaiAdQuartile","validAdQuartileMetadata","sanitizedSsaiAdQuartileMetadata","sanitizeSsaiAdQuartileMetadataFailedBeaconUrl","isValidSsaiAdQuartileMetadata","adBreakEnd","playerConfig","getConfig","analyticsConfig","playerKey","key","Bitmovin8InternalAdapter","Bitmovin8Adapter","ViewMode","speedMeter","segmentTracker","videoCompletionTracker","httpRequestTrackingAdapter","sourceInfoFallbackService","onBeforeUnLoadEvent","BITMOVIN","getPlayerType","Bitmovin8AnalyticsStateMachine","getInfo","getSegments","_adModule","isAdPlaying","warn","lastTrackedCurrentTime","currentAd","getActiveAd","registerPlayerEventListeners","registerUnloadEventListeners","activate","getPlayerCurrentTime","reportEngagementInteraction","ssaiEngagementInteractionData","sendSsaiEngagementAdSample","reportPlaybackInteraction","timestamp","eventData","onSsaiPlaybackInteraction","requestTracking","HttpRequestTracking","ErrorDetailTracking","errorDetailTrackingSettingsProvider","ErrorDetailBackend","collectorConfig","errorDetailSubscribable","clearValues","clearSegments","playback","autoplay","info","getViewMode","getStreamType","offsetWidth","offsetHeight","isCasting","audioLanguage","getAudio","lang","subtitleEnabled","getSource","getDroppedVideoFrames","applySubtitleProperties","applyPlaybackQualityProperties","applyCastingProperties","applySourceProperties","applyStreamFormat","callManualSourceChangeEvent","SourceUnloaded","_event","SOURCE_UNLOADED","SourceLoaded","setVideoDuration","setStreamFormat","SOURCE_LOADED","CastStarted","START_CAST","CastStopped","END_CAST","Playing","TimeChanged","TIMECHANGED","Seek","allowSeeking","Seeked","StallStarted","StallEnded","END_BUFFERING","AudioPlaybackQualityChanged","audioQualityChangedData","sourceQuality","targetQuality","shouldAllowAudioQualityChange","AUDIO_CHANGE","codec","setAudioBitrate","VideoPlaybackQualityChanged","videoQualityChangedData","width","height","ViewModeChanged","START_FULLSCREEN","END_FULLSCREEN","START_AD","END_AD","Muted","MUTE","Unmuted","UN_MUTE","legacyData","additionalData","ErrorCode","BITMOVIN_PLAYER_LICENSING_ERROR","SETUP_MISSING_LICENSE_WHITELIST","_onLicenseCallFailed","dispatch","sendAdEngagementErrorSample","PlaybackFinished","END","DownloadFinished","downloadType","drmType","replace","drmLoadTime","downloadTime","AudioChanged","AUDIOTRACK_CHANGED","SubtitleEnabled","SUBTITLE_CHANGE","SubtitleDisabled","LicenseValidated","_onLicenseKeyReceived","licenseKey","handleCollectorUnload","Destroy","videoTitle","title","mpdUrl","dash","progSourceInfo","getSourceInfoFromBitmovinSourceConfig","progressive","progUrl","progBitrate","enabledSubtitle","subtitles","list","find","s","enabled","subtitleLanguage","videoQuality","getPlaybackVideoData","audioQuality","getPlaybackAudioData","audioBitrate","isAirplayActive","castTech","CastTech","AirPlay","remoteControlConfig","remotecontrol","type","GoogleCast","WebSocket","seekEvent","Math","abs","seekTarget","AnalyticsSettings","ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD","SpeedMeterAdapter","DownloadSpeedMeter","getDownloadSpeedMeter","SegmentTrackerAdapter","SegmentTracker","getSegmentTracker","HttpRequestTrackingAdapter","SourceInfoFallbackService","anything","maybeSsaiAdBreakMetadata","adPosition","eventDispatcher","EventDispatcher","playerExports","onDownloadFinished","callback","unsubscribe","httpRequest","calculateTimeWithUndefined","httpStatus","success","getCurrentTimestamp","url","timeToFirstByte","mapHttpRequestType","HttpRequestType","includes","UNKNOWN","handleSegmentPlaybackEvent","removeSegment","handleOnDownloadFinishEvent","SegmentPlayback","segment","getURLResourceName","addSegment","meter","addMeasurement","duration","Date","context","BitmovinPwxInternalAdapter","dispose","BitmovinPwxAdapter","onAdd","dependencies","BitmovinPwxAnalyticsPackage","_","baseContext","registry","get","CoreExportNames","CoreEffects","EventListenerEffectFactory","StateEffectFactory","using","BundleExportNames","Logger","SourceExportNames","SourceState","PlayerConfig","adapter","abortSignal","removeEventListener","Constants","CoreStateAtoms","SourcesApiExportNames","SourceEventBus","PlaybackApiEventsPackageExportNames","PlaybackEvent","_name","enabledDebugging","debuggingStates","getAllStatesBut","getAllStates","filter","i","callEvent","eventType","exec","_timestamp","_eventObject","createStateMachine","customStateMachineErrorCallback","stayIn","EXIT_BEFORE_VIDEOSTART","onenterstate","starttime","onEnterStateTimestamp","getTime","padRight","onleavestate","addStatesToLog","stateDuration","fromStateName","String","toLowerCase","isStartup","maybeSetOrClearVideoStartTimeouts","startup","unload","setup","clearVideoStartTimeout","handleRestOfTheCallbacks","ontimechanged","_to","onHeartbeat","onplayerError","_from","callbackFunction","logMissingCallbackWarning","setVideoStartTimeout","_currentTime","setVideoTimeEndFromEvent","createHeartbeatPayload","heartbeat","setVideoTimeStartFromEvent","EventDebugging","getStates","setEnabledDebugging","AnalyticsStateMachine","BitmovinPwxAnalyticsStateMachine","playhead","sourceConfig","resources","v","videoRect","element","getBoundingClientRect","round","muted","stream","BITMOVIN_PWX","Version","registerEventListeners","sourceEventBus","playbackAtom","Ready","VideoAttached","Ended","abortListener","abortSignalReason","reason","CreateSourceStateAtom","CreateSourceReference","SourceReferences","SourceApiManager","VideoElementUtils","CAFv3InternalAdapter","CAFv3Adapter","CHROMECAST_SHAKA","currentItem","HTML5AnalyticsStateMachine","playerManager","getPlayerManager","isSeeking","window","cast","framework","getCurrentTimeSec","stats","getStats","getIsLive","mediaInformation","activeAudioTrack","trackContentType","language","activeTextTracks","t","join","audioTracksManager","getAudioTracksManager","getActiveTrack","textTracksManager","getTextTracksManager","getActiveTracks","queueManager","getQueueManager","getCurrentItem","media","currentMediaTime","onPaused","errorData","detailedErrorCode","isBuffering","PLAYLIST_TRANSITION","streamType","getLiveSeekableRange","DashjsInternalAdapter","DashjsAdapter","mediaPlayer","DASHJS","videoEl","getVideoElement","_e","setMediaElement","registerMediaElementEventsForDashJS","mediaElement","listenToMediaElementEvent","needsFirstPlayIntent","html5PlaybackInfo","playbackInfo","codecInfo","getMediaPlayerCodecInfo","applyAndStoreCodecInfo","getMIMEType","MIMETypes","DASH","getStreamURL","toString","getCurrentQualityLevelInfo","currentVideoQuality","getBitrateInfoListFor","getQualityFor","_error","HTML5InternalAdapter","codecsRegExp","RegExp","rawVideoCodec","getCurrentTrackFor","isValidString","isBlank","matches","rawAudioCodec","HlsInternalAdapter","HlsAdapter","HLS_PLAYER_EVENT","MEDIA_ATTACHING","MEDIA_DETACHING","MANIFEST_LOADING","AUDIO_TRACK_SWITCHED","SUBTITLE_TRACK_SWITCH","DESTROYING","HLSJS","constructor","currentLevelObj","getHlsCurrentLevel","details","live","onDestroying","HlsSpeedMeterAdapter","registerHlsEvents","HLS","onMediaAttaching","onMediaDetaching","onManifestLoading","onAudioTrackSwitched","onSubtitleLanguageSwitched","onHlsError","registerMediaElement","onMaybeReady","unregisterMediaElement","selectedSubtitle","getSelectedSubtitleLanguage","getSelectedAudioLanguage","getHlsCodecInfo","errorName","fatal","errorMessage","getErrorCodeFromHlsErrorType","_data","audioTrack","audioTracks","subtitleDisplay","isSubtitleDisplayed","subtitleTrack","subtitleTracks","subtitleTrackController","getSelectedSubtitleFromMediaElement","levels","isNumber","currentLevel","Events","FRAG_LOADED","_eventName","handleFragmentLoadedEvent","frag","networkDetails","status","loadingDuration","loading","end","start","first","measurement","total","isPaused","previousMediaTimeInSeconds","previousMutedValue","HTML5","isNaN","mediaElementEventHandlers","mediaElementOriginalLoadFn","bufferingTimeout","previousClientTime","needsReadyEvent","clearTimeout","registerWindowEvents","getStreamSources","qualityInfo","streamUrl","getMIMETypeFromFileExtension","mimetype","getStreamTypeFromMIMEType","src","readyState","checkQualityLevelAttributes","volume","isAudioMuted","checkSeeking","checkPlayheadProgress","onBuffering","boundHandler","item","originalLoadFunc","onPageClose","paused","ended","BUFFERING_TIMECHANGED_TIMEOUT","silent","qualityLevelInfo","textTracks","attr","mode","currentMediaTimeInSeconds","playbackPositionDeltaInSeconds","now","clientTimeProgressInSeconds","playbackRate","msgTime","toISOString","substring","prefix","logMsg","sourceMetadata","HTMLVideoElementInternalAdapter","setAudioLanguage","sessionData","sanitizeSessionMetadataAudioLanguage","setSubtitleEnabled","sanitizeSessionMetadataSubtitleEnabled","setSubtitleLanguage","sanitizeSessionMetadataSubtitleLanguage","HTMLVideoElementAdapter","currentSrc","previousTotalDroppedFrames","getVideoPlaybackQuality","droppedVideoFrames","currentDroppedFrames","defaultStateMachineCallbacks","SsaiService","_windowEventTracker","WindowEventTracker","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","scale","devicePixelRatio","screenHeight","screen","screenWidth","previousState","currentState","customdatachange","CUSTOM_DATA_CHANGE","playerIsMuted","currentVolume","_issuer","ShakaInternalAdapter","thatInternalAdapter","Promise","resolve","reject","then","result","catch","category","severity","ShakaAdapter","getMediaElement","SHAKA","ShakaPlayerEvent","ONSTATECHANGE","BUFFERING","getShakaCodecInfo","getShakaStreamFormat","getAssetUri","activeVideoTrack","getVariantTracks","track","active","videoId","videoBandwidth","bandwidth","activeTrack","manifestType","getManifestType","getLoadMode","prog","UNLOADING","STATECHANGED","VideojsInternalAdapter","VideojsAdapter","_subtitleInfo","previousTime","playerInstanceVersion","windowVideoJsVersion","videojs","VIDEOJS","VideojsAnalyticsStateMachine","mimeType","currentType","selectedAudioLanguage","getSelectedAudioTrackLanguage","getCodecInfo","tech","IWillNotUseThisInPlugins","isFullscreen","currentVideoJsQualityLevel","that","MANUAL_SOURCE_CHANGE","ready","getSubtitleInfo","seeking","newSubtitleInfo","hasInfoChanged","isDifferentSubtitleInfo","newSelectedAudioLanguage","vhs","mediaAttributes","getMediaAttributes","sourceHandler","playlists","selectedPlaylist","attributes","BANDWIDTH","RESOLUTION","CODECS","CodecHelper","isVideoCodec","isAudioCodec","REBUFFERING_HEARTBEAT_INTERVALS","videoStartupTimeoutMs","Settings","ANALYTICS_VIDEOSTART_TIMEOUT","rebufferTimeoutMs","ANALYTICS_REBUFFER_TIMEOUT","currentRebufferingIntervalIndex","playbackCurrentTimeInSeconds","clearRebufferingTimeoutHandle","clearRebufferingHeartbeatHandle","startRebufferingHeartbeatInterval","resetRebufferingHelpers","startRebufferingTimeoutHandle","rebufferingHeartbeatIntervalHandle","setInterval","buffered","min","clearInterval","rebufferingTimeoutHandle","BUFFERING_TIMEOUT_REACHED","getVideoStartupFailedEventData","getReasonForVideoStartFailure","VideoStartFailedReason","PLAYER_ERROR","PAGE_CLOSED","VIDEOSTART_TIMEOUT","TIMEOUT","videoStartTimeout","SOURCE_CHANGING","PAUSED_SEEKING","QUALITYCHANGE","QUALITYCHANGE_PAUSE","SUBTITLE_CHANGING","AUDIOTRACK_CHANGING","AD","MUTING_READY","MUTING_PLAY","MUTING_PAUSE","CASTING","QUALITYCHANGE_REBUFFERING","CUSTOMDATACHANGE","manualSourceChange","startCasting","onafterevent","playlistTransition","FINISH_QUALITYCHANGE_PAUSE","FINISH_QUALITYCHANGE","FINISH_QUALITYCHANGE_REBUFFERING","FINISH_MUTING","fnName","shouldSendSample","videoStartFailed","pause","videoChange","audioChange","mute","unMute","seekTimestamp","seekedTimestamp","PLAY_SEEKING","END_PLAY_SEEKING","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","seekDuration","paused_seeking","end_play_seeking","onseek","onseeked","played","getStateHandler","startHeartbeat","stopHeartbeat","rebuffering","failedEvent","isErrorEvent","shouldSendVideoStartupSample","QUALITY_CHANGE","qualitychange","SEEKING","seekStarted","seekEnded","INITIAL_SOURCE_CHANGE","AD_STARTUP","AD_READY","AD_PAUSE","AD_PLAYING","onbeforeevent","initialSourceChange","lastTrackedVideoEndObject","ad","noOp","sendCurrentStateSample","triggeredBySsai","eventName","errorCode","_ex","SSAI_RELATED_SAMPLE_MARKER","ignoreStates","ignoredState","isAdPosition","maybeSsaiAdMetadata","adId","adSystem","customData","isSsaiAdQuartile","maybeSsaiAdQuartileMetadata","failedBeaconUrl","toBoolean","adManifestLoadedEvents","isPlaying","adPodPosition","viewportTracker","ViewportTracker","onIntersectionChanged","clearCurrentTimeInterval","activeAdSample","isContainerInViewport","enterViewportTimestamp","timeInViewport","isInViewport","beginPlayingTimestamp","updatePlayingTime","adTagConfig","adConfig","tag","sendAnalyticsRequest","AdBreakSample","adBreak","activeAdBreakSample","getAdManifestLoadedEvent","adStartupTimestamp","resetActiveAd","isLinear","AdSample","adStartupTime","startAd","adSample","completed","completeAd","adDuration","skipped","skipPosition","skipPercentage","calculatePercentage","errorPosition","adBreakSample","id","errorPercentage","adClickthroughUrl","clickThroughUrl","clicked","clickPosition","clickPercentage","quartile","FIRST_QUARTILE","quartile1","MIDPOINT","midpoint","THIRD_QUARTILE","quartile3","closed","closePosition","closePercentage","createNewAdAnalyticsSample","analyticsSample","moduleInfo","AdAnalyticsSample","analyticsVersion","adModule","adModuleVersion","playerStartupTime","pageLoadTime","pageLoadType","getPageLoadType","sample","time","adImpressionId","generateUUID","percentageInViewport","timePlayed","backend","sendAdRequest","started","currentTimeInterval","calculateTime","max","AdAnalytics","TIMEOUT_CURRENT_TIME_INTERVAL","exitPosition","playPercentage","MODULE_NAME","backendFactory","sessionHandler","featureManager","onErrorDetailEventDispatcher","videoStartupTime","droppedSampleFrames","startupTime","authenticationCallback","authenticationCompleted","featureConfigs","configureFeatures","guardAgainstMissingVideoTitle","oldConfig","newConfig","guardAgainstMissingIsLive","removeSourceRelatedFields","mergeCollectorConfig","setState","changeCustomData","sendAnalyticsRequestAndClearValues","impressionId","userId","extractCustomDataFieldsOnly","SessionPersistenceHandler","buildDefaultAnalyticsConfigValues","domain","getDomain","licenseKeyReceivedUnsubscriber","onLicenseKeyReceived","eventArgs","setupSample","init","setupStateMachineCallbacks","features","registerFeatures","adAnalytics","checkForErrorsInConfig","getPlayerInformationFromAdapter","debug","resetFeatures","createBackend","generateNewImpressionId","setUserId","NoOpBackend","stopResetInterval","getDomainFromConfig","sanitizePath","location","hostname","deviceInformation","createDeviceInformationFromConfig","cdnProvider","customUserId","transferCustomDataFields","experimentName","setDuration","performance","timing","loadTime","navigationStart","supportedVideoCodecs","supportedVideoFormats","sanitizedStartupDuration","startupTimeSum","drmPerformance","setCompletionValues","videoStartForClosedState","videoTimeStart","sendUnloadRequest","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","heartbeatPayload","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","setPlaybackVideoPropertiesFromEvent","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","sendRequest","videoStartFailedReason","errorSegments","segments","AD_TYPE","CSAI","subtitle_changing","_duration","_state","setPlaybackInfoFromAdapter","getIsLiveFromConfigOrPlaybackInfo","isBoolean","platform","path","pathname","navigator","userLanguage","userAgent","completedTotal","downloadSpeedInfo","manipulate","setQualityInfoOnSample","copySample","ssaiEngagementTrackingEnabled","isSsaiEngagementStartedData","ssaiAdSample","createStartedAdSample","isSsaiEngagementQuartileData","createQuartileAdSample","isSsaiEngagementErrorData","ssaiErrorAdSample","createErrorAdSample","adIndex","isLiveFromPlayback","origin","addWatched","getCompletionPercentage","Number","value","startResetInterval","increaseCounter","isQualityChangeEventEnabled","QUALITY_CHANGE_THRESHOLD_EXCEEDED","BackendFactory","FeatureManager","oldCollectorConfig","newCollectorConfig","deviceType","model","deviceClass","licensingRequest","isEnabled","inner","createInnerBackend","decorateWithDebuggingBackend","DebuggingBackend","decorateWithBackendFromConfigIfAvailable","innerBackend","wrapBackend","backendUrl","ANALYTICS_BACKEND_BASE_URL","LicenseCheckingBackend","LicenseCall","sequenceNumberAssigningBackend","SequenceNumberBackend","LongPlaytimeFilteringBackend","underlying","fields","debugFields","printFields","sendRequestSynchronous","f","table","measures","measure","Measure","threshold","Converter","bitsToBytes","speed","m","reduce","ceil","totalTime","avgSpeed","minSpeed","maxSpeed","a","b","totalSpeed","speeds","numMeasurements","bytePerSecondToBitPerSecond","bps","bytesToBits","avg","index","splice","DEFAULT_HEARTBEAT_INTERVAL_MS","heartbeatInterval","clearHeartbeat","licenseCall","backendBaseUrl","licenseKeyReceived","licenseLazyLoadingTimeoutHandle","unsubscribeFromAdapter","promise","wrapLicenseCheckPromiseWithCallback","performLicenseCheck","licenseCallFailed","licenseLazyLoadingTimeout","QueueBackend","onLicenseCallFailed","ANALYTICS_LICENSECALL_TIMEOUT","LicensingResult","Denied","Granted","remoteBackend","RemoteBackend","flushTo","err","response","next","nextBackend","isPlayedAboveThreshold","download","_sample","qualityChangeThreshold","ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD","qualityChangeCount","previousVideoBitrate","previousAudioBitrate","startupHasFinished","newBitrate","resetIntervalId","resetCounter","ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL","queue","unloadQueue","syncQueue","adQueue","hasAdModule","analyticsCall","AnalyticsCall","sequenceNumber","updateSampleBeforeSending","isSequenceNumberAboveThreshold","SEQUENCE_NUMBER_LIMIT","COOKIE_NAME_BITMOVIN_ANALYTICS_UUID","COOKIE_DEFAULT_MAX_AGE","cookiesEnabled","deleteCookie","existingUserId","getCookie","cookieDomain","validateCookieDomainValue","cookiesDomain","cookieMaxAge","validateCookieMaxAgeValue","cookiesMaxAge","nowMillis","cookieExpires","toUTCString","setCookie","expires","maxAge","encodeURIComponent","TimespanOverlappingType","watched","overlappingTimespan","mergeWatched","w","time1","k","time2","overlapType","getOverlappingType","Overlapping","mergeAndReplace","getOverlappingTimespan","FirstContainedInSecond","SecondContainedInFirst","None","second","isMomentInTimespan","moment","timespan","firstIndex","secondIndex","newWatchedTimespan","SsaiState","isFirstSampleOfAd","sentAdQuartiles","errorSent","isActivated","AD_BREAK_STARTED","currentAdMetadata","playerCurrentTime","ACTIVE","resetAdData","currentAdImpressionId","timestampOfAdStart","getCurrentMonotonicTimestampInMs","quartileMetadata","timeSinceAdStartedInMs","getMonotonicTimestampInMsSince","resetAdBreakData","SSAI","customDataValuesKeys","adType","ROUTING_URL_PARAM","ROUTING_URL_PARAM_VALUE_SSAI","playbackSample","ssaiEngagementErrorData","buildAdSample","ssaiEngagementStartedData","ssaiEngagementQuartileData","timestampInMs","adEngagementSample","adPlaybackHeight","adPlaybackWidth","customData1","customData2","customData3","customData4","customData5","customData6","customData7","customData8","customData9","customData10","customData11","customData12","customData13","customData14","customData15","customData16","customData17","customData18","customData19","customData20","customData21","customData22","customData23","customData24","customData25","customData26","customData27","customData28","customData29","customData30","videoImpressionId","quartile1FailedBeaconUrl","midpointFailedBeaconUrl","quartile3FailedBeaconUrl","completedFailedBeaconUrl","floor","CdnProvider","videoCodecs","findIndex","startsWith","audioCodecs","VIDEO_STARTUP_TIMEOUT_REACHED","endsWith","MP4","WEBM","PAGE_LOAD_TYPE","mapping","_isEnabled","disable","disabled","configure","authenticated","configContainer","extractConfig","configured","Feature","unregisterFeatures","feature","_queue","_enabled","joinUrls","copyErrorDetailTruncateStringsAndUrls","errorDetail","maxStringLength","maxUrlLength","substr","copyErrorDataTruncateStrings","httpRequests","request","copyHttpRequestTruncateUrls","maxLength","lastRedirectLocation","copyErrorDetailTruncateHttpRequests","maxRequests","limitHttpRequestsOfQueuedErrorDetails","send","errorDetailCopy","MAX_STRING_LENGTH","MAX_URL_LENGTH","post","flush","copy","shift","removeFromQueue","clear","settingsProvider","subscribables","httpRequestTracking","errorIndex","onErrorHandler","httpRequestsCopy","errorId","subscribable","_authenticated","numberOfHttpRequests","errorDetails","_maxRequests","DEFAULT_MAX_REQUESTS","_httpRequestQueue","Queue","onDownloadFinishedHandler","addRequest","items","limit","offer","PlayerModule","hooks","isConfigMissing","isAnalyticsDisabled","analyticsModuleInstance","analyticsBitmovin8Adapter","adManifestLoadedEvent","adFallbackIndex","manifestDownloadTime","downloadTiming","adReplaceContentDuration","replaceContentDuration","currentFallbackIndex","adBreakConfig","adOffset","adPreloadOffset","preloadOffset","adIsPersistent","persistent","fallbackTags","adTagType","adTagUrl","adTagDetails","getHostnameAndPathFromUrl","adTagServer","adTagPath","adScheduleTime","scheduleTime","adIdPlayer","mediaUrl","mediaFileUrl","mediaUrlDetails","mediaPath","mediaServer","advertiser","advertiserName","apiFramework","creative","creativeAdId","creativeId","universalAdId","universalAdIdRegistry","idRegistry","universalAdIdValue","adDescription","minSuggestedDuration","survey","surveyUrl","uri","adTitle","wrapperAdsCount","wrapperAdIds","linearAd","adSkippableAfter","parseSkipAfter","skippableAfter","adSkippable","skippable","skipAfter","sourceSpecificProperties","customDataFieldsRegex","match","customDataFieldCount","input","retVal","playerVideoDuration","casting","muting_ready","info1","info2","baseUrl","analyticsServerUrl","adAnalyticsServerUrl","analyticsUrl","isSsaiRelatedSample","appendSsaiRoutingParam","trySendBeacon","fallbackFunction","requestHeaders","sendBeacon","blob","Blob","adAnalyticsUrl","playbackVideoData","progressiveArrayIndex","videoFormatCodecMap","avc","vp9","av1","hevc","getOwnPropertyNames","format","some","isCodecSupported","MediaSource","isTypeSupported","bytes","bits","bytesToKiloBytes","kiloBytesToMegaBytes","kiloByte","body","async","xhttp","isLegacyXDomainRequestUsed","XDomainRequest","XMLHttpRequest","responseCallback","DONE","responseText","sampleResponse","parse","onload","onreadystatechange","open","setRequestHeader","licenseServerUrl","getInstance","instance","analyticsDebugConfig","console","optionalParams","tabularData","properties","str","_items","poll","maxElements","MESSAGE_NAMESPACE","hiddenProp","getHiddenProp","document","BACKGROUND","FOREGROUND","bool","Boolean","valueOf","num","c","r","random","getCustomDataString","fromConfig","toConfig","CustomDataUtils","customDataField","getDocumentPropWithPrefix","prop","pascalCase","charAt","toUpperCase","fullscreenProp","nodeName","domElement","createElement","href","numerator","denominator","pop","prev","inViewport","options","rootMargin","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","_observer","intersectionRatio","trackedObjects","obj","newCookie","cookie","cname","BITMOVIN_ANALYTICS_AUGMENTED_MARKER","isEmpty","trim","suffix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","adapters"],"sourceRoot":""}