bitmovin-analytics 2.34.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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/Adapter.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/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/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/videojs/VideoJsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/videojs/VideojsInternalAdapter.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/Bitmovin8AnalyticsStateMachine.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/amazonivs/HeartbeatService.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/stateMachineUtils.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/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/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/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/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 {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {CustomDataValues} from '../types/CustomDataValues';\nimport {logger} from '../utils/Logger';\n\nimport {InternalAdapterAPI} from './internal/InternalAdapterAPI';\n\nexport abstract class Adapter {\n protected analytics!: Analytics;\n protected internalAdapter!: InternalAdapterAPI;\n\n getCurrentImpressionId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return undefined;\n }\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.sourceChange(config);\n }\n\n // Checks if analytics is already initialized on this player instance\n protected hasPlayerAlreadyBeenAugmented(player): boolean {\n return (player as any).__bitmovinAnalyticsHasBeenSetup;\n }\n // Marks the player instance as already instrumented by analytics\n protected markPlayerInstanceAsAugmented(player) {\n (player as any).__bitmovinAnalyticsHasBeenSetup = true;\n }\n\n protected guardAgainstNotInitializedAnalytics(): boolean {\n if (!this.analytics) {\n logger.log(\"Bitmovin Analytics: Adapter hasn't been initialized yet\");\n return false;\n }\n return true;\n }\n}\n","import {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {AmazonIVSInternalAdapter} from './AmazonIVSInternalAdapter';\nimport {SourceUrlProvider} from './player/SourceUrlProvider';\n\nexport class AmazonIVSAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n\n const sourceUrlProvider = new SourceUrlProvider();\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new AmazonIVSInternalAdapter(player, sourceUrlProvider, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\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<typeof player.load>): ProgressEvent<FileReader> => {\n sourceUrlProvider.m3u8Url = args[0] as string;\n return originalLoad.apply(player, args);\n };\n }\n}\n","import type {MediaPlayer} from 'amazon-ivs-player';\n\nimport {AmazonIVSStateMachine} from '../../analyticsStateMachines/amazonivs/AmazonIVSStateMachine';\nimport {HeartbeatService} from '../../analyticsStateMachines/amazonivs/HeartbeatService';\nimport {Analytics} from '../../core/Analytics';\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 {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\nimport {AdModuleAPI} from '../internal/ads/AdModuleAPI';\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 playerContext = new AmazonIVSPlayerContext(player);\n const heartbeatService = new HeartbeatService(59700, playerContext);\n const stateMachine = new AmazonIVSStateMachine(this.stateMachineCallbacks, heartbeatService, this.opts);\n heartbeatService.setListener(stateMachine);\n this.stateMachine = stateMachine;\n\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<FeatureConfigContainer, FeatureConfig>[] {\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: ' + 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<CollectorEvent, Listener[]> = {\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<CollectorEvent, EventHandler> = {\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {Bitmovin8InternalAdapter} from './Bitmovin8InternalAdapter';\n\nexport class Bitmovin8Adapter extends Adapter implements AdapterAPI {\n constructor(player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.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 = new Analytics(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 this.wrapPlayerLoad(player, this.analytics);\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<typeof player.load>): Promise<void> => {\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","import type {\n AudioPlaybackQualityChangedEvent,\n PlayerAPI,\n PlayerEventBase,\n SeekEvent,\n UserInteractionEvent,\n VideoPlaybackQualityChangedEvent,\n} from 'bitmovin-player';\n\nimport {Bitmovin8AnalyticsStateMachine} from '../../analyticsStateMachines/Bitmovin8AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\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 {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\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 {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo, normalizeVideoDuration} 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 {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\nimport {AdModuleAPI} from '../internal/ads/AdModuleAPI';\n\nimport {Bitmovin8AdModule} from './Bitmovin8AdModule';\nimport {HttpRequestTrackingAdapter} from './player/HttpRequestTrackingAdapter';\nimport {SegmentTrackerAdapter} from './player/SegmentTrackerAdapter';\nimport {SpeedMeterAdapter} from './player/SpeedMeterAdapter';\n\nenum ViewMode {\n Inline = 'inline',\n Fullscreen = 'fullscreen',\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 this.stateMachine = new Bitmovin8AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.sourceInfoFallbackService = sourceInfoFallbackService;\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.warning('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<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.registerPlayerEventListeners();\n this.registerUnloadEventListeners();\n\n this._adModule = new Bitmovin8AdModule(this.player, this.windowEventTracker);\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 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.resetSourceRelatedState();\n this.videoDuration = this.player.getDuration();\n this.videoCompletionTracker.setVideoDuration(this.player.getDuration());\n this.sourceInfoFallbackService.streamFormat = 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 });\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\n return new Bitmovin8InternalAdapter(\n player,\n speedMeter,\n segmentTracker,\n videoCompletionTracker,\n httpRequestTrackingAdapter,\n sourceInfoFallbackService,\n opts,\n );\n }\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<OnDownloadFinishedEventObject> {\n private eventDispatcher = new EventDispatcher<OnDownloadFinishedEventObject>();\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 switch (downloadType) {\n case this.playerExports.HttpRequestType.MANIFEST_DASH:\n return HttpRequestType.MANIFEST_DASH;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_MASTER:\n return HttpRequestType.MANIFEST_HLS_MASTER;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_VARIANT:\n return HttpRequestType.MANIFEST_HLS_VARIANT;\n case this.playerExports.HttpRequestType.MANIFEST_SMOOTH:\n return HttpRequestType.MANIFEST_SMOOTH;\n case this.playerExports.HttpRequestType.MANIFEST_ADS:\n return HttpRequestType.MANIFEST_ADS;\n case this.playerExports.HttpRequestType.MEDIA_AUDIO:\n return HttpRequestType.MEDIA_AUDIO;\n case this.playerExports.HttpRequestType.MEDIA_VIDEO:\n return HttpRequestType.MEDIA_VIDEO;\n case this.playerExports.HttpRequestType.MEDIA_SUBTITLES:\n return HttpRequestType.MEDIA_SUBTITLES;\n case this.playerExports.HttpRequestType.MEDIA_THUMBNAILS:\n return HttpRequestType.MEDIA_THUMBNAILS;\n case this.playerExports.HttpRequestType.DRM_LICENSE_WIDEVINE:\n return HttpRequestType.DRM_LICENSE_WIDEVINE;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PLAYREADY:\n return HttpRequestType.DRM_LICENSE_PLAYREADY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_FAIRPLAY:\n return HttpRequestType.DRM_LICENSE_FAIRPLAY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PRIMETIME:\n return HttpRequestType.DRM_LICENSE_PRIMETIME;\n case this.playerExports.HttpRequestType.DRM_LICENSE_CLEARKEY:\n return HttpRequestType.DRM_LICENSE_CLEARKEY;\n case this.playerExports.HttpRequestType.DRM_CERTIFICATE_FAIRPLAY:\n return HttpRequestType.DRM_CERTIFICATE_FAIRPLAY;\n case this.playerExports.HttpRequestType.KEY_HLS_AES:\n return HttpRequestType.KEY_HLS_AES;\n case this.playerExports.HttpRequestType.TIME_SYNC:\n return HttpRequestType.TIME_SYNC;\n default:\n return HttpRequestType.UNKNOWN;\n }\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: DownloadFinishedEvent & any) {\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: SegmentPlaybackEvent & any) => {\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {CAFv3InternalAdapter} from './CAFv3InternalAdapter';\n\nexport class CAFv3Adapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new CAFv3InternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo, normalizeVideoDuration} 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<Feature<FeatureConfigContainer, FeatureConfig>> {\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {DashjsInternalAdapter} from './DashjsInternalAdapter';\n\nexport class DashjsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new DashjsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {logger} from '../../utils/Logger';\nimport {HTML5InternalAdapter} from '../html5/HTML5InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\n\nexport class DashjsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(\n private mediaPlayer: any,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(undefined, opts);\n }\n\n override initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\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 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 const source = this.mediaPlayer.getSource();\n if (source) {\n return source.toString();\n }\n\n return 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(): QualityLevelInfo | null {\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.warning('Quality information not available');\n }\n\n return null;\n }\n}\n","import {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {HlsInternalAdapter} from './HlsInternalAdapter';\n\nexport class HlsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HlsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import type {Level, AudioTrackSwitchedData, 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 {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\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\nexport class HlsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n override get downloadSpeedInfo(): DownloadSpeedInfo {\n return this.speedMeter.getInfo();\n }\n\n private speedMeter: DownloadSpeedMeter;\n\n constructor(\n private hls: any,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(undefined, opts);\n this.resetMedia();\n this.speedMeter = new HlsSpeedMeterAdapter(hls, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n }\n\n override initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\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(): QualityLevelInfo | null {\n const currentLevelObj = this.getCurrentLevel();\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 private getCodecInfo(): CodecInfo | null {\n const currentLevelObj = this.getCurrentLevel();\n if (!currentLevelObj) {\n return null;\n }\n\n const videoCodec = currentLevelObj.videoCodec;\n const audioCodec = currentLevelObj.audioCodec;\n return {\n videoCodec: videoCodec,\n audioCodec: audioCodec,\n };\n }\n\n private getCurrentLevel(): Level | null {\n const hls = this.hls;\n\n if (hls.levels == null || hls.levels.length === 0) {\n return null;\n }\n\n if (!isNumber(hls.currentLevel) || hls.currentLevel < 0) {\n return null;\n }\n\n return hls.levels[hls.currentLevel];\n }\n\n override isLive = () => {\n const currentLevelObj = this.getCurrentLevel();\n\n if (currentLevelObj?.details == null) {\n return false;\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('hlsMediaAttaching', this.onMediaAttaching.bind(this));\n this.hls.on('hlsMediaDetaching', this.onMediaDetaching.bind(this));\n this.hls.on('hlsManifestLoading', this.onManifestLoading.bind(this));\n this.hls.on('hlsAudioTrackSwitched', this.onAudioTrackSwitched.bind(this));\n this.hls.on('hlsSubtitleTrackSwitch', this.onSubtitleLanguageSwitched.bind(this));\n this.hls.on('hlsDestroying', this.onDestroying.bind(this));\n this.hls.on('hlsError', 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 info: 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 this.applyCodecInfo(info);\n return info;\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 private applyCodecInfo(info: PlaybackInfo) {\n const codecInfo = this.getCodecInfo();\n // store codec values if available or use fallback if not available\n if (codecInfo?.audioCodec != null) {\n this.sourceInfoFallbackService.audioCodec = codecInfo.audioCodec;\n info.audioCodec = codecInfo.audioCodec;\n } else {\n this.sourceInfoFallbackService.applyAudioCodec(info);\n }\n\n if (codecInfo?.videoCodec != null) {\n this.sourceInfoFallbackService.videoCodec = codecInfo.videoCodec;\n info.videoCodec = codecInfo.videoCodec;\n } else {\n this.sourceInfoFallbackService.applyVideoCodec(info);\n }\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","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 {PlaybackInfo, normalizeVideoDuration} 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 mediaElEventHandlers: Array<{event: string; handler: any}>;\n readonly videoCompletionTracker: VideoCompletionTracker;\n protected needsFirstPlayIntent: boolean;\n private onBeforeUnLoadEvent = false;\n\n private bufferingTimeout?: number;\n private isBuffering: boolean;\n private lastIsLiveStatus: boolean;\n private isPaused: boolean;\n private isSeeking: boolean;\n /** Previous media element time in seconds */\n private previousMediaTimeInSeconds: number;\n /** Previous client time in milliseconds */\n private previousClientTime: number;\n private needsReadyEvent: boolean;\n private mediaElementSet: boolean;\n private previousMutedValue = false;\n private playerStatisticsProvider: HTMLVideoElementStatisticsProvider;\n\n protected constructor(\n protected mediaElement: HTMLVideoElement | undefined,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n this.initializeStateMachine();\n this.mediaElEventHandlers = [];\n this.bufferingTimeout = undefined;\n this.isBuffering = false;\n this.lastIsLiveStatus = 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.mediaElementSet = false;\n this.videoCompletionTracker = new VideoCompletionTracker();\n this.playerStatisticsProvider = new HTMLVideoElementStatisticsProvider(mediaElement);\n }\n\n override resetSourceRelatedState() {\n super.resetSourceRelatedState();\n this.playerStatisticsProvider.reset();\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<Feature<FeatureConfigContainer, FeatureConfig>> {\n if (this.mediaElement) {\n this.setMediaElement();\n }\n this.registerWindowEvents();\n return [];\n }\n\n isLive = () => (this.mediaElement ? this.mediaElement.duration === Infinity : false);\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 | 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 streamFormat: this.getStreamType(),\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 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 // replace previously existing, if calld with args\n if (mediaElement && this.mediaElement) {\n this.unregisterMediaElement();\n this.mediaElementSet = false;\n }\n\n // if called without args we assume it's already there\n // we can also be called with args but without any being there before\n if (mediaElement) {\n this.mediaElement = mediaElement;\n }\n\n if (!this.mediaElement) {\n throw new Error('No media element owned');\n }\n\n if (this.mediaElementSet) {\n throw new Error('Media element already set (only call this once)');\n }\n this.mediaElementSet = true;\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(): QualityLevelInfo | null;\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 resetMedia() {\n this.mediaElement = undefined;\n this.mediaElEventHandlers = [];\n window.clearTimeout(this.bufferingTimeout);\n }\n\n registerMediaElement() {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n this.wrapMediaElementLoad(mediaElement);\n this.listenToMediaElementEvent('loadstart', () => {\n log(`loadstart ${mediaElement.currentTime}`);\n this.eventCallback(Event.READY, {});\n });\n\n this.listenToMediaElementEvent('loadedmetadata', () => {\n log(`loadedmetadata ${mediaElement.currentTime}`);\n // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState\n // HAVE_NOTHING 0 No information is available about the media resource.\n // HAVE_METADATA 1 Enough of the media resource has been retrieved that\n // the metadata attributes are initialized. Seeking will no longer raise an exception.\n // HAVE_CURRENT_DATA 2 Data is available for the current playback position,\n // but not enough to actually play more than one frame.\n // HAVE_FUTURE_DATA 3 Data for the current playback position as well as for\n // at least a little bit of time into the future is available\n // (in other words, at least two frames of video, for example).\n // HAVE_ENOUGH_DATA 4 Enough data is available—and the download rate is high\n // enough—that the media can be played through to the end without interruption.\n if (mediaElement.readyState !== 1) {\n // we can't really gather any more information at this point\n return;\n }\n\n // silent\n this.checkQualityLevelAttributes(true);\n\n // const {duration, autoplay, width, height, videoWidth, videoHeight, muted} = mediaElement;\n\n // // This is redundant with what we give to updateMetadata method.\n // // Not sure if there are good reasons to keep that so or if we should better centralize.\n // const info = {\n // type: 'html5',\n // isLive: this.isLive(),\n // version: this.getPlayerVersion(),\n // streamType: this.getStreamType(),\n // streamUrl: this.getStreamURL(),\n // duration,\n // autoplay,\n // // HTMLVideoElement.width and HTMLVideoElement.height\n // // is a DOMString that reflects the height HTML attribute,\n // // which specifies the height of the display area, in CSS pixels.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // width: width,\n // height: height,\n // // Returns an unsigned long containing the intrinsic\n // // height of the resource in CSS pixels,\n // // taking into account the dimensions, aspect ratio,\n // // clean aperture, resolution, and so forth,\n // // as defined for the format used by the resource.\n // // If the element's ready state is HAVE_NOTHING, the value is 0.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // videoWindowWidth: videoWidth,\n // videoWindowHeight: videoHeight,\n // muted,\n // };\n\n // silence events if we have not yet intended play\n // if (this.needsFirstPlayIntent_) {\n // return;\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 });\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 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 clearTimeout(this.bufferingTimeout);\n this.isPaused = false;\n });\n\n this.listenToMediaElementEvent('error', () => {\n const {currentTime, error} = mediaElement;\n\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 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.mediaElEventHandlers.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 this.eventCallback(Event.READY, {currentTime: this.currentTime});\n }\n\n /**\n * Should only be calld when a mediaElement is attached\n */\n unregisterMediaElement() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n this.mediaElEventHandlers.forEach((item: {event: string; handler: any}) => {\n mediaElement.removeEventListener(item.event, item.handler);\n });\n\n this.resetMedia();\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 const isLive = this.isLive();\n\n // Detect a change of the isLive status and update the metaData of the SM\n if (isLive !== this.lastIsLiveStatus) {\n this.lastIsLiveStatus = isLive;\n\n // TODO: Call event for ISLIVE_CHANGE (similar to VIDEO_CHANGE)\n // The updateMetadata is obsolete, as we introduced the getCurrentPlaybackInfo\n // (we don't notify the statemachine about state changes, instead we poll the adapter for the information)\n // if (!silent) {\n // this.stateMachine.updateMetadata();\n // }\n }\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 protected initializeStateMachine(): void {\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.stateMachine.callEvent(Event.SETUP, {}, 0);\n }\n\n private wrapMediaElementLoad(mediaElement: HTMLVideoElement) {\n const originalLoad = mediaElement.load;\n mediaElement.load = (...args: Parameters<typeof mediaElement.load>): void => {\n this.sourceChange({});\n originalLoad.apply(mediaElement, args);\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {HTMLVideoElementInternalAdapter} from './HTMLVideoElementInternalAdapter';\n\nexport class HTMLVideoElementAdapter extends Adapter implements AdapterAPI {\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 streamFormat?: string;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: string;\n },\n ) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HTMLVideoElementInternalAdapter(player, opts, sourceMetadata);\n this.analytics = new Analytics(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 = audioLanguage;\n },\n setSubtitleEnabled(enabled: boolean) {\n internalAdapter.sessionData.subtitleEnabled = enabled;\n },\n setSubtitleLanguage(subtitleLanguage: string) {\n internalAdapter.sessionData.subtitleLanguage = subtitleLanguage;\n },\n } as const;\n }\n\n override sourceChange(\n config: AnalyticsConfig,\n sourceMetadata?: {\n streamFormat?: string;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: string;\n },\n ) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n\n super.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 {getBrowserInfo} from '../../utils/Utils';\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 streamFormat?: string;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: 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 const browserInfo = getBrowserInfo();\n return `${browserInfo.name} ${browserInfo.version}`;\n };\n\n override getStreamURL() {\n return this.mediaElement ? this.mediaElement.currentSrc : undefined;\n }\n\n getCurrentQualityLevelInfo(): QualityLevelInfo | null {\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 {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 stateMachineCallbacks: StateMachineCallbacks = {...defaultStateMachineCallbacks};\n qualityChangeService: QualityChangeService = new QualityChangeService();\n protected stateMachine!: AnalyticsStateMachine;\n protected opts: AnalyticsStateMachineOptions;\n protected _onLicenseKeyReceived: EventDispatcher<{licenseKey: string}> = new EventDispatcher();\n protected _onLicenseCallFailed: EventDispatcher<any> = 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 = <StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {ShakaInternalAdapter} from './ShakaInternalAdapter';\n\nexport class ShakaAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new ShakaInternalAdapter(player, opts);\n this.analytics = new Analytics(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 private wrapPlayerLoad(player: any) {\n const originalLoad = player.load;\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 (this.internalAdapter as ShakaInternalAdapter).eventCallback(Event.ERROR, eventObject);\n\n reject(error);\n });\n });\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {logger} from '../../utils/Logger';\nimport {HTML5InternalAdapter} from '../html5/HTML5InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\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<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n let videoElement: HTMLVideoElement | undefined;\n try {\n videoElement = this.player.getMediaElement();\n } catch (e) {\n // empty\n }\n\n if (videoElement == null) {\n const onStateChangeEventListener = (state) => {\n if (state.state === 'media-source') {\n try {\n this.player.removeEventListener('onstatechange', onStateChangeEventListener);\n videoElement = this.player.getMediaElement();\n this.setMediaElement(videoElement);\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 this.player.addEventListener('onstatechange', onStateChangeEventListener);\n this.player.addEventListener('unloading', this.onUnloading.bind(this));\n } else {\n this.setMediaElement(videoElement);\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() : false;\n };\n\n override getMIMEType() {\n // FIXME: Could be HLS too, Shaka probably has a method to find out\n return MIMETypes.DASH;\n }\n\n override getStreamURL() {\n return this.player ? this.player.getAssetUri() : null;\n }\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(): QualityLevelInfo | null {\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 private onUnloading = () => {\n this.eventCallback(Event.SOURCE_UNLOADED, {});\n this.release();\n };\n}\n","import {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {VideojsInternalAdapter} from './VideojsInternalAdapter';\n\nexport class VideojsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new VideojsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\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 {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\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 {PlaybackInfo, normalizeVideoDuration} 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<Feature<FeatureConfigContainer, FeatureConfig>> {\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: 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(): QualityLevelInfo | null {\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(): QualityLevelInfo | null {\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 {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<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number,\n ): 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 {EventDebugging} from '../utils/EventDebugging';\nimport {logger, padRight} from '../utils/Logger';\nimport {noOp} from '../utils/Utils';\n\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\nimport {\n createHeartbeatPayload,\n customStateMachineErrorCallback,\n on,\n logMissingCallbackWarning,\n} from './stateMachineUtils';\n\nenum State {\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n /** This event is called when an ad is played directly after the player startup phase */\n AD_STARTUP = 'AD_STARTUP',\n AD_READY = 'AD_READY',\n AD_PAUSE = 'AD_PAUSE',\n AD_PLAYING = 'AD_PLAYING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n INITIAL_SOURCE_CHANGE = 'INITIAL_SOURCE_CHANGE',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class Bitmovin8AnalyticsStateMachine extends AnalyticsStateMachine {\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 constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekStarted = false;\n this.seekEnded = false;\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 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 (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 [`onenter${State.INITIAL_SOURCE_CHANGE}`]: (event, from, to, timestamp, eventObject) => {\n if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.initialSourceChange(eventObject);\n }\n },\n\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\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 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 onHeartbeat(timestamp: number, duration: number, state: string, eventData: AnalyticsEventBase) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventData);\n\n const payload = createHeartbeatPayload(duration, state as Lowercase<string>);\n this.stateMachineCallbacks.heartbeat(duration, state, payload);\n\n this.onEnterStateTimestamp = timestamp;\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventData);\n }\n\n callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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 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","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 on,\n logMissingCallbackWarning,\n} from './stateMachineUtils';\n\nenum State {\n INITIALIZED = 'INITIALIZED',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n AD = 'AD',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\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 createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.INITIALIZED,\n error: customStateMachineErrorCallback,\n events: [\n {name: Event.SETUP, from: State.INITIALIZED, to: State.SETUP},\n on(Event.SETUP).stayIn(State.SETUP),\n on(Event.TIMECHANGED).stayIn(State.SETUP),\n {name: Event.READY, from: [State.SETUP, State.ERROR, State.END, State.SOURCE_CHANGING], to: State.READY},\n on(Event.READY).stayIn(State.READY),\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\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\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.SOURCE_LOADED, from: this.getAllStates(), to: State.SETUP},\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStates(), to: State.SOURCE_CHANGING},\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\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 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 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 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<string>);\n this.stateMachineCallbacks.heartbeat(duration, state, payload);\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventData);\n }\n\n callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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","import * as StateMachine from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\n\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\nimport {customStateMachineErrorCallback, on, logMissingCallbackWarning} from './stateMachineUtils';\n\nenum State {\n AD = 'AD',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n END = 'END',\n ERROR = 'ERROR',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n AUDIOTRACK_CHANGED_PLAYING = 'AUDIOTRACK_CHANGED_PLAYING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n SUBTITLE_CHANGED_PLAYING = 'SUBTITLE_CHANGED_PLAYING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\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 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\n on(Event.TIMECHANGED).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 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 callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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","import {StateMachine} from 'javascript-state-machine';\n\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\nimport {HeartbeatListener, HeartbeatService} from './HeartbeatService';\n\nenum State {\n SETUP = 'SETUP',\n READY = 'READY',\n STARTUP = 'STARTUP',\n PLAYING = 'PLAYING',\n PAUSE = 'PAUSE',\n REBUFFERING = 'REBUFFERING',\n\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n ERROR = 'ERROR',\n UNLOADED = 'UNLOADED',\n QUALITY_CHANGE = 'QUALITY_CHANGE',\n SEEKING = 'SEEKING',\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<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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 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<State, StateHandler>;\n","import {PlayerContext} from '../../adapters/amazonIVS/player/AmazonIVSPlayerContext';\nimport {AnalyticsEventBase} from '../../types/EventData';\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\n constructor(\n private heartbeatIntervalMs: number,\n private playerContext: PlayerContext,\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.playerContext.position,\n };\n this.listener?.onHeartbeat(eventData);\n }, this.heartbeatIntervalMs);\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 type {StateMachineEventDef, StateMachineErrorCallback} from 'javascript-state-machine';\n\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 logger.error('Error in StateMachine: ' + errorMessage);\n};\n\n/**\n *\n * @param duration duration of the heartbeat\n * @param state state of heartbeat\n * @returns payload containing the\n */\nexport const createHeartbeatPayload = (duration: number, state: Lowercase<string>): 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 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.warning('Could not find callback function for ' + state);\n }\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 {VERSION} from '../Version';\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';\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 {VERSION} from '../Version';\nimport {InternalAdapterAPI} from '../adapters/internal/InternalAdapterAPI';\nimport {ErrorCode} from '../enums/ErrorCode';\nimport {PlayerSize} from '../enums/PlayerSize';\nimport {FeatureManager} from '../features/FeatureManager';\nimport {ErrorDetailTrackingSettingsProvider} from '../features/errordetails/ErrorDetailTracking';\nimport {OnErrorDetailEventObject} from '../features/errordetails/OnErrorDetailEventObject';\nimport {AnalyticsConfig, CollectorConfig} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {CustomDataValues, customDataValuesKeys} from '../types/CustomDataValues';\nimport * as EventData from '../types/EventData';\nimport {FeatureConfigContainer} from '../types/FeatureConfigContainer';\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 * as Utils from '../utils/Utils';\nimport {isValidString, isBlank} from '../utils/stringUtils';\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';\n\nexport class Analytics {\n get version(): string {\n return VERSION;\n }\n static version: string = VERSION;\n\n private readonly sessionHandler: SessionPersistenceHandler;\n private readonly adapter: InternalAdapterAPI;\n private readonly backendFactory: BackendFactory;\n private readonly featureManager = new FeatureManager<FeatureConfigContainer>();\n private readonly onErrorDetailEventDispatcher = new EventDispatcher<OnErrorDetailEventObject>();\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 constructor(\n config: AnalyticsConfig,\n adapter: InternalAdapterAPI,\n backendFactory: BackendFactory = new BackendFactory(),\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<OnErrorDetailEventObject> {\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.error('Invalid analytics license key provided');\n return;\n }\n\n logger.setLogging((this.config.debug as boolean) || false);\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 }\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.setDuration(duration);\n this.videoStartupTime = this.sample.videoStartupTime = duration;\n this.sample.supportedVideoCodecs = CodecHelper.supportedVideoFormats;\n this.setState(state);\n\n if (this.startupTime > 0) {\n this.startupTime += duration;\n }\n this.sample.startupTime = this.startupTime;\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 = (duration: number, state: string, sampleData: HeartbeatPayload) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample = {\n ...this.sample,\n ...sampleData,\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<EventData.VideoStartFailedEvent>,\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<EventData.ErrorEvent>) => {\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\n const segmentNames = this.adapter.segments.map((s) => s.name);\n this.sample.errorSegments = segmentNames;\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 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 = 1;\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 // TODO: Better description\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\n this.guardAgainstMissingVideoTitle(this.config, config);\n this.guardAgainstMissingIsLive(this.config, config);\n\n const mergedAnalyticsConfig = mergeAnalyticsConfigs(this.config, config);\n this.adapter.sourceChange(mergedAnalyticsConfig);\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 this.sample.isLive = this.getIsLiveFromConfigOrPlaybackInfo(this.config, info.isLive);\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.isNumber(info.videoPlaybackHeight)) {\n this.sample.videoPlaybackHeight = info.videoPlaybackHeight;\n }\n if (Utils.isNumber(info.videoPlaybackWidth)) {\n this.sample.videoPlaybackWidth = info.videoPlaybackWidth;\n }\n if (Utils.isNumber(info.videoBitrate)) {\n this.sample.videoBitrate = info.videoBitrate;\n }\n if (Utils.isNumber(info.audioBitrate)) {\n this.sample.audioBitrate = info.audioBitrate;\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: 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 const copySample = {...this.sample};\n this.backend.sendRequest(copySample);\n }\n\n sendAnalyticsRequestAndClearValues() {\n this.sendAnalyticsRequest();\n this.clearValues();\n }\n\n sendUnloadRequest() {\n this.backend.sendUnloadRequest(this.sample);\n }\n\n sendAnalyticsRequestSynchronous() {\n this.backend.sendRequestSynchronous(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 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 const filterValuesFromHash = (input: 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\n this.config = {\n ...this.config,\n ...filterValuesFromHash(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.warning(\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 this.setDuration(duration);\n this.setState(state);\n this.sendAnalyticsRequestAndClearValues();\n }\n }\n}\n\nexport function mergeCollectorConfig(\n oldConfig: CollectorConfig | undefined,\n newConfig: CollectorConfig | undefined,\n): CollectorConfig {\n let mergedCollectorConfig = oldConfig != null ? {...oldConfig} : {};\n\n if (newConfig != null) {\n // merging new config should enable the collector by default (unless explicitly disabled in the new config)\n mergedCollectorConfig = {...mergedCollectorConfig, enabled: true, ...newConfig};\n }\n return mergedCollectorConfig;\n}\n\nexport function mergeAnalyticsConfigs(\n oldConfig: AnalyticsConfig | undefined,\n newConfig: AnalyticsConfig | undefined,\n): AnalyticsConfig {\n const mergedCollectorConfig = mergeCollectorConfig(oldConfig?.config, newConfig?.config);\n return {\n ...(oldConfig != null ? oldConfig : {}),\n ...(newConfig != null ? newConfig : {}),\n ...{config: mergedCollectorConfig},\n };\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\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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.logTable([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<TArgs> {\n subscribe(callback: EventHandler<TArgs>): () => void;\n unsubscribe(callback: EventHandler<TArgs>);\n}\n\ntype EventHandler<TArgs> = (args: TArgs) => void;\n\nexport class EventDispatcher<TArgs> implements Subscribable<TArgs> {\n private callbacks: Array<EventHandler<TArgs>> = [];\n\n subscribe(callback: EventHandler<TArgs>): () => 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<TArgs>) {\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 {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\nexport class LicenseCheckingBackend implements Backend {\n promise?: Promise<LicensingResponse>;\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<LicensingResponse> {\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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<LicensingResponse>,\n authenticationCallback: AuthenticationCallback,\n ): Promise<LicensingResponse> {\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\nexport class LongPlaytimeFilteringBackend implements Backend {\n private backend: Backend;\n\n constructor(next: Backend) {\n this.backend = next;\n }\n\n sendRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequest(sample);\n }\n\n sendUnloadRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequestSynchronous(sample);\n }\n\n sendAdRequest(sample: any) {\n this.backend.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\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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\nexport class QueueBackend implements Backend {\n queue: Sample[] = [];\n unloadQueue: Sample[] = [];\n syncQueue: Sample[] = [];\n adQueue: Array<AdSample & AdBreakSample & AdAnalyticsSample> = [];\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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';\n\nimport {Backend} from './Backend';\n\nexport class SequenceNumberBackend implements Backend {\n private underlying: Backend;\n private sequenceNumber = 0;\n\n constructor(underlying: Backend) {\n this.underlying = underlying;\n }\n\n sendRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequest(sample);\n }\n\n sendUnloadRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequestSynchronous(sample);\n }\n\n sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.underlying.sendAdRequest(sample);\n }\n\n private updateSampleBeforeSending(sample: Sample) {\n sample.sequenceNumber = this.sequenceNumber++;\n }\n}\n","import type {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport * as Utils from '../utils/Utils';\nimport {isNumber} from '../utils/Utils';\nimport {deleteCookie, getCookie, setCookie} from '../utils/documentCookieUtils';\nimport {isBlank, isValidString} from '../utils/stringUtils';\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 {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 constructor(\n public streamFormat?: PlaybackInfo['streamFormat'],\n public videoCodec?: PlaybackInfo['videoCodec'],\n public audioCodec?: PlaybackInfo['audioCodec'],\n ) {}\n\n reset() {\n this.streamFormat = undefined;\n this.audioCodec = undefined;\n this.videoCodec = undefined;\n }\n\n applyStreamFormat(playbackInfo: PlaybackInfo) {\n if (isBlank(this.streamFormat)) {\n return;\n }\n playbackInfo.streamFormat = this.streamFormat;\n }\n\n applyVideoCodec(playbackInfo: PlaybackInfo) {\n if (isBlank(this.videoCodec)) {\n return;\n }\n playbackInfo.videoCodec = this.videoCodec;\n }\n\n applyAudioCodec(playbackInfo: PlaybackInfo) {\n if (isBlank(this.audioCodec)) {\n return;\n }\n playbackInfo.audioCodec = this.audioCodec;\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: number | null = 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","export enum CdnProvider {\n CLOUDFLARE = 'cloudflare',\n AKAMAI = 'akamai',\n FASTLY = 'fastly',\n MAXCDN = 'maxcdn',\n CLOUDFRONT = 'cloudfront',\n CHINACACHE = 'chinacache',\n BITGRAVITY = 'bitgravity',\n}\n","export enum CastTech {\n AirPlay = 'AirPlay',\n WebSocket = 'WebSocket',\n GoogleCast = 'GoogleCast',\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 SETUP = 'setup',\n READY = 'ready',\n SOURCE_LOADED = 'sourceLoaded',\n PLAY = 'play',\n PLAYING = 'playing',\n PAUSE = 'pause',\n TIMECHANGED = 'timechanged',\n SEEK = 'seek',\n SEEKED = 'seeked',\n START_CAST = 'startCasting',\n END_CAST = 'endCasting',\n START_BUFFERING = 'startBuffering',\n END_BUFFERING = 'endBuffering',\n AUDIOTRACK_CHANGED = 'audioTrackChanged',\n AUDIO_CHANGE = 'audioChange',\n VIDEO_CHANGE = 'videoChange',\n START_FULLSCREEN = 'startFullscreen',\n END_FULLSCREEN = 'endFullscreen',\n START_AD = 'adStart',\n SUBTITLE_CHANGE = 'subtitleChange',\n END_AD = 'adEnd',\n MUTE = 'mute',\n UN_MUTE = 'unMute',\n ERROR = 'playerError',\n SCREEN_RESIZE = 'resize',\n UNLOAD = 'unload',\n END = 'end',\n SOURCE_UNLOADED = 'sourceUnloaded',\n MANUAL_SOURCE_CHANGE = 'manualSourceChangeInitiated',\n VIDEOSTART_TIMEOUT = 'VIDEOSTART_TIMEOUT',\n CUSTOM_DATA_CHANGE = 'customDataChange',\n PLAYLIST_TRANSITION = 'playlistTransition',\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","export enum PAGE_LOAD_TYPE {\n FOREGROUND = 1,\n BACKGROUND = 2,\n}\n","export enum Player {\n BITMOVIN = 'bitmovin',\n JW = 'jw',\n RADIANT = 'radiant',\n VIDEOJS = 'videojs',\n HLSJS = 'hlsjs',\n SHAKA = 'shaka',\n DASHJS = 'dashjs',\n HTML5 = 'html5',\n CHROMECAST_SHAKA = 'chromecast-shaka',\n AMAZON_IVS = 'amazonivs',\n}\n","export enum PlayerSize {\n Window = 'WINDOW',\n Fullscreen = 'FULLSCREEN',\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 prog = 'progressive',\n hls = 'hls',\n dash = 'dash',\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<TConfigContainer, TConfig extends FeatureConfig> {\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<TConfigContainer> {\n private features: Array<Feature<TConfigContainer, FeatureConfig>> = [];\n\n registerFeatures(features: Array<Feature<TConfigContainer, FeatureConfig>>) {\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<ErrorDetail> {\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 {VERSION} from '../../Version';\nimport {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 {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<FeatureConfigContainer, ErrorDetailTrackingConfig> {\n private errorIndex = 0;\n\n constructor(\n private settingsProvider: ErrorDetailTrackingSettingsProvider,\n private backend: ErrorDetailBackend,\n private subscribables: Array<Subscribable<OnErrorDetailEventObject>>,\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<HttpRequest>();\n\n get maxRequests(): number {\n return this._maxRequests;\n }\n\n get httpRequests(): ReadonlyArray<HttpRequest> {\n return this._httpRequestQueue.items;\n }\n\n constructor(private subscribables: Array<Subscribable<OnDownloadFinishedEventObject>>) {\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","export enum HttpRequestType {\n DRM_LICENSE_WIDEVINE = 'DRM_LICENSE_WIDEVINE',\n DRM_OTHER = 'DRM_OTHER',\n MEDIA_THUMBNAILS = 'MEDIA_THUMBNAILS',\n MEDIA_VIDEO = 'MEDIA_VIDEO',\n MEDIA_AUDIO = 'MEDIA_AUDIO',\n MEDIA_PROGRESSIVE = 'MEDIA_PROGRESSIVE',\n MEDIA_SUBTITLES = 'MEDIA_SUBTITLES',\n MANIFEST_DASH = 'MANIFEST_DASH',\n MANIFEST_HLS = 'MANIFEST_HLS',\n MANIFEST_HLS_MASTER = 'MANIFEST_HLS_MASTER',\n MANIFEST_HLS_VARIANT = 'DRM_LICENSMANIFEST_HLS_VARIANTE_WIDEVINE',\n MANIFEST_SMOOTH = 'MANIFEST_SMOOTH',\n MANIFEST = 'MANIFEST',\n KEY_HLS_AES = 'KEY_HLS_AES',\n UNKNOWN = 'UNKNOWN',\n TIME_SYNC = 'TIME_SYNC',\n DRM_CERTIFICATE_FAIRPLAY = 'DRM_CERTIFICATE_FAIRPLAY',\n DRM_LICENSE_CLEARKEY = 'DRM_LICENSE_CLEARKEY',\n DRM_LICENSE_PRIMETIME = 'DRM_LICENSE_PRIMETIME',\n DRM_LICENSE_FAIRPLAY = 'DRM_LICENSE_FAIRPLAY',\n DRM_LICENSE_PLAYREADY = 'DRM_LICENSE_PLAYREADY',\n MANIFEST_ADS = 'MANIFEST_ADS',\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 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<keyof CustomDataValues> = [\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","import {FeatureConfigContainer} from './FeatureConfigContainer';\n\nexport interface LicensingRequest {\n key?: string;\n domain: string;\n version: string;\n}\n\nexport enum LicensingResult {\n Granted = 'granted',\n Denied = 'denied',\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<LicensingResponse>;\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: number | null | 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<Sample, 'played'> | Pick<Sample, 'buffered'> | Pick<Sample, 'paused'>;\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<ErrorEvent>) => 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<VideoStartFailedEvent>, 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<AnalyticsEventBase>) => 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 {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\n\nimport {post} from './Http';\nimport {joinUrls, noOp} from './Utils';\n\nexport class AnalyticsCall {\n private analyticsServerUrl: string;\n private 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 post(this.analyticsServerUrl, sample, callback);\n }\n\n sendUnloadRequest(sample: Sample) {\n this.trySendBeacon((data: Sample) => this.sendRequestSynchronous(data, noOp), this.getAnalyticsServerUrl(), sample);\n }\n\n trySendBeacon(fallbackFunction: (data: any) => void, url: string, data: any) {\n if (typeof navigator.sendBeacon === 'undefined') {\n fallbackFunction(data);\n } else {\n const success = navigator.sendBeacon(url, JSON.stringify(data));\n if (!success) {\n fallbackFunction(data);\n }\n }\n }\n\n sendRequestSynchronous(sample: Sample, callback: () => void) {\n post(this.analyticsServerUrl, sample, callback, false);\n }\n\n sendAdRequest(sample: AdSample) {\n this.trySendBeacon(\n (data: AdSample) => post(this.getAdAnalyticsServerUrl(), data, noOp),\n this.getAdAnalyticsServerUrl(),\n sample,\n );\n }\n\n getAnalyticsServerUrl() {\n return this.analyticsServerUrl;\n }\n\n getAdAnalyticsServerUrl() {\n return this.adAnalyticsServerUrl;\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 legacyMode = false;\n\n if ((window as any).XDomainRequest) {\n legacyMode = true;\n }\n\n if (legacyMode) {\n xhttp = new (window as any).XDomainRequest();\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 (legacyMode) {\n xhttp.onload = responseCallback;\n } else {\n xhttp.onreadystatechange = responseCallback;\n }\n\n try {\n xhttp.open('POST', url, async);\n if (!legacyMode) {\n xhttp.setRequestHeader('Content-Type', 'text/plain');\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<LicensingResponse> {\n const licenseServerUrl = joinUrls(baseUrl, '/licensing');\n const licensingRequest = {\n analyticsVersion: version,\n domain,\n key,\n };\n\n return new Promise<LicensingResponse>((resolve) => {\n post(licenseServerUrl, licensingRequest, (response) => {\n resolve(response);\n });\n });\n}\n","class Logger {\n constructor(private showLogs = false) {}\n\n setLogging(logging: boolean) {\n this.showLogs = logging;\n }\n\n isLogging() {\n return this.showLogs;\n }\n\n log(message?: unknown, ...optionalParams: unknown[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.log(message, optionalParams);\n }\n\n logTable(tabularData: unknown, properties?: readonly string[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.table(tabularData, properties);\n }\n\n errorMessageToUser(message?: unknown, ...optionalParams: unknown[]) {\n /* eslint-disable-next-line no-console */\n console.error(message, ...optionalParams);\n }\n\n error(message?: unknown, ...optionalParams: unknown[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.error(message, ...optionalParams);\n }\n\n warning(message?: unknown, ...optionalParams: unknown[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.warn(message);\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 = new Logger();\n","export class Queue<T> {\n private readonly _items: T[] = [];\n\n get items(): ReadonlyArray<T> {\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","import {PAGE_LOAD_TYPE} from '../enums/PageLoadType';\nimport * as CustomDataUtils from '../types/CustomDataValues';\nimport type {CustomDataValues} 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 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 getBrowserInfo = () => {\n const ua = navigator.userAgent;\n let tem,\n M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return {name: 'IE', version: tem[1] || ''};\n }\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) return {name: tem[1].replace('OPR', 'Opera'), version: tem[2]};\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) M.splice(1, 1, tem[1]);\n return {name: M[0], version: M[1]};\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; maxAge?: number; expires?: string},\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","export const isValidString = (s: unknown): s is string => s != null && typeof s === 'string';\n\nexport const isEmpty = (s: string | null | undefined): boolean => s == null || s.length === 0;\n\nexport const isBlank = (s: string | null | 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 {VERSION} from './Version';\nimport {AmazonIVSAdapter} from './adapters/amazonIVS/AmazonIVSAdapter';\nimport {Bitmovin8Adapter} from './adapters/bitmovin8/Bitmovin8Adapter';\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';\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 {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","getCurrentImpressionId","guardAgainstNotInitializedAnalytics","analytics","getUserId","setCustomData","values","internalAdapter","setCustomDataOnce","sourceChange","config","hasPlayerAlreadyBeenAugmented","player","__bitmovinAnalyticsHasBeenSetup","markPlayerInstanceAsAugmented","logger","log","Adapter","opts","errorMessageToUser","sourceUrlProvider","SourceUrlProvider","AmazonIVSInternalAdapter","Analytics","wrapPlayerLoad","originalLoad","load","m3u8Url","AmazonIVSAdapter","supportsDeferredLicenseLoading","getPlayerVersion","getVersion","getPlayerName","Player","AMAZON_IVS","getPlayerTech","getAutoPlay","isAutoplay","getDrmPerformanceInfo","playerContext","AmazonIVSPlayerContext","heartbeatService","HeartbeatService","stateMachine","AmazonIVSStateMachine","stateMachineCallbacks","setListener","listener","AmazonIVSPlayerEventListener","qualityChangeService","playerStatisticsProvider","getHTMLVideoElement","windowEventListener","WindowEventListener","windowEventTracker","initialize","startMonitoring","RELEASE","subscribe","release","getPosition","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","onDurationChanged","finishedStartup","onQualityChanged","JSON","stringify","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","version","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","playerConfig","getConfig","analyticsConfig","playerKey","key","Bitmovin8InternalAdapter","Bitmovin8Adapter","ViewMode","speedMeter","segmentTracker","videoCompletionTracker","httpRequestTrackingAdapter","sourceInfoFallbackService","onBeforeUnLoadEvent","BITMOVIN","getPlayerType","Bitmovin8AnalyticsStateMachine","getInfo","getSegments","_adModule","isAdPlaying","warning","lastTrackedCurrentTime","currentAd","getActiveAd","registerPlayerEventListeners","registerUnloadEventListeners","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","SOURCE_LOADED","CastStarted","START_CAST","CastStopped","END_CAST","Playing","TimeChanged","TIMECHANGED","Seek","allowSeeking","Seeked","StallStarted","StallEnded","END_BUFFERING","AudioPlaybackQualityChanged","eventData","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","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","eventDispatcher","EventDispatcher","playerExports","onDownloadFinished","callback","unsubscribe","httpRequest","calculateTimeWithUndefined","httpStatus","success","timestamp","getCurrentTimestamp","url","timeToFirstByte","mapHttpRequestType","HttpRequestType","MANIFEST_DASH","MANIFEST_HLS_MASTER","MANIFEST_HLS_VARIANT","MANIFEST_SMOOTH","MANIFEST_ADS","MEDIA_AUDIO","MEDIA_VIDEO","MEDIA_SUBTITLES","MEDIA_THUMBNAILS","DRM_LICENSE_WIDEVINE","DRM_LICENSE_PLAYREADY","DRM_LICENSE_FAIRPLAY","DRM_LICENSE_PRIMETIME","DRM_LICENSE_CLEARKEY","DRM_CERTIFICATE_FAIRPLAY","KEY_HLS_AES","TIME_SYNC","UNKNOWN","handleSegmentPlaybackEvent","removeSegment","handleOnDownloadFinishEvent","SegmentPlayback","segment","getURLResourceName","addSegment","meter","addMeasurement","duration","Date","CAFv3InternalAdapter","CAFv3Adapter","context","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","reason","isBuffering","PLAYLIST_TRANSITION","streamType","getLiveSeekableRange","DashjsInternalAdapter","DashjsAdapter","mediaPlayer","DASHJS","videoEl","getVideoElement","setMediaElement","registerMediaElementEventsForDashJS","mediaElement","listenToMediaElementEvent","needsFirstPlayIntent","getMIMEType","MIMETypes","DASH","getStreamURL","toString","getCurrentQualityLevelInfo","currentVideoQuality","getBitrateInfoListFor","getQualityFor","HTML5InternalAdapter","HlsInternalAdapter","HlsAdapter","HLSJS","constructor","currentLevelObj","getCurrentLevel","details","live","onDestroying","resetMedia","HlsSpeedMeterAdapter","registerHlsEvents","getCodecInfo","levels","isNumber","currentLevel","HLS","onMediaAttaching","onMediaDetaching","onManifestLoading","onAudioTrackSwitched","onSubtitleLanguageSwitched","onHlsError","registerMediaElement","onMaybeReady","unregisterMediaElement","selectedSubtitle","getSelectedSubtitleLanguage","getSelectedAudioLanguage","applyCodecInfo","errorName","fatal","errorMessage","getErrorCodeFromHlsErrorType","codecInfo","applyAudioCodec","applyVideoCodec","audioTrack","audioTracks","subtitleDisplay","isSubtitleDisplayed","subtitleTrack","subtitleTracks","subtitleTrackController","getSelectedSubtitleFromMediaElement","Events","FRAG_LOADED","_eventName","handleFragmentLoadedEvent","frag","networkDetails","status","loadingDuration","loading","end","start","first","measurement","total","previousMutedValue","HTML5","initializeStateMachine","mediaElEventHandlers","bufferingTimeout","lastIsLiveStatus","isPaused","previousMediaTimeInSeconds","previousClientTime","needsReadyEvent","mediaElementSet","registerWindowEvents","getStreamSources","muted","qualityInfo","streamUrl","getMIMETypeFromFileExtension","mimetype","getStreamTypeFromMIMEType","src","clearTimeout","wrapMediaElementLoad","readyState","checkQualityLevelAttributes","volume","isAudioMuted","checkSeeking","checkPlayheadProgress","onBuffering","boundHandler","item","removeEventListener","onPageClose","paused","ended","BUFFERING_TIMECHANGED_TIMEOUT","silent","qualityLevelInfo","textTracks","attr","mode","callEvent","currentMediaTimeInSeconds","playbackPositionDeltaInSeconds","now","clientTimeProgressInSeconds","playbackRate","msgTime","toISOString","substring","prefix","logMsg","sourceMetadata","HTMLVideoElementInternalAdapter","setAudioLanguage","sessionData","setSubtitleEnabled","setSubtitleLanguage","HTMLVideoElementAdapter","browserInfo","getBrowserInfo","currentSrc","previousTotalDroppedFrames","getVideoPlaybackQuality","droppedVideoFrames","currentDroppedFrames","defaultStateMachineCallbacks","_windowEventTracker","WindowEventTracker","eventType","starttime","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","scale","devicePixelRatio","screenHeight","screen","screenWidth","previousState","currentState","customdatachange","CUSTOM_DATA_CHANGE","playerIsMuted","currentVolume","ShakaInternalAdapter","Promise","resolve","reject","then","result","catch","category","severity","ShakaAdapter","getMediaElement","SHAKA","onUnloading","getAssetUri","activeVideoTrack","getVariantTracks","filter","track","active","videoId","videoBandwidth","bandwidth","VideojsInternalAdapter","VideojsAdapter","_subtitleInfo","previousTime","playerInstanceVersion","isValidString","isBlank","windowVideoJsVersion","videojs","VIDEOJS","VideojsAnalyticsStateMachine","mimeType","currentType","selectedAudioLanguage","getSelectedAudioTrackLanguage","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","onEnterStateTimestamp","videoStartupTimeoutMs","Settings","ANALYTICS_VIDEOSTART_TIMEOUT","rebufferTimeoutMs","ANALYTICS_REBUFFER_TIMEOUT","currentRebufferingIntervalIndex","createStateMachine","playbackCurrentTimeInSeconds","clearVideoStartTimeout","clearRebufferingTimeoutHandle","clearRebufferingHeartbeatHandle","startRebufferingHeartbeatInterval","resetRebufferingHelpers","startRebufferingTimeoutHandle","rebufferingHeartbeatIntervalHandle","setInterval","toLowerCase","getTime","stateDuration","heartbeat","buffered","min","clearInterval","rebufferingTimeoutHandle","BUFFERING_TIMEOUT_REACHED","getVideoStartupFailedEventData","getReasonForVideoStartFailure","VideoStartFailedReason","PLAYER_ERROR","PAGE_CLOSED","VIDEOSTART_TIMEOUT","TIMEOUT","setVideoStartTimeout","videoStartTimeout","AnalyticsStateMachine","debuggingStates","enabledDebugging","seekTimestamp","seekedTimestamp","seekStarted","seekEnded","getAllStatesBut","getAllStates","i","customStateMachineErrorCallback","SOURCE_CHANGING","INITIAL_SOURCE_CHANGE","stayIn","AD_STARTUP","EXIT_BEFORE_VIDEOSTART","QUALITYCHANGE","QUALITYCHANGE_PAUSE","PLAY_SEEKING","END_PLAY_SEEKING","CUSTOMDATACHANGE","SUBTITLE_CHANGING","AUDIOTRACK_CHANGING","AD_READY","AD_PAUSE","AD_PLAYING","MUTING_READY","MUTING_PLAY","MUTING_PAUSE","CASTING","QUALITYCHANGE_REBUFFERING","onbeforeevent","onafterevent","FINISH_QUALITYCHANGE_PAUSE","FINISH_QUALITYCHANGE","FINISH_QUALITYCHANGE_REBUFFERING","FINISH_MUTING","initialSourceChange","manualSourceChange","onenterstate","padRight","setVideoTimeStartFromEvent","startCasting","onleavestate","addStatesToLog","setVideoTimeEndFromEvent","lastTrackedVideoEndObject","fromStateName","String","shouldSendSample","videoStartFailed","seekDuration","end_play_seeking","unload","ad","noOp","setup","callbackFunction","logMissingCallbackWarning","videoChange","audioChange","mute","unMute","onseek","onseeked","ontimechanged","onHeartbeat","onplayerError","createHeartbeatPayload","exec","EventDebugging","getStates","setEnabledDebugging","PAUSED_SEEKING","AD","playlistTransition","fnName","pause","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","paused_seeking","played","getStateHandler","startup","startHeartbeat","stopHeartbeat","rebuffering","failedEvent","isErrorEvent","shouldSendVideoStartupSample","QUALITY_CHANGE","qualitychange","SEEKING","heartbeatIntervalMs","heartbeatInterval","clearHeartbeat","_from","_to","_args","_errorCode","_ex","ignoreStates","ignoredState","adapter","adManifestLoadedEvents","isPlaying","adPodPosition","viewportTracker","ViewportTracker","onIntersectionChanged","clearCurrentTimeInterval","dispose","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","errorCode","includes","id","adId","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","BackendFactory","featureManager","FeatureManager","onErrorDetailEventDispatcher","videoStartupTime","droppedSampleFrames","startupTime","authenticationCallback","authenticationCompleted","featureConfigs","configureFeatures","guardAgainstMissingVideoTitle","oldConfig","newConfig","guardAgainstMissingIsLive","mergedAnalyticsConfig","mergeAnalyticsConfigs","setState","changeCustomData","sendAnalyticsRequestAndClearValues","setConfigParameters","impressionId","sessionHandler","userId","input","retVal","customDataValuesKeys","SessionPersistenceHandler","buildDefaultAnalyticsConfigValues","domain","getDomain","licenseKeyReceivedUnsubscriber","onLicenseKeyReceived","eventArgs","setupSample","init","setupStateMachineCallbacks","features","registerFeatures","adAnalytics","checkForErrorsInConfig","getPlayerInformationFromAdapter","setLogging","debug","resetFeatures","createBackend","generateNewImpressionId","setUserId","NoOpBackend","stopResetInterval","getDomainFromConfig","sanitizePath","location","hostname","deviceInformation","createDeviceInformationFromConfig","cdnProvider","customUserId","transferCustomDataFields","experimentName","setDuration","performance","timing","loadTime","navigationStart","supportedVideoCodecs","supportedVideoFormats","drmPerformance","setCompletionValues","videoStartForClosedState","videoTimeStart","sendUnloadRequest","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","sampleData","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","setPlaybackVideoPropertiesFromEvent","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","sendRequest","videoStartFailedReason","segmentNames","segments","errorSegments","subtitle_changing","setPlaybackInfoFromAdapter","getIsLiveFromConfigOrPlaybackInfo","isBoolean","platform","path","pathname","navigator","userLanguage","userAgent","completedTotal","downloadSpeedInfo","copySample","sendAnalyticsRequestSynchronous","sendRequestSynchronous","isLiveFromPlayback","origin","addWatched","getCompletionPercentage","Number","isNaN","value","startResetInterval","increaseCounter","isQualityChangeEventEnabled","QUALITY_CHANGE_THRESHOLD_EXCEEDED","mergeCollectorConfig","mergedCollectorConfig","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","f","logTable","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","licenseCall","backendBaseUrl","licenseKeyReceived","licenseLazyLoadingTimeoutHandle","unsubscribeFromAdapter","promise","wrapLicenseCheckPromiseWithCallback","performLicenseCheck","licenseCallFailed","licenseLazyLoadingTimeout","QueueBackend","onLicenseCallFailed","ANALYTICS_LICENSECALL_TIMEOUT","LicensingResult","Denied","Granted","remoteBackend","RemoteBackend","flushTo","err","response","next","isPlayedAboveThreshold","download","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","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","playbackInfo","TimespanOverlappingType","watched","overlappingTimespan","mergeWatched","w","time1","k","time2","overlapType","getOverlappingType","Overlapping","mergeAndReplace","getOverlappingTimespan","FirstContainedInSecond","SecondContainedInFirst","None","second","isMomentInTimespan","moment","timespan","firstIndex","secondIndex","newWatchedTimespan","CdnProvider","videoCodecs","audioCodecs","findIndex","startsWith","VIDEO_STARTUP_TIMEOUT_REACHED","MP4","WEBM","endsWith","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","element","shift","removeFromQueue","clear","settingsProvider","subscribables","httpRequestTracking","errorIndex","onErrorHandler","httpRequestsCopy","errorId","subscribable","numberOfHttpRequests","errorDetails","_maxRequests","DEFAULT_MAX_REQUESTS","_httpRequestQueue","Queue","onDownloadFinishedHandler","addRequest","items","limit","offer","PlayerModule","hooks","isConfigMissing","isAnalyticsDisabled","analyticsModuleInstance","analyticsBitmovin8Adapter","videoImpressionId","adManifestLoadedEvent","adFallbackIndex","manifestDownloadTime","downloadTiming","adReplaceContentDuration","replaceContentDuration","currentFallbackIndex","adBreakConfig","adPosition","adOffset","adPreloadOffset","preloadOffset","adIsPersistent","persistent","fallbackTags","adTagType","adTagUrl","adTagDetails","getHostnameAndPathFromUrl","adTagServer","adTagPath","adScheduleTime","scheduleTime","adIdPlayer","mediaUrl","mediaFileUrl","mediaUrlDetails","mediaPath","mediaServer","adPlaybackHeight","adPlaybackWidth","adSystem","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","customDataFieldCount","match","playerVideoDuration","casting","muting_ready","info1","info2","baseUrl","analyticsServerUrl","adAnalyticsServerUrl","trySendBeacon","getAnalyticsServerUrl","fallbackFunction","sendBeacon","getAdAnalyticsServerUrl","playbackVideoData","progressiveArrayIndex","videoFormatCodecMap","avc","vp9","av1","hevc","getOwnPropertyNames","format","some","isCodecSupported","MediaSource","isTypeSupported","bytes","bits","round","bytesToKiloBytes","kiloBytesToMegaBytes","kiloByte","body","async","xhttp","legacyMode","XDomainRequest","XMLHttpRequest","responseCallback","DONE","responseText","sampleResponse","parse","onload","onreadystatechange","open","setRequestHeader","licenseServerUrl","showLogs","logging","isLogging","console","optionalParams","tabularData","properties","table","warn","str","Logger","_items","poll","maxElements","MESSAGE_NAMESPACE","bool","num","c","r","random","getCustomDataString","customData","fromConfig","toConfig","CustomDataUtils","customDataField","getDocumentPropWithPrefix","prop","document","pascalCase","charAt","toUpperCase","fullscreenProp","nodeName","getHiddenProp","hiddenProp","BACKGROUND","FOREGROUND","domElement","createElement","href","numerator","denominator","tem","ua","M","test","appName","appVersion","pop","prev","inViewport","options","rootMargin","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","_observer","intersectionRatio","trackedObjects","eventName","obj","newCookie","cookie","cname","isEmpty","trim","suffix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","adapters"],"sourceRoot":""}
|
|
1
|
+
{"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/Adapter.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/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/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/videojs/VideoJsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/videojs/VideojsInternalAdapter.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/Bitmovin8AnalyticsStateMachine.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/amazonivs/HeartbeatService.ts","webpack://bitmovin.analytics/./src/analyticsStateMachines/stateMachineUtils.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/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/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/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/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 {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {CustomDataValues} from '../types/CustomDataValues';\nimport {logger} from '../utils/Logger';\n\nimport {InternalAdapterAPI} from './internal/InternalAdapterAPI';\n\nexport abstract class Adapter {\n protected analytics!: Analytics;\n protected internalAdapter!: InternalAdapterAPI;\n\n getCurrentImpressionId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n return this.analytics.getCurrentImpressionId();\n }\n\n getUserId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return undefined;\n }\n return this.analytics.getUserId();\n }\n\n setCustomData(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.internalAdapter.setCustomData(values);\n }\n\n setCustomDataOnce(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.setCustomDataOnce(values);\n }\n\n sourceChange(config: AnalyticsConfig) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.sourceChange(config);\n }\n\n // Checks if analytics is already initialized on this player instance\n protected hasPlayerAlreadyBeenAugmented(player): boolean {\n return (player as any).__bitmovinAnalyticsHasBeenSetup;\n }\n // Marks the player instance as already instrumented by analytics\n protected markPlayerInstanceAsAugmented(player) {\n (player as any).__bitmovinAnalyticsHasBeenSetup = true;\n }\n\n protected guardAgainstNotInitializedAnalytics(): boolean {\n if (!this.analytics) {\n logger.log(\"Bitmovin Analytics: Adapter hasn't been initialized yet\");\n return false;\n }\n return true;\n }\n}\n","import {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {AmazonIVSInternalAdapter} from './AmazonIVSInternalAdapter';\nimport {SourceUrlProvider} from './player/SourceUrlProvider';\n\nexport class AmazonIVSAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n\n const sourceUrlProvider = new SourceUrlProvider();\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new AmazonIVSInternalAdapter(player, sourceUrlProvider, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\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<typeof player.load>): ProgressEvent<FileReader> => {\n sourceUrlProvider.m3u8Url = args[0] as string;\n return originalLoad.apply(player, args);\n };\n }\n}\n","import type {MediaPlayer} from 'amazon-ivs-player';\n\nimport {AmazonIVSStateMachine} from '../../analyticsStateMachines/amazonivs/AmazonIVSStateMachine';\nimport {HeartbeatService} from '../../analyticsStateMachines/amazonivs/HeartbeatService';\nimport {Analytics} from '../../core/Analytics';\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 {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\nimport {AdModuleAPI} from '../internal/ads/AdModuleAPI';\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 playerContext = new AmazonIVSPlayerContext(player);\n const heartbeatService = new HeartbeatService(59700, playerContext);\n const stateMachine = new AmazonIVSStateMachine(this.stateMachineCallbacks, heartbeatService, this.opts);\n heartbeatService.setListener(stateMachine);\n this.stateMachine = stateMachine;\n\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<FeatureConfigContainer, FeatureConfig>[] {\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: ' + 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<CollectorEvent, Listener[]> = {\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<CollectorEvent, EventHandler> = {\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {Bitmovin8InternalAdapter} from './Bitmovin8InternalAdapter';\n\nexport class Bitmovin8Adapter extends Adapter implements AdapterAPI {\n constructor(player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.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 = new Analytics(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 this.wrapPlayerLoad(player, this.analytics);\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<typeof player.load>): Promise<void> => {\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","import type {\n AudioPlaybackQualityChangedEvent,\n PlayerAPI,\n PlayerEventBase,\n SeekEvent,\n UserInteractionEvent,\n VideoPlaybackQualityChangedEvent,\n} from 'bitmovin-player';\n\nimport {Bitmovin8AnalyticsStateMachine} from '../../analyticsStateMachines/Bitmovin8AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\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 {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\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 {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo, normalizeVideoDuration} 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 {InternalAdapter} from '../internal/InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\nimport {AdModuleAPI} from '../internal/ads/AdModuleAPI';\n\nimport {Bitmovin8AdModule} from './Bitmovin8AdModule';\nimport {HttpRequestTrackingAdapter} from './player/HttpRequestTrackingAdapter';\nimport {SegmentTrackerAdapter} from './player/SegmentTrackerAdapter';\nimport {SpeedMeterAdapter} from './player/SpeedMeterAdapter';\n\nenum ViewMode {\n Inline = 'inline',\n Fullscreen = 'fullscreen',\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 this.stateMachine = new Bitmovin8AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.sourceInfoFallbackService = sourceInfoFallbackService;\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<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.registerPlayerEventListeners();\n this.registerUnloadEventListeners();\n\n this._adModule = new Bitmovin8AdModule(this.player, this.windowEventTracker);\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 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.resetSourceRelatedState();\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 });\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\n return new Bitmovin8InternalAdapter(\n player,\n speedMeter,\n segmentTracker,\n videoCompletionTracker,\n httpRequestTrackingAdapter,\n sourceInfoFallbackService,\n opts,\n );\n }\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<OnDownloadFinishedEventObject> {\n private eventDispatcher = new EventDispatcher<OnDownloadFinishedEventObject>();\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 switch (downloadType) {\n case this.playerExports.HttpRequestType.MANIFEST_DASH:\n return HttpRequestType.MANIFEST_DASH;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_MASTER:\n return HttpRequestType.MANIFEST_HLS_MASTER;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_VARIANT:\n return HttpRequestType.MANIFEST_HLS_VARIANT;\n case this.playerExports.HttpRequestType.MANIFEST_SMOOTH:\n return HttpRequestType.MANIFEST_SMOOTH;\n case this.playerExports.HttpRequestType.MANIFEST_ADS:\n return HttpRequestType.MANIFEST_ADS;\n case this.playerExports.HttpRequestType.MEDIA_AUDIO:\n return HttpRequestType.MEDIA_AUDIO;\n case this.playerExports.HttpRequestType.MEDIA_VIDEO:\n return HttpRequestType.MEDIA_VIDEO;\n case this.playerExports.HttpRequestType.MEDIA_SUBTITLES:\n return HttpRequestType.MEDIA_SUBTITLES;\n case this.playerExports.HttpRequestType.MEDIA_THUMBNAILS:\n return HttpRequestType.MEDIA_THUMBNAILS;\n case this.playerExports.HttpRequestType.DRM_LICENSE_WIDEVINE:\n return HttpRequestType.DRM_LICENSE_WIDEVINE;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PLAYREADY:\n return HttpRequestType.DRM_LICENSE_PLAYREADY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_FAIRPLAY:\n return HttpRequestType.DRM_LICENSE_FAIRPLAY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PRIMETIME:\n return HttpRequestType.DRM_LICENSE_PRIMETIME;\n case this.playerExports.HttpRequestType.DRM_LICENSE_CLEARKEY:\n return HttpRequestType.DRM_LICENSE_CLEARKEY;\n case this.playerExports.HttpRequestType.DRM_CERTIFICATE_FAIRPLAY:\n return HttpRequestType.DRM_CERTIFICATE_FAIRPLAY;\n case this.playerExports.HttpRequestType.KEY_HLS_AES:\n return HttpRequestType.KEY_HLS_AES;\n case this.playerExports.HttpRequestType.TIME_SYNC:\n return HttpRequestType.TIME_SYNC;\n default:\n return HttpRequestType.UNKNOWN;\n }\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: DownloadFinishedEvent & any) {\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: SegmentPlaybackEvent & any) => {\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {CAFv3InternalAdapter} from './CAFv3InternalAdapter';\n\nexport class CAFv3Adapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new CAFv3InternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo, normalizeVideoDuration} 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<Feature<FeatureConfigContainer, FeatureConfig>> {\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {DashjsInternalAdapter} from './DashjsInternalAdapter';\n\nexport class DashjsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new DashjsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\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 {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\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<Feature<FeatureConfigContainer, FeatureConfig>> {\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 const source = this.mediaPlayer.getSource();\n if (source) {\n return source.toString();\n }\n\n return 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(): QualityLevelInfo | null {\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {HlsInternalAdapter} from './HlsInternalAdapter';\n\nexport class HlsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HlsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import type {default as Hls, Events, Level, AudioTrackSwitchedData, 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 {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\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\n this.resetMedia();\n\n this.hls = hls;\n this.speedMeter = new HlsSpeedMeterAdapter(hls, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n }\n\n override initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\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(): QualityLevelInfo | null {\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 false;\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 {PlaybackInfo, normalizeVideoDuration} 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 mediaElEventHandlers: Array<{event: string; handler: any}>;\n readonly videoCompletionTracker: VideoCompletionTracker;\n protected needsFirstPlayIntent: boolean;\n private onBeforeUnLoadEvent = false;\n\n private bufferingTimeout?: number;\n private isBuffering: boolean;\n private lastIsLiveStatus: boolean;\n private isPaused: boolean;\n private isSeeking: boolean;\n /** Previous media element time in seconds */\n private previousMediaTimeInSeconds: number;\n /** Previous client time in milliseconds */\n private previousClientTime: number;\n private needsReadyEvent: boolean;\n private mediaElementSet: boolean;\n private previousMutedValue = false;\n private playerStatisticsProvider: HTMLVideoElementStatisticsProvider;\n\n protected constructor(\n protected mediaElement: HTMLVideoElement | undefined,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n this.initializeStateMachine();\n this.mediaElEventHandlers = [];\n this.bufferingTimeout = undefined;\n this.isBuffering = false;\n this.lastIsLiveStatus = 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.mediaElementSet = false;\n this.videoCompletionTracker = new VideoCompletionTracker();\n this.playerStatisticsProvider = new HTMLVideoElementStatisticsProvider(mediaElement);\n }\n\n override resetSourceRelatedState() {\n super.resetSourceRelatedState();\n this.playerStatisticsProvider.reset();\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<Feature<FeatureConfigContainer, FeatureConfig>> {\n if (this.mediaElement) {\n this.setMediaElement();\n }\n this.registerWindowEvents();\n return [];\n }\n\n isLive = () => (this.mediaElement ? this.mediaElement.duration === Infinity : false);\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 | 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 streamFormat: this.getStreamType(),\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 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 // replace previously existing, if calld with args\n if (mediaElement && this.mediaElement) {\n this.unregisterMediaElement();\n this.mediaElementSet = false;\n }\n\n // if called without args we assume it's already there\n // we can also be called with args but without any being there before\n if (mediaElement) {\n this.mediaElement = mediaElement;\n }\n\n if (!this.mediaElement) {\n throw new Error('No media element owned');\n }\n\n if (this.mediaElementSet) {\n throw new Error('Media element already set (only call this once)');\n }\n this.mediaElementSet = true;\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(): QualityLevelInfo | null;\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 resetMedia() {\n this.mediaElement = undefined;\n this.mediaElEventHandlers = [];\n window.clearTimeout(this.bufferingTimeout);\n }\n\n registerMediaElement() {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n this.wrapMediaElementLoad(mediaElement);\n this.listenToMediaElementEvent('loadstart', () => {\n log(`loadstart ${mediaElement.currentTime}`);\n this.eventCallback(Event.READY, {});\n });\n\n this.listenToMediaElementEvent('loadedmetadata', () => {\n log(`loadedmetadata ${mediaElement.currentTime}`);\n // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState\n // HAVE_NOTHING 0 No information is available about the media resource.\n // HAVE_METADATA 1 Enough of the media resource has been retrieved that\n // the metadata attributes are initialized. Seeking will no longer raise an exception.\n // HAVE_CURRENT_DATA 2 Data is available for the current playback position,\n // but not enough to actually play more than one frame.\n // HAVE_FUTURE_DATA 3 Data for the current playback position as well as for\n // at least a little bit of time into the future is available\n // (in other words, at least two frames of video, for example).\n // HAVE_ENOUGH_DATA 4 Enough data is available—and the download rate is high\n // enough—that the media can be played through to the end without interruption.\n if (mediaElement.readyState !== 1) {\n // we can't really gather any more information at this point\n return;\n }\n\n // silent\n this.checkQualityLevelAttributes(true);\n\n // const {duration, autoplay, width, height, videoWidth, videoHeight, muted} = mediaElement;\n\n // // This is redundant with what we give to updateMetadata method.\n // // Not sure if there are good reasons to keep that so or if we should better centralize.\n // const info = {\n // type: 'html5',\n // isLive: this.isLive(),\n // version: this.getPlayerVersion(),\n // streamType: this.getStreamType(),\n // streamUrl: this.getStreamURL(),\n // duration,\n // autoplay,\n // // HTMLVideoElement.width and HTMLVideoElement.height\n // // is a DOMString that reflects the height HTML attribute,\n // // which specifies the height of the display area, in CSS pixels.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // width: width,\n // height: height,\n // // Returns an unsigned long containing the intrinsic\n // // height of the resource in CSS pixels,\n // // taking into account the dimensions, aspect ratio,\n // // clean aperture, resolution, and so forth,\n // // as defined for the format used by the resource.\n // // If the element's ready state is HAVE_NOTHING, the value is 0.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // videoWindowWidth: videoWidth,\n // videoWindowHeight: videoHeight,\n // muted,\n // };\n\n // silence events if we have not yet intended play\n // if (this.needsFirstPlayIntent_) {\n // return;\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 });\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 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 clearTimeout(this.bufferingTimeout);\n this.isPaused = false;\n });\n\n this.listenToMediaElementEvent('error', () => {\n const {currentTime, error} = mediaElement;\n\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 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.mediaElEventHandlers.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 this.eventCallback(Event.READY, {currentTime: this.currentTime});\n }\n\n /**\n * Should only be calld when a mediaElement is attached\n */\n unregisterMediaElement() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n this.mediaElEventHandlers.forEach((item: {event: string; handler: any}) => {\n mediaElement.removeEventListener(item.event, item.handler);\n });\n\n this.resetMedia();\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 const isLive = this.isLive();\n\n // Detect a change of the isLive status and update the metaData of the SM\n if (isLive !== this.lastIsLiveStatus) {\n this.lastIsLiveStatus = isLive;\n }\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 protected initializeStateMachine(): void {\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.stateMachine.callEvent(Event.SETUP, {}, 0);\n }\n\n private wrapMediaElementLoad(mediaElement: HTMLVideoElement) {\n const originalLoad = mediaElement.load;\n mediaElement.load = (...args: Parameters<typeof mediaElement.load>): void => {\n this.sourceChange({});\n originalLoad.apply(mediaElement, args);\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {HTMLVideoElementInternalAdapter} from './HTMLVideoElementInternalAdapter';\n\nexport class HTMLVideoElementAdapter extends Adapter implements AdapterAPI {\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 streamFormat?: string;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: string;\n },\n ) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HTMLVideoElementInternalAdapter(player, opts, sourceMetadata);\n this.analytics = new Analytics(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 = audioLanguage;\n },\n setSubtitleEnabled(enabled: boolean) {\n internalAdapter.sessionData.subtitleEnabled = enabled;\n },\n setSubtitleLanguage(subtitleLanguage: string) {\n internalAdapter.sessionData.subtitleLanguage = subtitleLanguage;\n },\n } as const;\n }\n\n override sourceChange(\n config: AnalyticsConfig,\n sourceMetadata?: {\n streamFormat?: string;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: string;\n },\n ) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n\n super.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 {getBrowserInfo} from '../../utils/Utils';\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 streamFormat?: string;\n audioCodec?: string;\n videoCodec?: string;\n audioLanguage?: 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 const browserInfo = getBrowserInfo();\n return `${browserInfo.name} ${browserInfo.version}`;\n };\n\n override getStreamURL() {\n return this.mediaElement ? this.mediaElement.currentSrc : undefined;\n }\n\n getCurrentQualityLevelInfo(): QualityLevelInfo | null {\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 {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 stateMachineCallbacks: StateMachineCallbacks = {...defaultStateMachineCallbacks};\n qualityChangeService: QualityChangeService = new QualityChangeService();\n protected stateMachine!: AnalyticsStateMachine;\n protected opts: AnalyticsStateMachineOptions;\n protected _onLicenseKeyReceived: EventDispatcher<{licenseKey: string}> = new EventDispatcher();\n protected _onLicenseCallFailed: EventDispatcher<any> = 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 = <StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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 {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {ShakaInternalAdapter} from './ShakaInternalAdapter';\n\nexport class ShakaAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new ShakaInternalAdapter(player, opts);\n this.analytics = new Analytics(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 private wrapPlayerLoad(player: any) {\n const originalLoad = player.load;\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 (this.internalAdapter as ShakaInternalAdapter).eventCallback(Event.ERROR, eventObject);\n\n reject(error);\n });\n });\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {logger} from '../../utils/Logger';\nimport {HTML5InternalAdapter} from '../html5/HTML5InternalAdapter';\nimport {InternalAdapterAPI} from '../internal/InternalAdapterAPI';\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<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n let videoElement: HTMLVideoElement | undefined;\n try {\n videoElement = this.player.getMediaElement();\n } catch (e) {\n // empty\n }\n\n if (videoElement == null) {\n const onStateChangeEventListener = (state) => {\n if (state.state === 'media-source') {\n try {\n this.player.removeEventListener('onstatechange', onStateChangeEventListener);\n videoElement = this.player.getMediaElement();\n this.setMediaElement(videoElement);\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 this.player.addEventListener('onstatechange', onStateChangeEventListener);\n this.player.addEventListener('unloading', this.onUnloading.bind(this));\n } else {\n this.setMediaElement(videoElement);\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() : false;\n };\n\n override getMIMEType() {\n // FIXME: Could be HLS too, Shaka probably has a method to find out\n return MIMETypes.DASH;\n }\n\n override getStreamURL() {\n return this.player ? this.player.getAssetUri() : null;\n }\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(): QualityLevelInfo | null {\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 private onUnloading = () => {\n this.eventCallback(Event.SOURCE_UNLOADED, {});\n this.release();\n };\n}\n","import {AdapterAPI} from '../../api/AdapterAPI';\nimport {Analytics} from '../../core/Analytics';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {logger} from '../../utils/Logger';\nimport {Adapter} from '../Adapter';\n\nimport {VideojsInternalAdapter} from './VideojsInternalAdapter';\n\nexport class VideojsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new VideojsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\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 {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\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 {PlaybackInfo, normalizeVideoDuration} 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<Feature<FeatureConfigContainer, FeatureConfig>> {\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: 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(): QualityLevelInfo | null {\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(): QualityLevelInfo | null {\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 {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<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number,\n ): 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 {EventDebugging} from '../utils/EventDebugging';\nimport {logger, padRight} from '../utils/Logger';\nimport {noOp} from '../utils/Utils';\n\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\nimport {\n createHeartbeatPayload,\n customStateMachineErrorCallback,\n on,\n logMissingCallbackWarning,\n} from './stateMachineUtils';\n\nenum State {\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n /** This event is called when an ad is played directly after the player startup phase */\n AD_STARTUP = 'AD_STARTUP',\n AD_READY = 'AD_READY',\n AD_PAUSE = 'AD_PAUSE',\n AD_PLAYING = 'AD_PLAYING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n INITIAL_SOURCE_CHANGE = 'INITIAL_SOURCE_CHANGE',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class Bitmovin8AnalyticsStateMachine extends AnalyticsStateMachine {\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 constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekStarted = false;\n this.seekEnded = false;\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 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 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 onHeartbeat(timestamp: number, duration: number, state: string, eventData: AnalyticsEventBase) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventData);\n\n const payload = createHeartbeatPayload(duration, state as Lowercase<string>);\n this.stateMachineCallbacks.heartbeat(duration, state, payload);\n\n this.onEnterStateTimestamp = timestamp;\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventData);\n }\n\n callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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 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","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 on,\n logMissingCallbackWarning,\n} from './stateMachineUtils';\n\nenum State {\n INITIALIZED = 'INITIALIZED',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n AD = 'AD',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\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 createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.INITIALIZED,\n error: customStateMachineErrorCallback,\n events: [\n {name: Event.SETUP, from: State.INITIALIZED, to: State.SETUP},\n on(Event.SETUP).stayIn(State.SETUP),\n on(Event.TIMECHANGED).stayIn(State.SETUP),\n {name: Event.READY, from: [State.SETUP, State.ERROR, State.END, State.SOURCE_CHANGING], to: State.READY},\n on(Event.READY).stayIn(State.READY),\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\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\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.SOURCE_LOADED, from: this.getAllStates(), to: State.SETUP},\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStates(), to: State.SOURCE_CHANGING},\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\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 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 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 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<string>);\n this.stateMachineCallbacks.heartbeat(duration, state, payload);\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventData);\n }\n\n callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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","import * as StateMachine from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\n\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\nimport {customStateMachineErrorCallback, on, logMissingCallbackWarning} from './stateMachineUtils';\n\nenum State {\n AD = 'AD',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n END = 'END',\n ERROR = 'ERROR',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n AUDIOTRACK_CHANGED_PLAYING = 'AUDIOTRACK_CHANGED_PLAYING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n SUBTITLE_CHANGED_PLAYING = 'SUBTITLE_CHANGED_PLAYING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\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 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 callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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","import {StateMachine} from 'javascript-state-machine';\n\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\nimport {HeartbeatListener, HeartbeatService} from './HeartbeatService';\n\nenum State {\n SETUP = 'SETUP',\n READY = 'READY',\n STARTUP = 'STARTUP',\n PLAYING = 'PLAYING',\n PAUSE = 'PAUSE',\n REBUFFERING = 'REBUFFERING',\n\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n ERROR = 'ERROR',\n UNLOADED = 'UNLOADED',\n QUALITY_CHANGE = 'QUALITY_CHANGE',\n SEEKING = 'SEEKING',\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<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\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 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<State, StateHandler>;\n","import {PlayerContext} from '../../adapters/amazonIVS/player/AmazonIVSPlayerContext';\nimport {AnalyticsEventBase} from '../../types/EventData';\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\n constructor(\n private heartbeatIntervalMs: number,\n private playerContext: PlayerContext,\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.playerContext.position,\n };\n this.listener?.onHeartbeat(eventData);\n }, this.heartbeatIntervalMs);\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 type {StateMachineEventDef, StateMachineErrorCallback} from 'javascript-state-machine';\n\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\n/**\n *\n * @param duration duration of the heartbeat\n * @param state state of heartbeat\n * @returns payload containing the\n */\nexport const createHeartbeatPayload = (duration: number, state: Lowercase<string>): 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 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 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 {VERSION} from '../Version';\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';\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 {VERSION} from '../Version';\nimport {InternalAdapterAPI} from '../adapters/internal/InternalAdapterAPI';\nimport {ErrorCode} from '../enums/ErrorCode';\nimport {PlayerSize} from '../enums/PlayerSize';\nimport {FeatureManager} from '../features/FeatureManager';\nimport {ErrorDetailTrackingSettingsProvider} from '../features/errordetails/ErrorDetailTracking';\nimport {OnErrorDetailEventObject} from '../features/errordetails/OnErrorDetailEventObject';\nimport {AnalyticsConfig, CollectorConfig} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {CustomDataValues, customDataValuesKeys} from '../types/CustomDataValues';\nimport * as EventData from '../types/EventData';\nimport {FeatureConfigContainer} from '../types/FeatureConfigContainer';\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 * as Utils from '../utils/Utils';\nimport {isValidString, isBlank} from '../utils/stringUtils';\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';\n\nexport class Analytics {\n get version(): string {\n return VERSION;\n }\n static version: string = VERSION;\n\n private readonly sessionHandler: SessionPersistenceHandler;\n private readonly adapter: InternalAdapterAPI;\n private readonly backendFactory: BackendFactory;\n private readonly featureManager = new FeatureManager<FeatureConfigContainer>();\n private readonly onErrorDetailEventDispatcher = new EventDispatcher<OnErrorDetailEventObject>();\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 constructor(\n config: AnalyticsConfig,\n adapter: InternalAdapterAPI,\n backendFactory: BackendFactory = new BackendFactory(),\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<OnErrorDetailEventObject> {\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 }\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.setDuration(duration);\n this.videoStartupTime = this.sample.videoStartupTime = duration;\n this.sample.supportedVideoCodecs = CodecHelper.supportedVideoFormats;\n this.setState(state);\n\n if (this.startupTime > 0) {\n this.startupTime += duration;\n }\n this.sample.startupTime = this.startupTime;\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 = (duration: number, state: string, sampleData: HeartbeatPayload) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample = {\n ...this.sample,\n ...sampleData,\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<EventData.VideoStartFailedEvent>,\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<EventData.ErrorEvent>) => {\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\n const segmentNames = this.adapter.segments.map((s) => s.name);\n this.sample.errorSegments = segmentNames;\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 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 = 1;\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 // TODO: Better description\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\n this.guardAgainstMissingVideoTitle(this.config, config);\n this.guardAgainstMissingIsLive(this.config, config);\n\n const mergedAnalyticsConfig = mergeAnalyticsConfigs(this.config, config);\n this.adapter.sourceChange(mergedAnalyticsConfig);\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 this.sample.isLive = this.getIsLiveFromConfigOrPlaybackInfo(this.config, info.isLive);\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.isNumber(info.videoPlaybackHeight)) {\n this.sample.videoPlaybackHeight = info.videoPlaybackHeight;\n }\n if (Utils.isNumber(info.videoPlaybackWidth)) {\n this.sample.videoPlaybackWidth = info.videoPlaybackWidth;\n }\n if (Utils.isNumber(info.videoBitrate)) {\n this.sample.videoBitrate = info.videoBitrate;\n }\n if (Utils.isNumber(info.audioBitrate)) {\n this.sample.audioBitrate = info.audioBitrate;\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: 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 const copySample = {...this.sample};\n this.backend.sendRequest(copySample);\n }\n\n sendAnalyticsRequestAndClearValues() {\n this.sendAnalyticsRequest();\n this.clearValues();\n }\n\n sendUnloadRequest() {\n this.backend.sendUnloadRequest(this.sample);\n }\n\n sendAnalyticsRequestSynchronous() {\n this.backend.sendRequestSynchronous(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 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 const filterValuesFromHash = (input: 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\n this.config = {\n ...this.config,\n ...filterValuesFromHash(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 this.setDuration(duration);\n this.setState(state);\n this.sendAnalyticsRequestAndClearValues();\n }\n }\n}\n\nexport function mergeCollectorConfig(\n oldConfig: CollectorConfig | undefined,\n newConfig: CollectorConfig | undefined,\n): CollectorConfig {\n let mergedCollectorConfig = oldConfig != null ? {...oldConfig} : {};\n\n if (newConfig != null) {\n // merging new config should enable the collector by default (unless explicitly disabled in the new config)\n mergedCollectorConfig = {...mergedCollectorConfig, enabled: true, ...newConfig};\n }\n return mergedCollectorConfig;\n}\n\nexport function mergeAnalyticsConfigs(\n oldConfig: AnalyticsConfig | undefined,\n newConfig: AnalyticsConfig | undefined,\n): AnalyticsConfig {\n const mergedCollectorConfig = mergeCollectorConfig(oldConfig?.config, newConfig?.config);\n return {\n ...(oldConfig != null ? oldConfig : {}),\n ...(newConfig != null ? newConfig : {}),\n ...{config: mergedCollectorConfig},\n };\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\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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<TArgs> {\n subscribe(callback: EventHandler<TArgs>): () => void;\n unsubscribe(callback: EventHandler<TArgs>);\n}\n\ntype EventHandler<TArgs> = (args: TArgs) => void;\n\nexport class EventDispatcher<TArgs> implements Subscribable<TArgs> {\n private callbacks: Array<EventHandler<TArgs>> = [];\n\n subscribe(callback: EventHandler<TArgs>): () => 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<TArgs>) {\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 {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\nexport class LicenseCheckingBackend implements Backend {\n promise?: Promise<LicensingResponse>;\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<LicensingResponse> {\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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<LicensingResponse>,\n authenticationCallback: AuthenticationCallback,\n ): Promise<LicensingResponse> {\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\nexport class LongPlaytimeFilteringBackend implements Backend {\n private backend: Backend;\n\n constructor(next: Backend) {\n this.backend = next;\n }\n\n sendRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequest(sample);\n }\n\n sendUnloadRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequestSynchronous(sample);\n }\n\n sendAdRequest(sample: any) {\n this.backend.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\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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\nexport class QueueBackend implements Backend {\n queue: Sample[] = [];\n unloadQueue: Sample[] = [];\n syncQueue: Sample[] = [];\n adQueue: Array<AdSample & AdBreakSample & AdAnalyticsSample> = [];\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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\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: AdSample & AdBreakSample & AdAnalyticsSample) {\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';\n\nimport {Backend} from './Backend';\n\nexport class SequenceNumberBackend implements Backend {\n private underlying: Backend;\n private sequenceNumber = 0;\n\n constructor(underlying: Backend) {\n this.underlying = underlying;\n }\n\n sendRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequest(sample);\n }\n\n sendUnloadRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendUnloadRequest(sample);\n }\n\n sendRequestSynchronous(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequestSynchronous(sample);\n }\n\n sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.underlying.sendAdRequest(sample);\n }\n\n private updateSampleBeforeSending(sample: Sample) {\n sample.sequenceNumber = this.sequenceNumber++;\n }\n}\n","import type {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport * as Utils from '../utils/Utils';\nimport {isNumber} from '../utils/Utils';\nimport {deleteCookie, getCookie, setCookie} from '../utils/documentCookieUtils';\nimport {isBlank, isValidString} from '../utils/stringUtils';\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: number | null = 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","export enum CdnProvider {\n CLOUDFLARE = 'cloudflare',\n AKAMAI = 'akamai',\n FASTLY = 'fastly',\n MAXCDN = 'maxcdn',\n CLOUDFRONT = 'cloudfront',\n CHINACACHE = 'chinacache',\n BITGRAVITY = 'bitgravity',\n}\n","export enum CastTech {\n AirPlay = 'AirPlay',\n WebSocket = 'WebSocket',\n GoogleCast = 'GoogleCast',\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 SETUP = 'setup',\n READY = 'ready',\n SOURCE_LOADED = 'sourceLoaded',\n PLAY = 'play',\n PLAYING = 'playing',\n PAUSE = 'pause',\n TIMECHANGED = 'timechanged',\n SEEK = 'seek',\n SEEKED = 'seeked',\n START_CAST = 'startCasting',\n END_CAST = 'endCasting',\n START_BUFFERING = 'startBuffering',\n END_BUFFERING = 'endBuffering',\n AUDIOTRACK_CHANGED = 'audioTrackChanged',\n AUDIO_CHANGE = 'audioChange',\n VIDEO_CHANGE = 'videoChange',\n START_FULLSCREEN = 'startFullscreen',\n END_FULLSCREEN = 'endFullscreen',\n START_AD = 'adStart',\n SUBTITLE_CHANGE = 'subtitleChange',\n END_AD = 'adEnd',\n MUTE = 'mute',\n UN_MUTE = 'unMute',\n ERROR = 'playerError',\n SCREEN_RESIZE = 'resize',\n UNLOAD = 'unload',\n END = 'end',\n SOURCE_UNLOADED = 'sourceUnloaded',\n MANUAL_SOURCE_CHANGE = 'manualSourceChangeInitiated',\n VIDEOSTART_TIMEOUT = 'VIDEOSTART_TIMEOUT',\n CUSTOM_DATA_CHANGE = 'customDataChange',\n PLAYLIST_TRANSITION = 'playlistTransition',\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","export enum PAGE_LOAD_TYPE {\n FOREGROUND = 1,\n BACKGROUND = 2,\n}\n","export enum Player {\n BITMOVIN = 'bitmovin',\n JW = 'jw',\n RADIANT = 'radiant',\n VIDEOJS = 'videojs',\n HLSJS = 'hlsjs',\n SHAKA = 'shaka',\n DASHJS = 'dashjs',\n HTML5 = 'html5',\n CHROMECAST_SHAKA = 'chromecast-shaka',\n AMAZON_IVS = 'amazonivs',\n}\n","export enum PlayerSize {\n Window = 'WINDOW',\n Fullscreen = 'FULLSCREEN',\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 prog = 'progressive',\n hls = 'hls',\n dash = 'dash',\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<TConfigContainer, TConfig extends FeatureConfig> {\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<TConfigContainer> {\n private features: Array<Feature<TConfigContainer, FeatureConfig>> = [];\n\n registerFeatures(features: Array<Feature<TConfigContainer, FeatureConfig>>) {\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<ErrorDetail> {\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 {VERSION} from '../../Version';\nimport {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 {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<FeatureConfigContainer, ErrorDetailTrackingConfig> {\n private errorIndex = 0;\n\n constructor(\n private settingsProvider: ErrorDetailTrackingSettingsProvider,\n private backend: ErrorDetailBackend,\n private subscribables: Array<Subscribable<OnErrorDetailEventObject>>,\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<HttpRequest>();\n\n get maxRequests(): number {\n return this._maxRequests;\n }\n\n get httpRequests(): ReadonlyArray<HttpRequest> {\n return this._httpRequestQueue.items;\n }\n\n constructor(private subscribables: Array<Subscribable<OnDownloadFinishedEventObject>>) {\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","export enum HttpRequestType {\n DRM_LICENSE_WIDEVINE = 'DRM_LICENSE_WIDEVINE',\n DRM_OTHER = 'DRM_OTHER',\n MEDIA_THUMBNAILS = 'MEDIA_THUMBNAILS',\n MEDIA_VIDEO = 'MEDIA_VIDEO',\n MEDIA_AUDIO = 'MEDIA_AUDIO',\n MEDIA_PROGRESSIVE = 'MEDIA_PROGRESSIVE',\n MEDIA_SUBTITLES = 'MEDIA_SUBTITLES',\n MANIFEST_DASH = 'MANIFEST_DASH',\n MANIFEST_HLS = 'MANIFEST_HLS',\n MANIFEST_HLS_MASTER = 'MANIFEST_HLS_MASTER',\n MANIFEST_HLS_VARIANT = 'DRM_LICENSMANIFEST_HLS_VARIANTE_WIDEVINE',\n MANIFEST_SMOOTH = 'MANIFEST_SMOOTH',\n MANIFEST = 'MANIFEST',\n KEY_HLS_AES = 'KEY_HLS_AES',\n UNKNOWN = 'UNKNOWN',\n TIME_SYNC = 'TIME_SYNC',\n DRM_CERTIFICATE_FAIRPLAY = 'DRM_CERTIFICATE_FAIRPLAY',\n DRM_LICENSE_CLEARKEY = 'DRM_LICENSE_CLEARKEY',\n DRM_LICENSE_PRIMETIME = 'DRM_LICENSE_PRIMETIME',\n DRM_LICENSE_FAIRPLAY = 'DRM_LICENSE_FAIRPLAY',\n DRM_LICENSE_PLAYREADY = 'DRM_LICENSE_PLAYREADY',\n MANIFEST_ADS = 'MANIFEST_ADS',\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 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<keyof CustomDataValues> = [\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","import {FeatureConfigContainer} from './FeatureConfigContainer';\n\nexport interface LicensingRequest {\n key?: string;\n domain: string;\n version: string;\n}\n\nexport enum LicensingResult {\n Granted = 'granted',\n Denied = 'denied',\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<LicensingResponse>;\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: number | null | 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<Sample, 'played'> | Pick<Sample, 'buffered'> | Pick<Sample, 'paused'>;\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<ErrorEvent>) => 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<VideoStartFailedEvent>, 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<AnalyticsEventBase>) => 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 {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\n\nimport {post} from './Http';\nimport {joinUrls, noOp} from './Utils';\n\nexport class AnalyticsCall {\n private analyticsServerUrl: string;\n private 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 post(this.analyticsServerUrl, sample, callback);\n }\n\n sendUnloadRequest(sample: Sample) {\n this.trySendBeacon((data: Sample) => this.sendRequestSynchronous(data, noOp), this.getAnalyticsServerUrl(), sample);\n }\n\n trySendBeacon(fallbackFunction: (data: any) => void, url: string, data: any) {\n if (typeof navigator.sendBeacon === 'undefined') {\n fallbackFunction(data);\n } else {\n const success = navigator.sendBeacon(url, JSON.stringify(data));\n if (!success) {\n fallbackFunction(data);\n }\n }\n }\n\n sendRequestSynchronous(sample: Sample, callback: () => void) {\n post(this.analyticsServerUrl, sample, callback, false);\n }\n\n sendAdRequest(sample: AdSample) {\n this.trySendBeacon(\n (data: AdSample) => post(this.getAdAnalyticsServerUrl(), data, noOp),\n this.getAdAnalyticsServerUrl(),\n sample,\n );\n }\n\n getAnalyticsServerUrl() {\n return this.analyticsServerUrl;\n }\n\n getAdAnalyticsServerUrl() {\n return this.adAnalyticsServerUrl;\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 legacyMode = false;\n\n if ((window as any).XDomainRequest) {\n legacyMode = true;\n }\n\n if (legacyMode) {\n xhttp = new (window as any).XDomainRequest();\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 (legacyMode) {\n xhttp.onload = responseCallback;\n } else {\n xhttp.onreadystatechange = responseCallback;\n }\n\n try {\n xhttp.open('POST', url, async);\n if (!legacyMode) {\n xhttp.setRequestHeader('Content-Type', 'text/plain');\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<LicensingResponse> {\n const licenseServerUrl = joinUrls(baseUrl, '/licensing');\n const licensingRequest = {\n analyticsVersion: version,\n domain,\n key,\n };\n\n return new Promise<LicensingResponse>((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<AnalyticsConfig['debug']>;\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<T> {\n private readonly _items: T[] = [];\n\n get items(): ReadonlyArray<T> {\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","import {PAGE_LOAD_TYPE} from '../enums/PageLoadType';\nimport * as CustomDataUtils from '../types/CustomDataValues';\nimport type {CustomDataValues} 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 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 getBrowserInfo = () => {\n const ua = navigator.userAgent;\n let tem,\n M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return {name: 'IE', version: tem[1] || ''};\n }\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) return {name: tem[1].replace('OPR', 'Opera'), version: tem[2]};\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) M.splice(1, 1, tem[1]);\n return {name: M[0], version: M[1]};\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; maxAge?: number; expires?: string},\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","export const isValidString = (s: unknown): s is string => s != null && typeof s === 'string';\n\nexport const isEmpty = (s: string | null | undefined): boolean => s == null || s.length === 0;\n\nexport const isBlank = (s: string | null | 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 {VERSION} from './Version';\nimport {AmazonIVSAdapter} from './adapters/amazonIVS/AmazonIVSAdapter';\nimport {Bitmovin8Adapter} from './adapters/bitmovin8/Bitmovin8Adapter';\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';\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 {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","getCurrentImpressionId","guardAgainstNotInitializedAnalytics","analytics","getUserId","setCustomData","values","internalAdapter","setCustomDataOnce","sourceChange","config","hasPlayerAlreadyBeenAugmented","player","__bitmovinAnalyticsHasBeenSetup","markPlayerInstanceAsAugmented","logger","log","Adapter","opts","errorMessageToUser","sourceUrlProvider","SourceUrlProvider","AmazonIVSInternalAdapter","Analytics","wrapPlayerLoad","originalLoad","load","m3u8Url","AmazonIVSAdapter","supportsDeferredLicenseLoading","getPlayerVersion","getVersion","getPlayerName","Player","AMAZON_IVS","getPlayerTech","getAutoPlay","isAutoplay","getDrmPerformanceInfo","playerContext","AmazonIVSPlayerContext","heartbeatService","HeartbeatService","stateMachine","AmazonIVSStateMachine","stateMachineCallbacks","setListener","listener","AmazonIVSPlayerEventListener","qualityChangeService","playerStatisticsProvider","getHTMLVideoElement","windowEventListener","WindowEventListener","windowEventTracker","initialize","startMonitoring","RELEASE","subscribe","release","getPosition","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","onDurationChanged","finishedStartup","onQualityChanged","JSON","stringify","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","version","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","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","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","eventData","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","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","eventDispatcher","EventDispatcher","playerExports","onDownloadFinished","callback","unsubscribe","httpRequest","calculateTimeWithUndefined","httpStatus","success","timestamp","getCurrentTimestamp","url","timeToFirstByte","mapHttpRequestType","HttpRequestType","MANIFEST_DASH","MANIFEST_HLS_MASTER","MANIFEST_HLS_VARIANT","MANIFEST_SMOOTH","MANIFEST_ADS","MEDIA_AUDIO","MEDIA_VIDEO","MEDIA_SUBTITLES","MEDIA_THUMBNAILS","DRM_LICENSE_WIDEVINE","DRM_LICENSE_PLAYREADY","DRM_LICENSE_FAIRPLAY","DRM_LICENSE_PRIMETIME","DRM_LICENSE_CLEARKEY","DRM_CERTIFICATE_FAIRPLAY","KEY_HLS_AES","TIME_SYNC","UNKNOWN","handleSegmentPlaybackEvent","removeSegment","handleOnDownloadFinishEvent","SegmentPlayback","segment","getURLResourceName","addSegment","meter","addMeasurement","duration","Date","CAFv3InternalAdapter","CAFv3Adapter","context","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","reason","isBuffering","PLAYLIST_TRANSITION","streamType","getLiveSeekableRange","DashjsInternalAdapter","DashjsAdapter","mediaPlayer","DASHJS","videoEl","getVideoElement","setMediaElement","registerMediaElementEventsForDashJS","mediaElement","listenToMediaElementEvent","needsFirstPlayIntent","html5PlaybackInfo","playbackInfo","codecInfo","getMediaPlayerCodecInfo","applyAndStoreCodecInfo","getMIMEType","MIMETypes","DASH","getStreamURL","toString","getCurrentQualityLevelInfo","currentVideoQuality","getBitrateInfoListFor","getQualityFor","HTML5InternalAdapter","codecsRegExp","RegExp","rawVideoCodec","getCurrentTrackFor","isValidString","isBlank","matches","exec","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","resetMedia","HlsSpeedMeterAdapter","registerHlsEvents","HLS","onMediaAttaching","onMediaDetaching","onManifestLoading","onAudioTrackSwitched","onSubtitleLanguageSwitched","onHlsError","registerMediaElement","onMaybeReady","unregisterMediaElement","selectedSubtitle","getSelectedSubtitleLanguage","getSelectedAudioLanguage","getHlsCodecInfo","errorName","fatal","errorMessage","getErrorCodeFromHlsErrorType","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","previousMutedValue","HTML5","initializeStateMachine","mediaElEventHandlers","bufferingTimeout","lastIsLiveStatus","isPaused","previousMediaTimeInSeconds","previousClientTime","needsReadyEvent","mediaElementSet","registerWindowEvents","getStreamSources","muted","qualityInfo","streamUrl","getMIMETypeFromFileExtension","mimetype","getStreamTypeFromMIMEType","src","clearTimeout","wrapMediaElementLoad","readyState","checkQualityLevelAttributes","volume","isAudioMuted","checkSeeking","checkPlayheadProgress","onBuffering","boundHandler","item","removeEventListener","onPageClose","paused","ended","BUFFERING_TIMECHANGED_TIMEOUT","silent","qualityLevelInfo","textTracks","attr","mode","callEvent","currentMediaTimeInSeconds","playbackPositionDeltaInSeconds","now","clientTimeProgressInSeconds","playbackRate","msgTime","toISOString","substring","prefix","logMsg","sourceMetadata","HTMLVideoElementInternalAdapter","setAudioLanguage","sessionData","setSubtitleEnabled","setSubtitleLanguage","HTMLVideoElementAdapter","browserInfo","getBrowserInfo","currentSrc","previousTotalDroppedFrames","getVideoPlaybackQuality","droppedVideoFrames","currentDroppedFrames","defaultStateMachineCallbacks","_windowEventTracker","WindowEventTracker","eventType","starttime","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","scale","devicePixelRatio","screenHeight","screen","screenWidth","previousState","currentState","customdatachange","CUSTOM_DATA_CHANGE","playerIsMuted","currentVolume","ShakaInternalAdapter","Promise","resolve","reject","then","result","catch","category","severity","ShakaAdapter","getMediaElement","SHAKA","onUnloading","getAssetUri","activeVideoTrack","getVariantTracks","filter","track","active","videoId","videoBandwidth","bandwidth","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","onEnterStateTimestamp","videoStartupTimeoutMs","Settings","ANALYTICS_VIDEOSTART_TIMEOUT","rebufferTimeoutMs","ANALYTICS_REBUFFER_TIMEOUT","currentRebufferingIntervalIndex","createStateMachine","playbackCurrentTimeInSeconds","clearVideoStartTimeout","clearRebufferingTimeoutHandle","clearRebufferingHeartbeatHandle","startRebufferingHeartbeatInterval","resetRebufferingHelpers","startRebufferingTimeoutHandle","rebufferingHeartbeatIntervalHandle","setInterval","toLowerCase","getTime","stateDuration","heartbeat","buffered","min","clearInterval","rebufferingTimeoutHandle","BUFFERING_TIMEOUT_REACHED","getVideoStartupFailedEventData","getReasonForVideoStartFailure","VideoStartFailedReason","PLAYER_ERROR","PAGE_CLOSED","VIDEOSTART_TIMEOUT","TIMEOUT","setVideoStartTimeout","videoStartTimeout","AnalyticsStateMachine","debuggingStates","enabledDebugging","seekTimestamp","seekedTimestamp","seekStarted","seekEnded","getAllStatesBut","getAllStates","i","customStateMachineErrorCallback","SOURCE_CHANGING","INITIAL_SOURCE_CHANGE","stayIn","AD_STARTUP","EXIT_BEFORE_VIDEOSTART","QUALITYCHANGE","QUALITYCHANGE_PAUSE","PLAY_SEEKING","END_PLAY_SEEKING","CUSTOMDATACHANGE","SUBTITLE_CHANGING","AUDIOTRACK_CHANGING","AD_READY","AD_PAUSE","AD_PLAYING","MUTING_READY","MUTING_PLAY","MUTING_PAUSE","CASTING","QUALITYCHANGE_REBUFFERING","onbeforeevent","onafterevent","initialSourceChange","manualSourceChange","FINISH_QUALITYCHANGE_PAUSE","FINISH_QUALITYCHANGE","FINISH_QUALITYCHANGE_REBUFFERING","FINISH_MUTING","onenterstate","padRight","setVideoTimeStartFromEvent","startCasting","onleavestate","addStatesToLog","setVideoTimeEndFromEvent","lastTrackedVideoEndObject","fromStateName","String","shouldSendSample","videoStartFailed","seekDuration","end_play_seeking","unload","ad","noOp","setup","callbackFunction","logMissingCallbackWarning","videoChange","audioChange","mute","unMute","onseek","onseeked","ontimechanged","onHeartbeat","onplayerError","createHeartbeatPayload","EventDebugging","getStates","setEnabledDebugging","PAUSED_SEEKING","AD","_from","_to","_timestamp","playlistTransition","fnName","pause","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","paused_seeking","played","getStateHandler","startup","startHeartbeat","stopHeartbeat","rebuffering","failedEvent","isErrorEvent","shouldSendVideoStartupSample","QUALITY_CHANGE","qualitychange","SEEKING","heartbeatIntervalMs","heartbeatInterval","clearHeartbeat","eventName","errorCode","_ex","ignoreStates","ignoredState","adapter","adManifestLoadedEvents","isPlaying","adPodPosition","viewportTracker","ViewportTracker","onIntersectionChanged","clearCurrentTimeInterval","dispose","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","includes","id","adId","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","BackendFactory","featureManager","FeatureManager","onErrorDetailEventDispatcher","videoStartupTime","droppedSampleFrames","startupTime","authenticationCallback","authenticationCompleted","featureConfigs","configureFeatures","guardAgainstMissingVideoTitle","oldConfig","newConfig","guardAgainstMissingIsLive","mergedAnalyticsConfig","mergeAnalyticsConfigs","setState","changeCustomData","sendAnalyticsRequestAndClearValues","setConfigParameters","impressionId","sessionHandler","userId","input","retVal","customDataValuesKeys","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","drmPerformance","setCompletionValues","videoStartForClosedState","videoTimeStart","sendUnloadRequest","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","sampleData","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","setPlaybackVideoPropertiesFromEvent","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","sendRequest","videoStartFailedReason","segmentNames","segments","errorSegments","subtitle_changing","setPlaybackInfoFromAdapter","getIsLiveFromConfigOrPlaybackInfo","isBoolean","platform","path","pathname","navigator","userLanguage","userAgent","completedTotal","downloadSpeedInfo","copySample","sendAnalyticsRequestSynchronous","sendRequestSynchronous","isLiveFromPlayback","origin","addWatched","getCompletionPercentage","Number","isNaN","value","startResetInterval","increaseCounter","isQualityChangeEventEnabled","QUALITY_CHANGE_THRESHOLD_EXCEEDED","mergeCollectorConfig","mergedCollectorConfig","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","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","licenseCall","backendBaseUrl","licenseKeyReceived","licenseLazyLoadingTimeoutHandle","unsubscribeFromAdapter","promise","wrapLicenseCheckPromiseWithCallback","performLicenseCheck","licenseCallFailed","licenseLazyLoadingTimeout","QueueBackend","onLicenseCallFailed","ANALYTICS_LICENSECALL_TIMEOUT","LicensingResult","Denied","Granted","remoteBackend","RemoteBackend","flushTo","err","response","next","isPlayedAboveThreshold","download","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","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","CdnProvider","videoCodecs","audioCodecs","findIndex","startsWith","VIDEO_STARTUP_TIMEOUT_REACHED","MP4","WEBM","endsWith","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","element","shift","removeFromQueue","clear","settingsProvider","subscribables","httpRequestTracking","errorIndex","onErrorHandler","httpRequestsCopy","errorId","subscribable","numberOfHttpRequests","errorDetails","_maxRequests","DEFAULT_MAX_REQUESTS","_httpRequestQueue","Queue","onDownloadFinishedHandler","addRequest","items","limit","offer","PlayerModule","hooks","isConfigMissing","isAnalyticsDisabled","analyticsModuleInstance","analyticsBitmovin8Adapter","videoImpressionId","adManifestLoadedEvent","adFallbackIndex","manifestDownloadTime","downloadTiming","adReplaceContentDuration","replaceContentDuration","currentFallbackIndex","adBreakConfig","adPosition","adOffset","adPreloadOffset","preloadOffset","adIsPersistent","persistent","fallbackTags","adTagType","adTagUrl","adTagDetails","getHostnameAndPathFromUrl","adTagServer","adTagPath","adScheduleTime","scheduleTime","adIdPlayer","mediaUrl","mediaFileUrl","mediaUrlDetails","mediaPath","mediaServer","adPlaybackHeight","adPlaybackWidth","adSystem","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","customDataFieldCount","match","playerVideoDuration","casting","muting_ready","info1","info2","baseUrl","analyticsServerUrl","adAnalyticsServerUrl","trySendBeacon","getAnalyticsServerUrl","fallbackFunction","sendBeacon","getAdAnalyticsServerUrl","playbackVideoData","progressiveArrayIndex","videoFormatCodecMap","avc","vp9","av1","hevc","getOwnPropertyNames","format","some","isCodecSupported","MediaSource","isTypeSupported","bytes","bits","round","bytesToKiloBytes","kiloBytesToMegaBytes","kiloByte","body","async","xhttp","legacyMode","XDomainRequest","XMLHttpRequest","responseCallback","DONE","responseText","sampleResponse","parse","onload","onreadystatechange","open","setRequestHeader","licenseServerUrl","getInstance","Logger","instance","analyticsDebugConfig","console","optionalParams","tabularData","properties","str","_items","poll","maxElements","MESSAGE_NAMESPACE","bool","num","c","r","random","getCustomDataString","customData","fromConfig","toConfig","CustomDataUtils","customDataField","getDocumentPropWithPrefix","prop","document","pascalCase","charAt","toUpperCase","fullscreenProp","nodeName","getHiddenProp","hiddenProp","BACKGROUND","FOREGROUND","domElement","createElement","href","numerator","denominator","tem","ua","M","test","appName","appVersion","pop","prev","inViewport","options","rootMargin","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","_observer","intersectionRatio","trackedObjects","obj","newCookie","cookie","cname","isEmpty","trim","suffix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","adapters"],"sourceRoot":""}
|