bitmovin-analytics 2.31.2 → 2.32.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/AmazonIVSAdapter.ts","webpack://bitmovin.analytics/./src/adapters/Bitmovin8Adapter.ts","webpack://bitmovin.analytics/./src/adapters/CAFv3Adapter.ts","webpack://bitmovin.analytics/./src/adapters/DashjsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/HTMLVideoElementAdapter.ts","webpack://bitmovin.analytics/./src/adapters/HlsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/ShakaAdapter.ts","webpack://bitmovin.analytics/./src/adapters/VideoJsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8HttpRequestTrackingAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8SegmentTrackerAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8SpeedMeterAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/CAFv3InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/DashjsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HTML5InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HTMLVideoElementInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HlsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HlsSpeedMeterAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/ShakaInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/VideojsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/ads/AdModuleAPI.ts","webpack://bitmovin.analytics/./src/adapters/internal/ads/Bitmovin8AdModule.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/AmazonIVSInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/ErrorService.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/PauseEventDispatcher.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/PlaybackService.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/VideoStartupService.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/AmazonIVSPlayerContext.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/AmazonIVSPlayerEventHandler.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/AmazonIVSPlayerEventListener.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/SourceUrlProvider.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/utils/CollectorEventBus.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/window/WindowEventListener.ts","webpack://bitmovin.analytics/./src/adapters/internal/html5/player/HTMLVideoElementStatisticsProvider.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/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/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/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 private 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';\n\nimport {Adapter} from './Adapter';\nimport {AmazonIVSInternalAdapter} from './internal/amazonIVS/AmazonIVSInternalAdapter';\nimport {SourceUrlProvider} from './internal/amazonIVS/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 {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';\n\nimport {Adapter} from './Adapter';\nimport {Bitmovin8InternalAdapter} from './internal/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 = new Bitmovin8InternalAdapter(player, opts);\n this.analytics = new Analytics(analyticsConfig, this.internalAdapter);\n (player as any).analytics = this.analytics;\n this.wrapPlayerLoad(player, this.analytics);\n }\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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {CAFv3InternalAdapter} from './internal/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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {DashjsInternalAdapter} from './internal/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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {HTMLVideoElementInternalAdapter} from './internal/HTMLVideoElementInternalAdapter';\n\nexport class HTMLVideoElementAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: HTMLVideoElement, 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 HTMLVideoElementInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\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';\n\nimport {Adapter} from './Adapter';\nimport {HlsInternalAdapter} from './internal/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 {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';\n\nimport {Adapter} from './Adapter';\nimport {ShakaInternalAdapter} from './internal/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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {VideojsInternalAdapter} from './internal/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 as videojs.default.Player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {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 Bitmovin8HttpRequestTrackingAdapter 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 {PlayerAPI, PlayerEventBase, SeekEvent, UserInteractionEvent} 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 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';\n\nimport {Bitmovin8HttpRequestTrackingAdapter} from './Bitmovin8HttpRequestTrackingAdapter';\nimport {Bitmovin8SegmentTrackerAdapter} from './Bitmovin8SegmentTrackerAdapter';\nimport {Bitmovin8SpeedMeterAdapter} from './Bitmovin8SpeedMeterAdapter';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\nimport {AdModuleAPI} from './ads/AdModuleAPI';\nimport {Bitmovin8AdModule} from './ads/Bitmovin8AdModule';\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 readonly videoCompletionTracker: VideoCompletionTracker;\n\n private onBeforeUnLoadEvent = false;\n private speedMeter: DownloadSpeedMeter;\n private segmentTracker: SegmentTracker;\n private _adModule?: AdModuleAPI;\n private lastTrackedCurrentTime: number | undefined;\n private videoDuration: number | undefined;\n private httpRequestTrackingAdapter: Bitmovin8HttpRequestTrackingAdapter;\n\n constructor(private player: PlayerAPI, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new Bitmovin8AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.speedMeter = new Bitmovin8SpeedMeterAdapter(player, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n this.segmentTracker = new Bitmovin8SegmentTrackerAdapter(player, new SegmentTracker()).getSegmentTracker();\n this.httpRequestTrackingAdapter = new Bitmovin8HttpRequestTrackingAdapter(player);\n this.videoCompletionTracker = new VideoCompletionTracker();\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 return info;\n }\n\n sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, 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.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, (e: 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, () => {\n const quality = this.player.getPlaybackAudioData();\n\n if (this.qualityChangeService.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.qualityChangeService.setAudioBitrate(quality.bitrate);\n this.eventCallback(Event.AUDIO_CHANGE, {\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.VideoPlaybackQualityChanged, () => {\n const quality = this.player.getPlaybackVideoData();\n\n if (this.qualityChangeService.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.qualityChangeService.setVideoBitrate(quality.bitrate);\n this.eventCallback(Event.VIDEO_CHANGE, {\n width: quality.width,\n height: quality.height,\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\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.PLAYBACK_FINISHED, {\n currentTime: this.currentTime,\n });\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","import {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 Bitmovin8SegmentTrackerAdapter {\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 {PlayerAPI} from 'bitmovin-player';\n\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\n\nexport class Bitmovin8SpeedMeterAdapter {\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 {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';\n\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './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(protected context: any, opts?: AnalyticsStateMachineOptions) {\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, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, 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 {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';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class DashjsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(private mediaPlayer: any, opts?: AnalyticsStateMachineOptions) {\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 {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 * as Utils from '../../utils/Utils';\nimport {isVideoInFullscreen} from '../../utils/Utils';\n\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\nimport HTMLVideoElementStatisticsProvider from './html5/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 abstract getPlayerVersion: () => string;\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 private previousMediaTime: number;\n private previousClientTime: number;\n private needsReadyEvent: boolean;\n private mediaElementSet: boolean;\n private previousMutedValue = false;\n private playerStatisticsProvider: HTMLVideoElementStatisticsProvider;\n\n constructor(protected mediaElement: HTMLVideoElement | undefined, opts?: AnalyticsStateMachineOptions) {\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.previousMediaTime = 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 this.drmPerformanceInfo = undefined;\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 /**\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 this.eventCallback(Event.READY, {});\n });\n\n this.listenToMediaElementEvent('loadedmetadata', () => {\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\n this.listenToMediaElementEvent('play', () => {\n const {currentTime} = mediaElement;\n\n this.needsFirstPlayIntent = false;\n\n this.eventCallback(Event.PLAY, {\n currentTime,\n });\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, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.UN_MUTE, {\n currentTime,\n });\n }\n this.previousMutedValue = isMuted;\n }\n });\n\n this.listenToMediaElementEvent('seeking', () => {\n const {currentTime} = mediaElement;\n\n this.eventCallback(Event.SEEK, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('seeked', () => {\n const {currentTime} = mediaElement;\n\n clearTimeout(this.bufferingTimeout);\n\n this.eventCallback(Event.SEEKED, {\n currentTime,\n });\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, {\n currentTime,\n });\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.previousMediaTime = 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 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, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime,\n });\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, {\n currentTime,\n });\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, {\n currentTime,\n });\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.previousMediaTime;\n\n if (timeDelta < HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT) {\n this.onBuffering();\n }\n }, HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT);\n }\n\n checkQualityLevelAttributes(silent = false) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n const qualityLevelInfo = this.getCurrentQualityLevelInfo();\n if (!qualityLevelInfo) {\n return;\n }\n\n const {bitrate, width, height} = qualityLevelInfo;\n\n const isLive = this.isLive();\n\n // Detect a change of the isLive status and update the medaData 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 if (bitrate != null && 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 }\n }\n\n sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.mediaElement ? this.mediaElement.currentTime : undefined);\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({}, Utils.getCurrentTimestamp());\n originalLoad.apply(mediaElement, args);\n };\n }\n\n private checkSeeking() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const currentVideoTime = this.mediaElement.currentTime;\n\n const mediaTimeDif = Math.abs(currentVideoTime - this.previousMediaTime);\n const currentClientTime = Utils.getCurrentTimestamp();\n\n /** Difference between current client time and the previously known client time in seconds. */\n const clientTimeDif = (currentClientTime - this.previousClientTime) / 1000;\n\n /**\n * If the media time difference between the previous one and the current one is much higher than\n * the difference of the previous and current client time than there is a seek happening\n */\n // TODO: check if we need to increase the threshold for detecting a seek. The seek can be triggered when clicking `play` at an unfavorable point in time:\n // Set autoplay to false and click on play right after the player/video loaded.\n if (mediaTimeDif > clientTimeDif * 2) {\n this.isSeeking = true;\n this.onPaused(this.previousMediaTime + clientTimeDif);\n }\n\n this.previousClientTime = Utils.getCurrentTimestamp();\n }\n}\n","import {Player} from '../../enums/Player';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {getBrowserInfo} from '../../utils/Utils';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class HTMLVideoElementInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(mediaElement: HTMLVideoElement, opts?: AnalyticsStateMachineOptions) {\n super(mediaElement, opts);\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","import type {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 {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {HlsSpeedMeterAdapter} from './HlsSpeedMeterAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\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(private hls: any, opts?: AnalyticsStateMachineOptions) {\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 if (!this.hls.levels) {\n return null;\n }\n const currentLevelObj = this.hls.levels[this.hls.currentLevel];\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,\n width,\n height,\n };\n }\n\n override isLive = () => {\n const hls = this.hls;\n if (!hls.levels || !hls.currentLevel) {\n return false;\n }\n if (hls.currentLevel < 0) {\n return false;\n }\n const currentLevelObj = hls.levels[hls.currentLevel];\n if (!currentLevelObj || !currentLevelObj.details) {\n return false;\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 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 /**\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/master/src/errors.ts\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\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(data: {frag: any; stats: any; networkDetails: any}) {\n if (data.frag.type !== 'main') {\n return;\n }\n // See hls documentation https://github.com/video-dev/hls.js/blob/master/src/types/loader.ts#L35\n this.meter.addMeasurement({\n duration: (data.stats.tload - data.stats.trequest) / 1000,\n size: data.stats.total,\n timeToFirstByte: (data.stats.tfirst - data.stats.trequest) / 1000,\n timestamp: new Date(),\n httpStatus: data.networkDetails.status,\n });\n }\n}\n","import {AnalyticsStateMachine} from '../../analyticsStateMachines/AnalyticsStateMachine';\nimport {EventDispatcher} from '../../core/EventDispatcher';\nimport QualityChangeService from '../../core/QualityChangeService';\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 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 return {\n screenHeight: screen.height,\n screenWidth: screen.width,\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.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","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';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class ShakaInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(private player: any, opts?: AnalyticsStateMachineOptions) {\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,\n width,\n height,\n };\n }\n\n private onUnloading = () => {\n this.eventCallback(Event.SOURCE_UNLOADED, {});\n this.release();\n };\n}\n","import {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 {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';\n\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class VideojsInternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n readonly videoCompletionTracker: VideoCompletionTracker;\n private _subtitleInfo: SubtitleInfo = {enabled: false};\n private selectedAudioLanguage?: string;\n private onBeforeUnLoadEvent = false;\n private previousTime = 0;\n\n constructor(private player: videojs.default.Player, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new VideojsAnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.videoCompletionTracker = new VideoCompletionTracker();\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 = () => ((window as any).videojs ? (window as any).videojs.VERSION : 'unknown');\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.videoPlaybackWidth = qualityInfo.height || info.videoPlaybackHeight;\n info.videoBitrate = qualityInfo.bitrate;\n }\n\n return info;\n }\n\n getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n // TODO: Needs to be implemented\n return null;\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 // 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 not be present. In that case Videojs is just\n // a wrapper around the respective playback tech (HTML or Flash).\n const tech = this.tech({IWillNotUseThisInPlugins: true});\n\n // older videojs versions don't have vhs property\n if (tech.vhs || tech.hls) {\n const mediaAttributes = that.getMediaAttributes(tech);\n\n if (!mediaAttributes || !mediaAttributes.bitrate) {\n return;\n }\n\n // update actual bitrate\n if (that.qualityChangeService.shouldAllowVideoQualityChange(mediaAttributes.bitrate)) {\n const eventObject: VideoChangeEvent = {\n width: mediaAttributes.width,\n height: mediaAttributes.height,\n bitrate: mediaAttributes.bitrate,\n currentTime: this.currentTime(),\n };\n\n that.eventCallback(Event.VIDEO_CHANGE, eventObject);\n that.qualityChangeService.setVideoBitrate(mediaAttributes.bitrate);\n }\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, timestamp: number) {\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.player.duration());\n this.previousTime = 0;\n this.stateMachine.sourceChange(config, timestamp, this.player.currentTime());\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 // 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 CodecInfo {\n audioCodec: string | undefined;\n videoCodec: string | undefined;\n}\n\nexport interface MediaAttributes {\n codecs: string | undefined;\n bitrate: number | undefined;\n width: number | undefined;\n height: number | undefined;\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 {PlayerAPI, UserInteractionEvent} from 'bitmovin-player';\n\nimport {WindowEventTracker} from '../../../utils/WindowEventTracker';\n\nimport {AdCallbacks, AdModuleAPI} from './AdModuleAPI';\n\nexport class Bitmovin8AdModule implements AdModuleAPI {\n adCallbacks = new AdCallbacks();\n\n constructor(private player: PlayerAPI, private windowEventTracker: WindowEventTracker) {\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 {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 {InternalAdapter} from '../InternalAdapter';\nimport {InternalAdapterAPI} from '../InternalAdapterAPI';\nimport {AdModuleAPI} from '../ads/AdModuleAPI';\nimport HTMLVideoElementStatisticsProvider from '../html5/player/HTMLVideoElementStatisticsProvider';\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, timestamp: number) {\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 {PlayerError} from 'amazon-ivs-player';\n\nimport {Event} from '../../../../enums/Event';\nimport {ErrorEvent} from '../../../../types/EventData';\nimport {EventCallbackDispatcher} from '../../EventCallbackDispatcher';\nimport {PlayerContext} from '../player/AmazonIVSPlayerContext';\n\nexport class ErrorService {\n constructor(private dispatcher: EventCallbackDispatcher, private playerContext: PlayerContext) {}\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 '../../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(private dispatcher: EventCallbackDispatcher, private playerContext: PlayerContext) {}\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: 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 '../../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 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 this.pauseDispatcher.cancelPause();\n if (this.playerContext.isLive) return;\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.SEEK, {currentTime});\n }\n\n private seeked() {\n this.pauseDispatcher.cancelPause();\n if (this.playerContext.isLive) return;\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 {Event} from '../../../../enums/Event';\nimport {EventCallbackDispatcher} from '../../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(private dispatcher: EventCallbackDispatcher, private playerContext: PlayerContext) {}\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}\n","import type {MediaPlayer} from 'amazon-ivs-player';\n\nexport interface PlayerContext {\n position: number;\n isLive: boolean;\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","import type {PlayerError, Quality} from 'amazon-ivs-player';\n\nimport QualityChangeService from '../../../../core/QualityChangeService';\nimport {logger} from '../../../../utils/Logger';\nimport {EventCallbackDispatcher} from '../../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: ' + payload);\n if (this.videoStartupService.finishedStartup) {\n this.playbackService.onQualityChange(payload);\n }\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);\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 {MediaPlayer, PlayerEventType} from 'amazon-ivs-player';\n\nimport QualityChangeService from '../../../../core/QualityChangeService';\nimport {EventCallbackDispatcher} from '../../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 // 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 '../../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","export default class HTMLVideoElementStatisticsProvider {\n private previousTotalDroppedFrames = 0;\n\n constructor(private videoElement: HTMLVideoElement | undefined) {}\n getDroppedFrames(): number {\n if (this.videoElement == undefined) {\n return 0;\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 {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(protected stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n this.stateMachine = this.createStateMachine(opts);\n }\n\n abstract createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine;\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 abstract sourceChange(config: AnalyticsConfig, timestamp: number, currentTime?: number): void;\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 {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\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';\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 SOURCE_LOADED = 'SOURCE_LOADED',\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: any;\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 sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n\n createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n // {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\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 {name: Event.READY, from: State.READY, to: State.READY},\n {name: Event.VIDEO_CHANGE, from: State.READY, to: State.READY},\n {name: Event.AUDIO_CHANGE, from: State.READY, to: 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 {name: Event.PLAY, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAYING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.PLAYING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: 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 {name: Event.TIMECHANGED, from: State.REBUFFERING, to: 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 {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: 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 name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\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 // disable tranitions in PLAY_SEEKING\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n // disable transitions in END_PLAY_SEEKING\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.PLAY, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n // disable Seek events during PAUSE\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n // ignore seeked during Playing because of not allowed keyboard seeking\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n\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 {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: 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 {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: 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 {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: 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 {name: Event.PLAY, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.PAUSE, from: State.AD_STARTUP, to: 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 {name: Event.PLAY, from: State.AD_READY, to: State.AD_READY},\n {name: Event.PAUSE, from: State.AD_READY, to: 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 {name: Event.PLAY, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.PAUSE, from: State.AD_PAUSE, to: 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 {name: Event.PLAY, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.PAUSE, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.END, from: State.AD_PLAYING, to: State.END},\n\n // Ignore timechanged events during ads\n {name: Event.TIMECHANGED, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.TIMECHANGED, from: State.AD_READY, to: State.AD_READY},\n {name: Event.TIMECHANGED, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.TIMECHANGED, from: State.AD_PLAYING, to: State.AD_PLAYING},\n\n // Ignore End Ad events when no ad has started\n {name: Event.END_AD, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_AD, from: State.PAUSE, to: State.PAUSE},\n {name: Event.END_AD, from: State.READY, to: State.READY},\n {name: Event.END_AD, from: State.STARTUP, to: 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 {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAYING, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.UN_MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut([State.SETUP]),\n to: State.SOURCE_CHANGING,\n },\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: State.SETUP,\n to: State.INITIAL_SOURCE_CHANGE,\n },\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 {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n ],\n callbacks: {\n onbeforeevent: (event, from, to, timestamp, eventObject): any => {\n if (from === State.REBUFFERING && to === State.QUALITYCHANGE_REBUFFERING) {\n return false;\n }\n },\n onafterevent: (event, from, to, timestamp, 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 onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\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) => {\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 (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 occured in State Machine callback ' + fromStateName, eventObject, e);\n }\n } else {\n logger.error('Could not find callback function for ' + fromStateName);\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) => {\n if (this.stateMachine.current !== 'PLAYING') {\n return;\n }\n\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 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 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 {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\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';\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 private seekStartedAt: any;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekStartedAt = null;\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: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SETUP, from: State.INITIALIZED, to: State.SETUP},\n {name: Event.SETUP, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.READY, from: [State.SETUP, State.ERROR, State.END, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.READY, from: State.READY, to: 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 {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.TIMECHANGED, from: State.READY, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: 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 {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: 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 {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: 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 name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\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 {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: 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 {name: Event.PAUSE, from: State.END, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.SEEK, from: State.PLAYING, to: 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 {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: 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 {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: 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 {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: 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 {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n {name: Event.PAUSE, from: State.SOURCE_CHANGING, to: 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 {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\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 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.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\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 const seekDuration = timestamp - this.seekStartedAt;\n this.seekStartedAt = null;\n this.stateMachineCallbacks[fnName](seekDuration, 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 logger.error('Could not find callback function for ' + fnName);\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 onseek: (event, from, to, timestamp) => {\n this.seekStartedAt = this.seekStartedAt || 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 sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","import * as StateMachine from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\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';\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: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.SOURCE_LOADED, from: State.READY, to: 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 {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PAUSED_SEEKING, to: 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 {name: Event.TIMECHANGED, from: State.PAUSE, 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 {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: 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 name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\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 {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: 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 {name: 'PLAY_SEEK', from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: 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 {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: 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 {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: 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 {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 {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: 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 {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: 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 {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut(State.READY),\n to: State.SOURCE_CHANGING,\n },\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: State.READY,\n to: State.READY,\n },\n {name: Event.MANUAL_SOURCE_CHANGE, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: 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 {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\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 const excludedStates = [\n State.MUTING_PAUSE,\n State.MUTING_PLAY,\n State.AUDIOTRACK_CHANGED_PLAYING,\n State.SUBTITLE_CHANGED_PLAYING,\n ];\n if (excludedStates.find((e) => from === e) == null) {\n logger.error('Could not find callback function for ' + fnName);\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 sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","import {StateMachine, StateMachineEventDef} from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../../enums/Event';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\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';\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_VIDEOSTARTUP = 'EXIT_BEFORE_VIDEOSTARTUP',\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: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\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_VIDEOSTARTUP},\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTARTUP},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTARTUP},\n\n // ERROR\n {name: Event.ERROR, from: getAllStatesBut([State.STARTUP, State.EXIT_BEFORE_VIDEOSTARTUP]), to: State.ERROR},\n\n // EVENTS TO IGNORE\n ignore(Event.PAUSE).in(State.PAUSE),\n ignore(Event.PAUSE).in(State.STARTUP),\n ignore(Event.PAUSE).in(State.REBUFFERING),\n ignore(Event.PLAY).in(State.PLAYING),\n ignore(Event.PLAYING).in(State.PLAYING),\n ignore(Event.START_BUFFERING).in(State.PAUSE),\n ignore(Event.START_BUFFERING).in(State.REBUFFERING),\n ignore(Event.VIDEOSTART_TIMEOUT).in(State.PLAYING),\n ignore(Event.VIDEOSTART_TIMEOUT).in(State.PAUSE),\n ignore(Event.VIDEOSTART_TIMEOUT).in(State.SEEKING),\n ignore(Event.UNLOAD).in(State.READY),\n ignore(Event.UNLOAD).in(State.SEEKING),\n ignore(Event.VIDEO_CHANGE).in(State.QUALITY_CHANGE),\n ignore(Event.VIDEO_CHANGE).in(State.STARTUP),\n ignore(Event.VIDEO_CHANGE).in(State.REBUFFERING),\n ignore(Event.VIDEO_CHANGE).in(State.PAUSE),\n ignore(Event.VIDEO_CHANGE).in(State.ERROR),\n ignore(Event.VIDEO_CHANGE).in(State.EXIT_BEFORE_VIDEOSTARTUP),\n ignore(Event.VIDEO_CHANGE).in(State.READY),\n ignore(Event.VIDEO_CHANGE).in(State.SEEKING),\n // Seeking\n ignore(Event.SEEK).in(State.SEEKING),\n ignore(Event.SEEK).in(State.PAUSE),\n ignore(Event.SEEKED).in(State.PAUSE),\n ignore(Event.SEEK).in(State.QUALITY_CHANGE),\n ignore(Event.SEEKED).in(State.QUALITY_CHANGE),\n ignore(Event.SEEK).in(State.REBUFFERING),\n ignore(Event.SEEKED).in(State.REBUFFERING),\n ignore(Event.SEEK).in(State.ERROR),\n ignore(Event.SEEKED).in(State.ERROR),\n ignore(Event.SEEK).in(State.STARTUP),\n ignore(Event.SEEKED).in(State.STARTUP),\n ignore(Event.SEEK).in(State.READY),\n ignore(Event.SEEKED).in(State.READY),\n ignore(Event.SEEK).in(State.EXIT_BEFORE_VIDEOSTARTUP),\n ignore(Event.SEEKED).in(State.EXIT_BEFORE_VIDEOSTARTUP),\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 override sourceChange(config: AnalyticsConfig, timestamp: number, currentTime?: number | undefined): void {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\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_VIDEOSTARTUP]: {\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\ntype IgnoreInFn = (state: State) => StateMachineEventDef;\nconst ignore = (event: Event): {in: IgnoreInFn} => {\n const inFn: IgnoreInFn = (state: State) => {\n return {name: event, from: state, to: state};\n };\n const fn = {\n in: inFn,\n };\n return fn;\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/internal/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(private heartbeatIntervalMs: number, private playerContext: PlayerContext) {}\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 {\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} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {CastClientConfig} from '../types/CastClientConfig';\nimport {CustomDataValues, customDataValuesKeys} from '../types/CustomDataValues';\nimport * as EventData from '../types/EventData';\nimport {FeatureConfigContainer} from '../types/FeatureConfigContainer';\nimport {Sample} from '../types/Sample';\nimport Timespan from '../types/Timespan';\nimport {CodecHelper} from '../utils/CodecHelper';\nimport {logger} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\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 static LICENSE_CALL_PENDING_TIMEOUT = 200;\n static PAGE_LOAD_TYPE_TIMEOUT = 200;\n static CAST_RECEIVER_CONFIG_MESSAGE = 'CAST_RECEIVER_CONFIG_MESSAGE';\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 get errorDetailSubscribable(): Subscribable<OnErrorDetailEventObject> {\n return this.onErrorDetailEventDispatcher;\n }\n\n private config: AnalyticsConfig;\n private sessionHandler: SessionPersistenceHandler;\n private droppedSampleFrames = 0;\n private startupTime = 0;\n private adapter!: InternalAdapterAPI;\n private backendFactory: BackendFactory;\n private featureManager = new FeatureManager<FeatureConfigContainer>();\n private onErrorDetailEventDispatcher = new EventDispatcher<OnErrorDetailEventObject>();\n private adAnalytics: AdAnalytics | undefined;\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 // 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 this.adapter = adapter;\n this.backendFactory = backendFactory;\n this.sessionHandler = new SessionPersistenceHandler(config);\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 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 updateSamplesToCastClientConfig(samples: Sample[], castClientConfig: CastClientConfig) {\n for (const sample of samples) {\n this.updateSampleToCastClientConfig(sample, castClientConfig);\n }\n }\n\n updateSampleToCastClientConfig(sample: Sample, castClientConfig: CastClientConfig) {\n const {config, userId, impressionId, domain, path, language, userAgent} = castClientConfig;\n sample.impressionId = impressionId;\n sample.userId = userId;\n sample.userAgent = userAgent;\n sample.domain = domain;\n sample.path = path;\n sample.language = language;\n\n this.setConfigParameters(sample, config);\n }\n\n init() {\n if (\n this.adapter.supportsDeferredLicenseLoading !== true &&\n (this.config.key === '' || !Utils.validString(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(sample = this.sample, config = this.config) {\n sample.key = config.key;\n sample.playerKey = config.playerKey;\n if (config.player) {\n sample.player = config.player;\n }\n sample.domain = this.getDomainFromConfig(config) || Utils.sanitizePath(window.location.hostname);\n sample.cdnProvider = config.cdnProvider;\n sample.videoId = config.videoId;\n sample.videoTitle = config.title;\n sample.customUserId = config.userId != null ? config.userId : config.customUserId;\n\n Utils.transferCustomDataFields(config, sample);\n\n sample.experimentName = 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\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.validNumber(this.sample.videoTimeEnd)) {\n videoStartForClosedState = this.sample.videoTimeEnd;\n }\n }\n\n if (this.videoStartupTime > 0) {\n this.setVideoTimeStart(videoStartForClosedState);\n this.setVideoTimeEnd(videoStartForClosedState);\n this.clearValues();\n this.setState('closed');\n this.sendUnloadRequest();\n }\n };\n\n this.adapter.stateMachineCallbacks.heartbeat = (\n duration: number,\n state: string,\n sampleData: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>\n ) => {\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 = duration;\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.validNumber(event.currentTime)) {\n this.setVideoTimeEnd(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent = (event: any) => {\n if (Utils.validNumber(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 newConfig = this.getMergedAnalyticsConfig(config);\n\n this.adapter.sourceChange(newConfig, Utils.getCurrentTimestamp());\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.validNumber(event.width)) {\n this.sample.videoPlaybackWidth = event.width;\n }\n if (Utils.validNumber(event.height)) {\n this.sample.videoPlaybackHeight = event.height;\n }\n if (Utils.validNumber(event.bitrate)) {\n this.sample.videoBitrate = event.bitrate;\n }\n if (Utils.validString(event.codec)) {\n this.sample.videoCodec = event.codec;\n }\n }\n\n setPlaybackAudioPropertiesFromEvent(event: any) {\n if (Utils.validNumber(event.bitrate)) {\n this.sample.audioBitrate = event.bitrate;\n }\n if (Utils.validString(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 (Utils.validString(info.size)) {\n this.sample.size = info.size;\n }\n if (Utils.validString(info.playerTech)) {\n this.sample.playerTech = info.playerTech;\n }\n if (Utils.validNumber(info.videoDuration)) {\n this.sample.videoDuration = Utils.calculateTime(info.videoDuration || 0);\n }\n if (Utils.validString(info.streamFormat)) {\n this.sample.streamFormat = info.streamFormat;\n }\n if (Utils.validString(info.mpdUrl)) {\n this.sample.mpdUrl = info.mpdUrl;\n }\n if (Utils.validString(info.m3u8Url)) {\n this.sample.m3u8Url = info.m3u8Url;\n }\n if (Utils.validString(info.progUrl)) {\n this.sample.progUrl = info.progUrl;\n }\n if (Utils.validNumber(info.videoWindowWidth)) {\n this.sample.videoWindowWidth = info.videoWindowWidth;\n }\n if (Utils.validNumber(info.videoWindowHeight)) {\n this.sample.videoWindowHeight = info.videoWindowHeight;\n }\n if (Utils.validNumber(info.screenHeight)) {\n this.sample.screenHeight = info.screenHeight;\n }\n if (Utils.validNumber(info.screenWidth)) {\n this.sample.screenWidth = info.screenWidth;\n }\n if (Utils.validNumber(info.videoPlaybackHeight)) {\n this.sample.videoPlaybackHeight = info.videoPlaybackHeight;\n }\n if (Utils.validNumber(info.videoPlaybackWidth)) {\n this.sample.videoPlaybackWidth = info.videoPlaybackWidth;\n }\n if (Utils.validNumber(info.videoBitrate)) {\n this.sample.videoBitrate = info.videoBitrate;\n }\n if (Utils.validNumber(info.audioBitrate)) {\n this.sample.audioBitrate = info.audioBitrate;\n }\n if (Utils.validBoolean(info.isMuted)) {\n this.sample.isMuted = info.isMuted;\n }\n if (Utils.validBoolean(info.isCasting)) {\n this.sample.isCasting = info.isCasting;\n }\n if (Utils.validString(info.castTech)) {\n this.sample.castTech = info.castTech;\n }\n if (Utils.validString(info.videoTitle) && !this.config.title) {\n this.sample.videoTitle = info.videoTitle;\n }\n if (Utils.validString(info.audioCodec)) {\n this.sample.audioCodec = info.audioCodec;\n }\n if (Utils.validString(info.videoCodec)) {\n this.sample.videoCodec = info.videoCodec;\n }\n if (Utils.validString(info.audioLanguage)) {\n this.sample.audioLanguage = info.audioLanguage;\n }\n if (Utils.validBoolean(info.subtitleEnabled)) {\n this.sample.subtitleEnabled = info.subtitleEnabled;\n }\n if (Utils.validString(info.subtitleLanguage)) {\n this.sample.subtitleLanguage = info.subtitleLanguage;\n } else {\n this.sample.subtitleLanguage = undefined;\n }\n if (Utils.validNumber(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.validBoolean(isLiveFromPlayback) ? isLiveFromPlayback : false;\n }\n\n getMergedCollectorConfig(newConfig: AnalyticsConfig | undefined, oldConfig = this.config) {\n let mergedCollectorConfig = (oldConfig || {}).config;\n if (newConfig != null) {\n mergedCollectorConfig = {...mergedCollectorConfig, enabled: true, ...newConfig.config};\n }\n return mergedCollectorConfig;\n }\n\n getMergedAnalyticsConfig(newConfig: AnalyticsConfig | undefined, oldConfig = this.config): AnalyticsConfig {\n const mergedCollectorConfig = this.getMergedCollectorConfig(newConfig, oldConfig);\n const mergedConfig = {\n ...oldConfig,\n ...newConfig,\n ...{config: mergedCollectorConfig},\n };\n return mergedConfig;\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.validBoolean(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","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 {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsDebugConfig} from '../types/AnalyticsDebugConfig';\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 threshhold = Converter.bitsToBytes(300 * 1000 * 1000); // 300 Megabit per second in bytes\n if (measure.speed >= threshhold) {\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\nexport default class QualityChangeService {\n private qualityChangeCount = 0;\n private previousVideoBitrate = 0;\n private previousAudioBitrate = 0;\n private resetIntervalId?: number;\n\n constructor(private qualityChangeThreshold: number = ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD) {}\n\n resetValues() {\n this.qualityChangeCount = 0;\n this.previousAudioBitrate = 0;\n this.previousVideoBitrate = 0;\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 newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousVideoBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n setVideoBitrate(newBitrate: number): void {\n this.previousVideoBitrate = newBitrate;\n }\n\n shouldAllowAudioQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousAudioBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n setAudioBitrate(newBitrate: number): void {\n this.previousAudioBitrate = newBitrate;\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(hasAdModule: boolean, backendBaseUrl: string, private licenseKey: string) {\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 {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport * as Utils from '../utils/Utils';\n\nexport const BITMOVIN_ANALYTICS_UUID_COOKIE_NAME = 'bitmovin_analytics_uuid';\n\nexport class SessionPersistenceHandler {\n readonly userId: string;\n\n private readonly cookiesEnabled: boolean;\n private readonly cookiesDomain: string | null;\n\n constructor(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n this.cookiesEnabled = collectorConfig == null || collectorConfig.cookiesEnabled !== false;\n if (collectorConfig != null && collectorConfig.cookiesDomain != null) {\n this.cookiesDomain = collectorConfig.cookiesDomain;\n } else {\n this.cookiesDomain = null;\n }\n\n if (!this.cookiesEnabled) {\n this.ensureNoCookiePresent();\n }\n\n this.userId = this.setupUserId();\n }\n\n private setupUserId() {\n let userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (Utils.isNullOrEmptyString(userId)) {\n userId = this.createAndSetNewUserId();\n }\n return userId;\n }\n\n private createAndSetNewUserId() {\n const generatedId = Utils.generateUUID();\n this.writeCookie(generatedId);\n return generatedId;\n }\n\n private ensureNoCookiePresent() {\n const userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (Utils.isNullOrEmptyString(userId)) {\n return;\n }\n const cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n document.cookie = cookie;\n }\n\n private writeCookie(userId: string) {\n if (!this.cookiesEnabled) {\n return;\n }\n let cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=${userId}; path=/; expires=\"Mon, 31 Dec 2029 23:00:00 GMT\"; max-age=315400000`;\n\n if (this.cookiesDomain != null) {\n cookie += `; domain=${this.cookiesDomain}`;\n }\n\n document.cookie = cookie;\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(readonly code: number, readonly message: string) {}\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 PLAYBACK_FINISHED = 'end',\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.PLAYBACK_FINISHED]: AnalyticsEventBase;\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/Utils';\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(readonly reason: string, readonly errorCode: ErrorCode | null) {}\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/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 {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 {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 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: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => 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: any) => void;\n setVideoTimeStartFromEvent: (event: any) => void;\n videoStartFailed: (event: Readonly<VideoStartFailedEvent>, sendRequest: boolean) => void;\n source_changing: (duration: number, state: string, event: any) => 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, eventlisteners\n release: () => void;\n playlistTransition: (event: Readonly<AnalyticsEventBase>) => void;\n}\n\nexport const defaultStateMachineCallbacks: StateMachineCallbacks = {\n setup: (time: number, state: string) => void {},\n startup: (time: number, state: string) => void {},\n playing: (time: number, state: string) => void {},\n heartbeat: (time: number, state: string, payload: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => void {},\n qualitychange: (time: number, state: string) => void {},\n qualitychange_pause: (time: number, state: string) => void {},\n qualitychange_rebuffering: (time: number, state: string) => void {},\n videoChange: (event: any) => void {},\n audioChange: (event: any) => void {},\n audiotrack_changing: () => void {},\n pause: (time: number, state: string) => void {},\n paused_seeking: (time: number, state: string) => void {},\n end_play_seeking: (time: number, state: string) => void {},\n rebuffering: (time: number, state: string) => void {},\n error: (event: Readonly<ErrorEvent>) => void {},\n end: (time: number, state: string) => void {},\n unload: (time: number, state: string) => void {},\n ad: (time: number, state: string) => void {},\n mute: () => void {},\n unMute: () => void {},\n subtitle_changing: () => void {},\n setVideoTimeEndFromEvent: (event: any) => void {},\n setVideoTimeStartFromEvent: (event: any) => void {},\n videoStartFailed: (event: Readonly<VideoStartFailedEvent>, sendRequest: boolean) => void {},\n source_changing: (time: number, state: string, event: any) => void {},\n startCasting: (time: 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: (time: number, state: string, event: any) => void {},\n customdatachange: (time?: number, state?: string, event?: {values: CustomDataValues}) => void {},\n release: () => void {},\n playlistTransition: (event: Readonly<AnalyticsEventBase>) => void {},\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(msg: string, ...optionalParamters: any[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.log(msg, ...optionalParamters);\n }\n\n logTable(fields: any[]) {\n /* eslint-disable-next-line no-console */\n console.table(fields);\n }\n\n errorMessageToUser(msg: string, ...optionalParamters: any[]) {\n /* eslint-disable-next-line no-console */\n console.error(msg, ...optionalParamters);\n }\n\n error(msg: string | undefined, ...optionalParamters: any[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.error(msg, ...optionalParamters);\n }\n\n warning(msg: string) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.warn(msg);\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 {CustomDataValues} from '../types/CustomDataValues';\n\nexport const validString = (text: any): boolean => {\n return text != null && typeof text === 'string';\n};\n\nexport const isNullOrEmptyString = (text: any): boolean => {\n return text == null || typeof text != 'string' || text.length === 0;\n};\n\nexport const validBoolean = (bool: any): boolean => {\n return bool != null && typeof bool === 'boolean';\n};\n\nexport const validNumber = (num: any): boolean => {\n return num != null && typeof num === 'number';\n};\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 * Return the current time in milliseconds.\n */\nexport const getCurrentTimestamp = (): number => {\n return Date.now();\n};\n\nexport const getDurationFromTimestampToNow = (timestamp: number): number => {\n return getCurrentTimestamp() - timestamp;\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\nexport const getCookie = (cname: string): string => {\n const name = cname + '=';\n const ca = document.cookie.split(';');\n for (let c of ca) {\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n }\n return '';\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\nexport const endsWith = (str: string, suffix: string): boolean => {\n if (String.prototype.endsWith != null) {\n return str.endsWith(suffix);\n }\n\n return str.substring(str.length - suffix.length) === suffix;\n};\n\nexport const startsWith = (str: string, prefix: string): boolean => {\n if (String.prototype.startsWith != null) {\n return str.startsWith(prefix);\n }\n return str.substring(0, prefix.length) === prefix;\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","// 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/AmazonIVSAdapter';\nimport {Bitmovin8Adapter} from './adapters/Bitmovin8Adapter';\nimport {CAFv3Adapter} from './adapters/CAFv3Adapter';\nimport {DashjsAdapter} from './adapters/DashjsAdapter';\nimport {HTMLVideoElementAdapter} from './adapters/HTMLVideoElementAdapter';\nimport {HlsAdapter} from './adapters/HlsAdapter';\nimport {ShakaAdapter} from './adapters/ShakaAdapter';\nimport {VideojsAdapter} from './adapters/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","playerConfig","getConfig","analyticsConfig","playerKey","key","Bitmovin8InternalAdapter","Bitmovin8Adapter","CAFv3InternalAdapter","CAFv3Adapter","DashjsInternalAdapter","DashjsAdapter","HTMLVideoElementInternalAdapter","HTMLVideoElementAdapter","HlsInternalAdapter","HlsAdapter","ShakaInternalAdapter","Promise","resolve","reject","then","result","catch","eventObject","currentTime","code","message","JSON","stringify","category","severity","data","additionalData","eventCallback","Event","ERROR","ShakaAdapter","VideojsInternalAdapter","VideojsAdapter","eventDispatcher","EventDispatcher","playerExports","on","PlayerEvent","DownloadFinished","onDownloadFinished","subscribe","callback","unsubscribe","dispatch","httpRequest","downloadTime","calculateTimeWithUndefined","httpStatus","success","timestamp","getCurrentTimestamp","url","size","timeToFirstByte","type","mapHttpRequestType","downloadType","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","Bitmovin8HttpRequestTrackingAdapter","ViewMode","onBeforeUnLoadEvent","getPlayerVersion","version","getPlayerName","Player","BITMOVIN","getPlayerTech","getPlayerType","getDrmPerformanceInfo","drmPerformanceInfo","stateMachine","Bitmovin8AnalyticsStateMachine","stateMachineCallbacks","speedMeter","Bitmovin8SpeedMeterAdapter","DownloadSpeedMeter","getDownloadSpeedMeter","segmentTracker","Bitmovin8SegmentTrackerAdapter","SegmentTracker","getSegmentTracker","httpRequestTrackingAdapter","videoCompletionTracker","getInfo","getSegments","_adModule","getCurrentTime","isAdPlaying","warning","lastTrackedCurrentTime","currentAd","ads","getActiveAd","initialize","registerPlayerEventListeners","registerUnloadEventListeners","Bitmovin8AdModule","windowEventTracker","requestTracking","HttpRequestTracking","ErrorDetailTracking","errorDetailTrackingSettingsProvider","ErrorDetailBackend","collectorConfig","errorDetailSubscribable","clearValues","reset","clearSegments","getAutoPlay","playback","autoplay","getCurrentPlaybackInfo","info","getCommonPlaybackInfo","getViewMode","Fullscreen","PlayerSize","Window","playerTech","isLive","videoDuration","normalizeVideoDuration","streamFormat","getStreamType","videoWindowWidth","getContainer","offsetWidth","videoWindowHeight","offsetHeight","isMuted","isCasting","audioLanguage","getAudio","lang","subtitleEnabled","droppedFrames","getSource","getDroppedVideoFrames","applySubtitleProperties","applyPlaybackQualityProperties","applyCastingProperties","applySourceProperties","onError","SourceUnloaded","SOURCE_UNLOADED","SourceLoaded","resetSourceRelatedState","getDuration","setVideoDuration","SOURCE_LOADED","CastStarted","START_CAST","CastStopped","END_CAST","Play","issuer","PLAY","Playing","PLAYING","Paused","PAUSE","TimeChanged","TIMECHANGED","Seek","allowSeeking","SEEK","Seeked","SEEKED","StallStarted","START_BUFFERING","StallEnded","END_BUFFERING","AudioPlaybackQualityChanged","quality","getPlaybackAudioData","qualityChangeService","shouldAllowAudioQualityChange","bitrate","setAudioBitrate","AUDIO_CHANGE","codec","VideoPlaybackQualityChanged","getPlaybackVideoData","shouldAllowVideoQualityChange","setVideoBitrate","VIDEO_CHANGE","width","height","ViewModeChanged","START_FULLSCREEN","END_FULLSCREEN","AdStarted","START_AD","AdFinished","END_AD","AdSkipped","AdError","Muted","MUTE","Unmuted","UN_MUTE","legacyData","ErrorCode","BITMOVIN_PLAYER_LICENSING_ERROR","SETUP_MISSING_LICENSE_WHITELIST","_onLicenseCallFailed","PlaybackFinished","PLAYBACK_FINISHED","drmType","replace","drmLoadTime","AudioChanged","AUDIOTRACK_CHANGED","SubtitleEnabled","SUBTITLE_CHANGE","SubtitleDisabled","LicenseValidated","_onLicenseKeyReceived","licenseKey","handleCollectorUnload","UNLOAD","release","bind","Destroy","addEventListener","source","videoTitle","title","mpdUrl","dash","hls","progSourceInfo","getSourceInfoFromBitmovinSourceConfig","progressive","progUrl","videoBitrate","progBitrate","enabledSubtitle","subtitles","list","find","s","enabled","subtitleLanguage","videoQuality","videoPlaybackHeight","videoPlaybackWidth","videoCodec","audioQuality","audioBitrate","audioCodec","isAirplayActive","castTech","CastTech","AirPlay","remoteControlConfig","remotecontrol","GoogleCast","WebSocket","seekEvent","Math","abs","position","seekTarget","AnalyticsSettings","ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD","InternalAdapter","handleSegmentPlaybackEvent","removeSegment","handleOnDownloadFinishEvent","SegmentPlayback","segment","Utils","getURLResourceName","addSegment","meter","addMeasurement","duration","Date","context","CHROMECAST_SHAKA","currentItem","HTML5AnalyticsStateMachine","playerManager","getPlayerManager","isSeeking","register","window","cast","framework","getCurrentTimeSec","stats","getStats","getIsLive","mediaInformation","activeAudioTrack","trackContentType","language","activeTextTracks","t","join","SETUP","audioTracksManager","getAudioTracksManager","getActiveTrack","textTracksManager","getTextTracksManager","getActiveTracks","queueManager","getQueueManager","getCurrentItem","media","READY","currentMediaTime","onPaused","errorData","detailedErrorCode","reason","isBuffering","PLAYLIST_TRANSITION","streamType","getLiveSeekableRange","mediaPlayer","DASHJS","getVersion","videoEl","getVideoElement","setMediaElement","registerMediaElementEventsForDashJS","mediaElement","listenToMediaElementEvent","needsFirstPlayIntent","getMIMEType","MIMETypes","DASH","getStreamURL","toString","getCurrentQualityLevelInfo","currentVideoQuality","getBitrateInfoListFor","getQualityFor","HTML5InternalAdapter","previousMutedValue","HTML5","Infinity","initializeStateMachine","mediaElEventHandlers","bufferingTimeout","lastIsLiveStatus","isPaused","previousMediaTime","previousClientTime","needsReadyEvent","mediaElementSet","playerStatisticsProvider","registerWindowEvents","getStreamSources","isVideoInFullscreen","getDroppedFrames","muted","qualityInfo","unregisterMediaElement","registerMediaElement","onMaybeReady","streamUrl","getMIMETypeFromFileExtension","mimetype","getStreamTypeFromMIMEType","src","resetMedia","clearTimeout","wrapMediaElementLoad","readyState","checkQualityLevelAttributes","volume","isAudioMuted","checkSeeking","checkPlayheadProgress","onBuffering","handler","boundHandler","forEach","item","removeEventListener","onPageClose","paused","setTimeout","ended","BUFFERING_TIMECHANGED_TIMEOUT","silent","qualityLevelInfo","eventData","getSelectedSubtitleFromMediaElement","textTracks","attr","mode","isSubtitleDisplayed","callEvent","currentVideoTime","mediaTimeDif","clientTimeDif","browserInfo","getBrowserInfo","currentSrc","videoWidth","videoHeight","HLSJS","constructor","levels","currentLevel","currentLevelObj","details","live","onDestroying","HlsSpeedMeterAdapter","registerHlsEvents","HLS","onMediaAttaching","onMediaDetaching","onManifestLoading","onAudioTrackSwitched","onSubtitleLanguageSwitched","onHlsError","selectedSubtitle","getSelectedSubtitleLanguage","getSelectedAudioLanguage","errorName","fatal","errorMessage","getErrorCodeFromHlsErrorType","audioTrack","audioTracks","subtitleDisplay","subtitleTrack","subtitleTracks","subtitleTrackController","Events","FRAG_LOADED","eventName","handleFragmentLoadedEvent","frag","tload","trequest","total","tfirst","networkDetails","status","defaultStateMachineCallbacks","_windowEventTracker","WindowEventTracker","eventType","starttime","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","screenHeight","screen","screenWidth","previousState","currentState","customdatachange","CUSTOM_DATA_CHANGE","playerIsMuted","currentVolume","getMediaElement","SHAKA","onUnloading","videoElement","getAssetUri","activeVideoTrack","getVariantTracks","filter","track","active","videoId","videoBandwidth","bandwidth","_subtitleInfo","previousTime","videojs","VIDEOJS","VideojsAnalyticsStateMachine","mimeType","currentType","selectedAudioLanguage","getSelectedAudioTrackLanguage","codecInfo","getCodecInfo","tech","IWillNotUseThisInPlugins","isFullscreen","that","MANUAL_SOURCE_CHANGE","ready","getSubtitleInfo","seeking","newSubtitleInfo","hasInfoChanged","isDifferentSubtitleInfo","newSelectedAudioLanguage","vhs","mediaAttributes","getMediaAttributes","handlePageClose","sourceHandler","playlists","selectedPlaylist","attributes","BANDWIDTH","RESOLUTION","codecs","CODECS","split","CodecHelper","isVideoCodec","isAudioCodec","onAdStarted","onAdFinished","onAdBreakStarted","onAdBreakFinished","onAdClicked","onAdError","onAdManifestLoaded","onAdQuartile","onAdSkipped","onPlay","onPause","onBeforeUnload","AdCallbacks","adCallbacks","isLinearAdActive","getAdModuleInfo","getModuleInfo","AdBreakStarted","AdBreakFinished","AdClicked","AdQuartile","AdManifestLoaded","supportsDeferredLicenseLoading","AMAZON_IVS","isAutoplay","playerContext","AmazonIVSPlayerContext","heartbeatService","HeartbeatService","AmazonIVSStateMachine","setListener","listener","AmazonIVSPlayerEventListener","getHTMLVideoElement","windowEventListener","WindowEventListener","startMonitoring","RELEASE","getPosition","clientWidth","clientHeight","getQuality","getVideoAndAudioCodecs","StreamTypes","dispatcher","payload","errorEvent","exceptionMessage","exceptionStacktrace","ErrorService","State","EVENT_DELAY_MS","IDLE","cancelPause","PAUSE_SCHEDULED","PAUSE_CANCELLED","schedulePauseEvent","triggerPause","PauseEventDispatcher","pauseDispatcher","ignorePause","onStartupPlaying","onPlaying","playing","onRebuffering","startBuffering","onQualityChange","qualityChange","onSeek","seek","onSeeked","seeked","PlaybackService","StartupState","STARTUP_FINISHED","onInitialized","finishSetup","startStartup","finishStartup","STARTUP","VideoStartupService","videoStartupService","playbackService","errorService","onDurationChanged","finishedStartup","onQualityChanged","onTimeUpdate","AmazonIVSPlayerEventHandler","IVS_PLAYER_EVENT","DURATION_CHANGED","INITIALIZED","QUALITY_CHANGED","REBUFFERING","SEEK_COMPLETED","TIME_UPDATE","PLAYBACK_RATE_CHANGED","PLAYBACK_BLOCKED","eventHandler","startMonitoringIVSPlayer","startMonitoringHTMLVideoElement","video","COLLECTOR_EVENTS","observer","trigger","eventBus","CollectorEventBus","CollectorEvents","onPageUnload","UNLOADED","previousTotalDroppedFrames","getVideoPlaybackQuality","droppedVideoFrames","currentDroppedFrames","REBUFFERING_HEARTBEAT_INTERVALS","onEnterStateTimestamp","videoStartupTimeoutMs","Settings","ANALYTICS_VIDEOSTART_TIMEOUT","rebufferTimeoutMs","ANALYTICS_REBUFFER_TIMEOUT","currentRebufferingIntervalIndex","createStateMachine","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","errorCode","SOURCE_CHANGING","INITIAL_SOURCE_CHANGE","AD_STARTUP","EXIT_BEFORE_VIDEOSTART","QUALITYCHANGE","QUALITYCHANGE_PAUSE","PLAY_SEEKING","END_PLAY_SEEKING","END","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","videoChange","audioChange","mute","unMute","onseek","onseeked","ontimechanged","played","onplayerError","exec","EventDebugging","getStates","setEnabledDebugging","seekStartedAt","PAUSED_SEEKING","AD","playlistTransition","fnName","pause","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","paused_seeking","getStateHandler","startup","startHeartbeat","stopHeartbeat","rebuffering","EXIT_BEFORE_VIDEOSTARTUP","failedEvent","isErrorEvent","shouldSendVideoStartupSample","QUALITY_CHANGE","qualitychange","SEEKING","ignore","in","onHeartbeat","heartbeatIntervalMs","heartbeatInterval","clearHeartbeat","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","videoStartupTime","droppedSampleFrames","startupTime","featureManager","FeatureManager","onErrorDetailEventDispatcher","authenticationCallback","authenticationCompleted","featureConfigs","configureFeatures","guardAgainstMissingVideoTitle","oldConfig","newConfig","guardAgainstMissingIsLive","getMergedAnalyticsConfig","setState","changeCustomData","sendAnalyticsRequestAndClearValues","setConfigParameters","impressionId","sessionHandler","userId","input","retVal","customDataValuesKeys","buildDefaultAnalyticsConfigValues","domain","getDomain","SessionPersistenceHandler","licenseKeyReceivedUnsubscriber","onLicenseKeyReceived","eventArgs","setupSample","init","setupStateMachineCallbacks","features","registerFeatures","adAnalytics","checkForErrorsInConfig","getPlayerInformationFromAdapter","updateSamplesToCastClientConfig","samples","castClientConfig","updateSampleToCastClientConfig","path","userAgent","validString","setLogging","debug","resetFeatures","createBackend","generateNewImpressionId","setUserId","resetValues","NoOpBackend","stopResetInterval","getDomainFromConfig","sanitizePath","location","hostname","cdnProvider","customUserId","transferCustomDataFields","experimentName","setDuration","performance","timing","loadTime","navigationStart","supportedVideoCodecs","supportedVideoFormats","drmPerformance","setCompletionValues","videoStartForClosedState","videoTimeStart","sendUnloadRequest","validNumber","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","sampleData","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","setPlaybackVideoPropertiesFromEvent","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","sendRequest","videoStartFailedReason","segmentNames","segments","errorSegments","subtitle_changing","end","setPlaybackInfoFromAdapter","getIsLiveFromConfigOrPlaybackInfo","validBoolean","platform","pathname","navigator","userLanguage","completedTotal","downloadSpeedInfo","copySample","sendAnalyticsRequestSynchronous","sendRequestSynchronous","isLiveFromPlayback","getMergedCollectorConfig","mergedCollectorConfig","origin","addWatched","start","getCompletionPercentage","Number","isNaN","value","startResetInterval","increaseCounter","isQualityChangeEventEnabled","QUALITY_CHANGE_THRESHOLD_EXCEEDED","LICENSE_CALL_PENDING_TIMEOUT","PAGE_LOAD_TYPE_TIMEOUT","CAST_RECEIVER_CONFIG_MESSAGE","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","measurement","measure","Measure","threshhold","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","newBitrate","resetIntervalId","resetCounter","ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL","queue","unloadQueue","syncQueue","adQueue","hasAdModule","analyticsCall","AnalyticsCall","sequenceNumber","updateSampleBeforeSending","BITMOVIN_ANALYTICS_UUID_COOKIE_NAME","cookiesEnabled","cookiesDomain","ensureNoCookiePresent","setupUserId","getCookie","isNullOrEmptyString","createAndSetNewUserId","generatedId","writeCookie","cookie","document","TimespanOverlappingType","watched","overlappingTimespan","mergeWatched","w","time1","k","time2","overlapType","getOverlappingType","Overlapping","mergeAndReplace","getOverlappingTimespan","FirstContainedInSecond","SecondContainedInFirst","None","first","second","isMomentInTimespan","moment","timespan","firstIndex","secondIndex","newWatchedTimespan","CdnProvider","videoCodecs","audioCodecs","findIndex","startsWith","VIDEO_STARTUP_TIMEOUT_REACHED","MP4","WEBM","endsWith","PAGE_LOAD_TYPE","mapping","_config","_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","source_changing","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","optionalParamters","table","warn","str","Logger","_items","poll","maxElements","MESSAGE_NAMESPACE","text","bool","num","now","getDurationFromTimestampToNow","c","r","random","cname","charAt","substring","getCustomDataString","customData","fromConfig","toConfig","CustomDataUtils","customDataField","getDocumentPropWithPrefix","prop","pascalCase","toUpperCase","prefix","fullscreenProp","nodeName","getHiddenProp","hiddenProp","BACKGROUND","FOREGROUND","domElement","createElement","href","numerator","denominator","tem","ua","M","test","appName","appVersion","pop","prev","suffix","threshold","inViewport","options","rootMargin","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","_observer","intersectionRatio","trackedObjects","obj","__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/AmazonIVSAdapter.ts","webpack://bitmovin.analytics/./src/adapters/Bitmovin8Adapter.ts","webpack://bitmovin.analytics/./src/adapters/CAFv3Adapter.ts","webpack://bitmovin.analytics/./src/adapters/DashjsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/HTMLVideoElementAdapter.ts","webpack://bitmovin.analytics/./src/adapters/HlsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/ShakaAdapter.ts","webpack://bitmovin.analytics/./src/adapters/VideoJsAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8HttpRequestTrackingAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8SegmentTrackerAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/Bitmovin8SpeedMeterAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/CAFv3InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/DashjsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HTML5InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HTMLVideoElementInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HlsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/HlsSpeedMeterAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/InternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/ShakaInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/VideojsInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/ads/AdModuleAPI.ts","webpack://bitmovin.analytics/./src/adapters/internal/ads/Bitmovin8AdModule.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/AmazonIVSInternalAdapter.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/ErrorService.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/PauseEventDispatcher.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/PlaybackService.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/playback/VideoStartupService.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/AmazonIVSPlayerContext.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/AmazonIVSPlayerEventHandler.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/AmazonIVSPlayerEventListener.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/player/SourceUrlProvider.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/utils/CollectorEventBus.ts","webpack://bitmovin.analytics/./src/adapters/internal/amazonIVS/window/WindowEventListener.ts","webpack://bitmovin.analytics/./src/adapters/internal/html5/player/HTMLVideoElementStatisticsProvider.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/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/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/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 private 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';\n\nimport {Adapter} from './Adapter';\nimport {AmazonIVSInternalAdapter} from './internal/amazonIVS/AmazonIVSInternalAdapter';\nimport {SourceUrlProvider} from './internal/amazonIVS/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 {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';\n\nimport {Adapter} from './Adapter';\nimport {Bitmovin8InternalAdapter} from './internal/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 = new Bitmovin8InternalAdapter(player, opts);\n this.analytics = new Analytics(analyticsConfig, this.internalAdapter);\n (player as any).analytics = this.analytics;\n this.wrapPlayerLoad(player, this.analytics);\n }\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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {CAFv3InternalAdapter} from './internal/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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {DashjsInternalAdapter} from './internal/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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {HTMLVideoElementInternalAdapter} from './internal/HTMLVideoElementInternalAdapter';\n\nexport class HTMLVideoElementAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: HTMLVideoElement, 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 HTMLVideoElementInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\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';\n\nimport {Adapter} from './Adapter';\nimport {HlsInternalAdapter} from './internal/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 {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';\n\nimport {Adapter} from './Adapter';\nimport {ShakaInternalAdapter} from './internal/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 {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\n\nimport {Adapter} from './Adapter';\nimport {VideojsInternalAdapter} from './internal/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 as videojs.default.Player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {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 Bitmovin8HttpRequestTrackingAdapter 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 {PlayerAPI, PlayerEventBase, SeekEvent, UserInteractionEvent} 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 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';\n\nimport {Bitmovin8HttpRequestTrackingAdapter} from './Bitmovin8HttpRequestTrackingAdapter';\nimport {Bitmovin8SegmentTrackerAdapter} from './Bitmovin8SegmentTrackerAdapter';\nimport {Bitmovin8SpeedMeterAdapter} from './Bitmovin8SpeedMeterAdapter';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\nimport {AdModuleAPI} from './ads/AdModuleAPI';\nimport {Bitmovin8AdModule} from './ads/Bitmovin8AdModule';\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 readonly videoCompletionTracker: VideoCompletionTracker;\n\n private onBeforeUnLoadEvent = false;\n private speedMeter: DownloadSpeedMeter;\n private segmentTracker: SegmentTracker;\n private _adModule?: AdModuleAPI;\n private lastTrackedCurrentTime: number | undefined;\n private videoDuration: number | undefined;\n private httpRequestTrackingAdapter: Bitmovin8HttpRequestTrackingAdapter;\n\n constructor(\n private player: PlayerAPI,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n this.stateMachine = new Bitmovin8AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.speedMeter = new Bitmovin8SpeedMeterAdapter(player, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n this.segmentTracker = new Bitmovin8SegmentTrackerAdapter(player, new SegmentTracker()).getSegmentTracker();\n this.httpRequestTrackingAdapter = new Bitmovin8HttpRequestTrackingAdapter(player);\n this.videoCompletionTracker = new VideoCompletionTracker();\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 return info;\n }\n\n sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, 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.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, () => {\n const quality = this.player.getPlaybackAudioData();\n\n if (this.qualityChangeService.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.qualityChangeService.setAudioBitrate(quality.bitrate);\n this.eventCallback(Event.AUDIO_CHANGE, {\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.VideoPlaybackQualityChanged, () => {\n const quality = this.player.getPlaybackVideoData();\n\n if (this.qualityChangeService.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.qualityChangeService.setVideoBitrate(quality.bitrate);\n this.eventCallback(Event.VIDEO_CHANGE, {\n width: quality.width,\n height: quality.height,\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\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","import {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 Bitmovin8SegmentTrackerAdapter {\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 {PlayerAPI} from 'bitmovin-player';\n\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\n\nexport class Bitmovin8SpeedMeterAdapter {\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 {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';\n\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './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, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, 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 {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';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './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 {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 * as Utils from '../../utils/Utils';\nimport {isVideoInFullscreen} from '../../utils/Utils';\n\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\nimport HTMLVideoElementStatisticsProvider from './html5/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 abstract getPlayerVersion: () => string;\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 private previousMediaTime: number;\n private previousClientTime: number;\n private needsReadyEvent: boolean;\n private mediaElementSet: boolean;\n private previousMutedValue = false;\n private playerStatisticsProvider: HTMLVideoElementStatisticsProvider;\n\n 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.previousMediaTime = 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 this.drmPerformanceInfo = undefined;\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 /**\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 this.eventCallback(Event.READY, {});\n });\n\n this.listenToMediaElementEvent('loadedmetadata', () => {\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\n this.listenToMediaElementEvent('play', () => {\n const {currentTime} = mediaElement;\n\n this.needsFirstPlayIntent = false;\n\n this.eventCallback(Event.PLAY, {\n currentTime,\n });\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, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.UN_MUTE, {\n currentTime,\n });\n }\n this.previousMutedValue = isMuted;\n }\n });\n\n this.listenToMediaElementEvent('seeking', () => {\n const {currentTime} = mediaElement;\n\n this.eventCallback(Event.SEEK, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('seeked', () => {\n const {currentTime} = mediaElement;\n\n clearTimeout(this.bufferingTimeout);\n\n this.eventCallback(Event.SEEKED, {\n currentTime,\n });\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, {\n currentTime,\n });\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.previousMediaTime = 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 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, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime,\n });\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, {\n currentTime,\n });\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, {\n currentTime,\n });\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.previousMediaTime;\n\n if (timeDelta < HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT) {\n this.onBuffering();\n }\n }, HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT);\n }\n\n checkQualityLevelAttributes(silent = false) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n const qualityLevelInfo = this.getCurrentQualityLevelInfo();\n if (!qualityLevelInfo) {\n return;\n }\n\n const {bitrate, width, height} = qualityLevelInfo;\n\n const isLive = this.isLive();\n\n // Detect a change of the isLive status and update the medaData 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 if (bitrate != null && 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 }\n }\n\n sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.mediaElement ? this.mediaElement.currentTime : undefined);\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({}, Utils.getCurrentTimestamp());\n originalLoad.apply(mediaElement, args);\n };\n }\n\n private checkSeeking() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const currentVideoTime = this.mediaElement.currentTime;\n\n const mediaTimeDif = Math.abs(currentVideoTime - this.previousMediaTime);\n const currentClientTime = Utils.getCurrentTimestamp();\n\n /** Difference between current client time and the previously known client time in seconds. */\n const clientTimeDif = (currentClientTime - this.previousClientTime) / 1000;\n\n /**\n * If the media time difference between the previous one and the current one is much higher than\n * the difference of the previous and current client time than there is a seek happening\n */\n // TODO: check if we need to increase the threshold for detecting a seek. The seek can be triggered when clicking `play` at an unfavorable point in time:\n // Set autoplay to false and click on play right after the player/video loaded.\n if (mediaTimeDif > clientTimeDif * 2) {\n this.isSeeking = true;\n this.onPaused(this.previousMediaTime + clientTimeDif);\n }\n\n this.previousClientTime = Utils.getCurrentTimestamp();\n }\n}\n","import {Player} from '../../enums/Player';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {getBrowserInfo} from '../../utils/Utils';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class HTMLVideoElementInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(mediaElement: HTMLVideoElement, opts?: AnalyticsStateMachineOptions) {\n super(mediaElement, opts);\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","import type {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 {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {HlsSpeedMeterAdapter} from './HlsSpeedMeterAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\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 if (!this.hls.levels) {\n return null;\n }\n const currentLevelObj = this.hls.levels[this.hls.currentLevel];\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,\n width,\n height,\n };\n }\n\n override isLive = () => {\n const hls = this.hls;\n if (!hls.levels || !hls.currentLevel) {\n return false;\n }\n if (hls.currentLevel < 0) {\n return false;\n }\n const currentLevelObj = hls.levels[hls.currentLevel];\n if (!currentLevelObj || !currentLevelObj.details) {\n return false;\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 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 /**\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/master/src/errors.ts\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 {FragLoadedData} from './hlsjs/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 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 const measurement = {\n duration: loadingDuration,\n size: stats.total,\n timeToFirstByte: timeToFirstByte,\n timestamp: new Date(),\n httpStatus: eventData.networkDetails.status,\n };\n\n this.meter.addMeasurement(measurement);\n }\n}\n","import {AnalyticsStateMachine} from '../../analyticsStateMachines/AnalyticsStateMachine';\nimport {EventDispatcher} from '../../core/EventDispatcher';\nimport QualityChangeService from '../../core/QualityChangeService';\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 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.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","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';\n\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './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,\n width,\n height,\n };\n }\n\n private onUnloading = () => {\n this.eventCallback(Event.SOURCE_UNLOADED, {});\n this.release();\n };\n}\n","import {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 {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';\n\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class VideojsInternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n readonly videoCompletionTracker: VideoCompletionTracker;\n private _subtitleInfo: SubtitleInfo = {enabled: false};\n private selectedAudioLanguage?: string;\n private onBeforeUnLoadEvent = false;\n private previousTime = 0;\n\n constructor(\n private player: videojs.default.Player,\n opts?: AnalyticsStateMachineOptions,\n ) {\n super(opts);\n this.stateMachine = new VideojsAnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.videoCompletionTracker = new VideoCompletionTracker();\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 = () => ((window as any).videojs ? (window as any).videojs.VERSION : 'unknown');\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.videoPlaybackWidth = qualityInfo.height || info.videoPlaybackHeight;\n info.videoBitrate = qualityInfo.bitrate;\n }\n\n return info;\n }\n\n getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n // TODO: Needs to be implemented\n return null;\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 // 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 not be present. In that case Videojs is just\n // a wrapper around the respective playback tech (HTML or Flash).\n const tech = this.tech({IWillNotUseThisInPlugins: true});\n\n // older videojs versions don't have vhs property\n if (tech.vhs || tech.hls) {\n const mediaAttributes = that.getMediaAttributes(tech);\n\n if (!mediaAttributes || !mediaAttributes.bitrate) {\n return;\n }\n\n // update actual bitrate\n if (that.qualityChangeService.shouldAllowVideoQualityChange(mediaAttributes.bitrate)) {\n const eventObject: VideoChangeEvent = {\n width: mediaAttributes.width,\n height: mediaAttributes.height,\n bitrate: mediaAttributes.bitrate,\n currentTime: this.currentTime(),\n };\n\n that.eventCallback(Event.VIDEO_CHANGE, eventObject);\n that.qualityChangeService.setVideoBitrate(mediaAttributes.bitrate);\n }\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, timestamp: number) {\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.player.duration());\n this.previousTime = 0;\n this.stateMachine.sourceChange(config, timestamp, this.player.currentTime());\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 // 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 CodecInfo {\n audioCodec: string | undefined;\n videoCodec: string | undefined;\n}\n\nexport interface MediaAttributes {\n codecs: string | undefined;\n bitrate: number | undefined;\n width: number | undefined;\n height: number | undefined;\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 {PlayerAPI, UserInteractionEvent} from 'bitmovin-player';\n\nimport {WindowEventTracker} from '../../../utils/WindowEventTracker';\n\nimport {AdCallbacks, AdModuleAPI} from './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 {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 {InternalAdapter} from '../InternalAdapter';\nimport {InternalAdapterAPI} from '../InternalAdapterAPI';\nimport {AdModuleAPI} from '../ads/AdModuleAPI';\nimport HTMLVideoElementStatisticsProvider from '../html5/player/HTMLVideoElementStatisticsProvider';\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, timestamp: number) {\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 {PlayerError} from 'amazon-ivs-player';\n\nimport {Event} from '../../../../enums/Event';\nimport {ErrorEvent} from '../../../../types/EventData';\nimport {EventCallbackDispatcher} from '../../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 '../../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: 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 '../../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 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 this.pauseDispatcher.cancelPause();\n if (this.playerContext.isLive) return;\n const currentTime = this.playerContext.position;\n this.dispatcher.eventCallback(Event.SEEK, {currentTime});\n }\n\n private seeked() {\n this.pauseDispatcher.cancelPause();\n if (this.playerContext.isLive) return;\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 {Event} from '../../../../enums/Event';\nimport {EventCallbackDispatcher} from '../../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 ) {}\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}\n","import type {MediaPlayer} from 'amazon-ivs-player';\n\nexport interface PlayerContext {\n position: number;\n isLive: boolean;\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","import type {PlayerError, Quality} from 'amazon-ivs-player';\n\nimport QualityChangeService from '../../../../core/QualityChangeService';\nimport {logger} from '../../../../utils/Logger';\nimport {EventCallbackDispatcher} from '../../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: ' + payload);\n if (this.videoStartupService.finishedStartup) {\n this.playbackService.onQualityChange(payload);\n }\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);\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 {MediaPlayer, PlayerEventType} from 'amazon-ivs-player';\n\nimport QualityChangeService from '../../../../core/QualityChangeService';\nimport {EventCallbackDispatcher} from '../../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 // 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 '../../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","export default class HTMLVideoElementStatisticsProvider {\n private previousTotalDroppedFrames = 0;\n\n constructor(private videoElement: HTMLVideoElement | undefined) {}\n getDroppedFrames(): number {\n if (this.videoElement == undefined) {\n return 0;\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 {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 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 abstract sourceChange(config: AnalyticsConfig, timestamp: number, currentTime?: number): void;\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 {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\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';\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 SOURCE_LOADED = 'SOURCE_LOADED',\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: any;\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 sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n\n createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n // {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\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 {name: Event.READY, from: State.READY, to: State.READY},\n {name: Event.VIDEO_CHANGE, from: State.READY, to: State.READY},\n {name: Event.AUDIO_CHANGE, from: State.READY, to: 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 {name: Event.PLAY, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAYING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.PLAYING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: 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 {name: Event.TIMECHANGED, from: State.REBUFFERING, to: 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 {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: 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 name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\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 // disable tranitions in PLAY_SEEKING\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n // disable transitions in END_PLAY_SEEKING\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.PLAY, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n // disable Seek events during PAUSE\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n // ignore seeked during Playing because of not allowed keyboard seeking\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n\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 {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: 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 {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: 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 {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: 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 {name: Event.PLAY, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.PAUSE, from: State.AD_STARTUP, to: 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 {name: Event.PLAY, from: State.AD_READY, to: State.AD_READY},\n {name: Event.PAUSE, from: State.AD_READY, to: 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 {name: Event.PLAY, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.PAUSE, from: State.AD_PAUSE, to: 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 {name: Event.PLAY, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.PAUSE, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.END, from: State.AD_PLAYING, to: State.END},\n\n // Ignore timechanged events during ads\n {name: Event.TIMECHANGED, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.TIMECHANGED, from: State.AD_READY, to: State.AD_READY},\n {name: Event.TIMECHANGED, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.TIMECHANGED, from: State.AD_PLAYING, to: State.AD_PLAYING},\n\n // Ignore End Ad events when no ad has started\n {name: Event.END_AD, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_AD, from: State.PAUSE, to: State.PAUSE},\n {name: Event.END_AD, from: State.READY, to: State.READY},\n {name: Event.END_AD, from: State.STARTUP, to: 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 {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAYING, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.UN_MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut([State.SETUP]),\n to: State.SOURCE_CHANGING,\n },\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: State.SETUP,\n to: State.INITIAL_SOURCE_CHANGE,\n },\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 {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n ],\n callbacks: {\n onbeforeevent: (event, from, to, timestamp, eventObject): any => {\n if (from === State.REBUFFERING && to === State.QUALITYCHANGE_REBUFFERING) {\n return false;\n }\n },\n onafterevent: (event, from, to, timestamp, 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 onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any,\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) => {\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 (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 occured in State Machine callback ' + fromStateName, eventObject, e);\n }\n } else {\n logger.error('Could not find callback function for ' + fromStateName);\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) => {\n if (this.stateMachine.current !== 'PLAYING') {\n return;\n }\n\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 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 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 {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\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';\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 private seekStartedAt: any;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekStartedAt = null;\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: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SETUP, from: State.INITIALIZED, to: State.SETUP},\n {name: Event.SETUP, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.READY, from: [State.SETUP, State.ERROR, State.END, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.READY, from: State.READY, to: 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 {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.TIMECHANGED, from: State.READY, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: 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 {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: 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 {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: 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 name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\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 {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: 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 {name: Event.PAUSE, from: State.END, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.SEEK, from: State.PLAYING, to: 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 {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: 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 {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: 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 {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: 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 {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n {name: Event.PAUSE, from: State.SOURCE_CHANGING, to: 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 {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\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 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.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\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 const seekDuration = timestamp - this.seekStartedAt;\n this.seekStartedAt = null;\n this.stateMachineCallbacks[fnName](seekDuration, 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 logger.error('Could not find callback function for ' + fnName);\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 onseek: (event, from, to, timestamp) => {\n this.seekStartedAt = this.seekStartedAt || 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 sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","import * as StateMachine from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\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';\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: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.SOURCE_LOADED, from: State.READY, to: 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 {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PAUSED_SEEKING, to: 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 {name: Event.TIMECHANGED, from: State.PAUSE, 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 {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: 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 name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\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 {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: 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 {name: 'PLAY_SEEK', from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: 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 {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: 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 {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: 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 {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 {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: 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 {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: 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 {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut(State.READY),\n to: State.SOURCE_CHANGING,\n },\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: State.READY,\n to: State.READY,\n },\n {name: Event.MANUAL_SOURCE_CHANGE, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: 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 {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\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 const excludedStates = [\n State.MUTING_PAUSE,\n State.MUTING_PLAY,\n State.AUDIOTRACK_CHANGED_PLAYING,\n State.SUBTITLE_CHANGED_PLAYING,\n ];\n if (excludedStates.find((e) => from === e) == null) {\n logger.error('Could not find callback function for ' + fnName);\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 sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","import {StateMachine, StateMachineEventDef} from 'javascript-state-machine';\n\nimport {Event, EventMap} from '../../enums/Event';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\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';\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_VIDEOSTARTUP = 'EXIT_BEFORE_VIDEOSTARTUP',\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: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\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_VIDEOSTARTUP},\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTARTUP},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTARTUP},\n\n // ERROR\n {name: Event.ERROR, from: getAllStatesBut([State.STARTUP, State.EXIT_BEFORE_VIDEOSTARTUP]), to: State.ERROR},\n\n // EVENTS TO IGNORE\n ignore(Event.PAUSE).in(State.PAUSE),\n ignore(Event.PAUSE).in(State.STARTUP),\n ignore(Event.PAUSE).in(State.REBUFFERING),\n ignore(Event.PLAY).in(State.PLAYING),\n ignore(Event.PLAYING).in(State.PLAYING),\n ignore(Event.START_BUFFERING).in(State.PAUSE),\n ignore(Event.START_BUFFERING).in(State.REBUFFERING),\n ignore(Event.VIDEOSTART_TIMEOUT).in(State.PLAYING),\n ignore(Event.VIDEOSTART_TIMEOUT).in(State.PAUSE),\n ignore(Event.VIDEOSTART_TIMEOUT).in(State.SEEKING),\n ignore(Event.UNLOAD).in(State.READY),\n ignore(Event.UNLOAD).in(State.SEEKING),\n ignore(Event.VIDEO_CHANGE).in(State.QUALITY_CHANGE),\n ignore(Event.VIDEO_CHANGE).in(State.STARTUP),\n ignore(Event.VIDEO_CHANGE).in(State.REBUFFERING),\n ignore(Event.VIDEO_CHANGE).in(State.PAUSE),\n ignore(Event.VIDEO_CHANGE).in(State.ERROR),\n ignore(Event.VIDEO_CHANGE).in(State.EXIT_BEFORE_VIDEOSTARTUP),\n ignore(Event.VIDEO_CHANGE).in(State.READY),\n ignore(Event.VIDEO_CHANGE).in(State.SEEKING),\n // Seeking\n ignore(Event.SEEK).in(State.SEEKING),\n ignore(Event.SEEK).in(State.PAUSE),\n ignore(Event.SEEKED).in(State.PAUSE),\n ignore(Event.SEEK).in(State.QUALITY_CHANGE),\n ignore(Event.SEEKED).in(State.QUALITY_CHANGE),\n ignore(Event.SEEK).in(State.REBUFFERING),\n ignore(Event.SEEKED).in(State.REBUFFERING),\n ignore(Event.SEEK).in(State.ERROR),\n ignore(Event.SEEKED).in(State.ERROR),\n ignore(Event.SEEK).in(State.STARTUP),\n ignore(Event.SEEKED).in(State.STARTUP),\n ignore(Event.SEEK).in(State.READY),\n ignore(Event.SEEKED).in(State.READY),\n ignore(Event.SEEK).in(State.EXIT_BEFORE_VIDEOSTARTUP),\n ignore(Event.SEEKED).in(State.EXIT_BEFORE_VIDEOSTARTUP),\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 override sourceChange(config: AnalyticsConfig, timestamp: number, currentTime?: number | undefined): void {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\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_VIDEOSTARTUP]: {\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\ntype IgnoreInFn = (state: State) => StateMachineEventDef;\nconst ignore = (event: Event): {in: IgnoreInFn} => {\n const inFn: IgnoreInFn = (state: State) => {\n return {name: event, from: state, to: state};\n };\n const fn = {\n in: inFn,\n };\n return fn;\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/internal/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 {\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 type {AnalyticsConfig} 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 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 pageLoadTime = 0;\n playerStartupTime = 0;\n videoStartupTime = 0;\n autoplay: boolean | undefined = undefined;\n sample: Sample;\n backend!: Backend;\n errorDetailTrackingSettingsProvider: ErrorDetailTrackingSettingsProvider;\n get errorDetailSubscribable(): Subscribable<OnErrorDetailEventObject> {\n return this.onErrorDetailEventDispatcher;\n }\n\n private config: AnalyticsConfig;\n private sessionHandler: SessionPersistenceHandler;\n private droppedSampleFrames = 0;\n private startupTime = 0;\n private adapter!: InternalAdapterAPI;\n private backendFactory: BackendFactory;\n private featureManager = new FeatureManager<FeatureConfigContainer>();\n private onErrorDetailEventDispatcher = new EventDispatcher<OnErrorDetailEventObject>();\n private adAnalytics: AdAnalytics | undefined;\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 // 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 this.adapter = adapter;\n this.backendFactory = backendFactory;\n this.sessionHandler = new SessionPersistenceHandler(config);\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 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\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.validNumber(this.sample.videoTimeEnd)) {\n videoStartForClosedState = this.sample.videoTimeEnd;\n }\n }\n\n if (this.videoStartupTime > 0) {\n this.setVideoTimeStart(videoStartForClosedState);\n this.setVideoTimeEnd(videoStartForClosedState);\n this.clearValues();\n this.setState('closed');\n this.sendUnloadRequest();\n }\n };\n\n this.adapter.stateMachineCallbacks.heartbeat = (\n duration: number,\n state: string,\n sampleData: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>,\n ) => {\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 = duration;\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.validNumber(event.currentTime)) {\n this.setVideoTimeEnd(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent = (event: any) => {\n if (Utils.validNumber(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 newConfig = this.getMergedAnalyticsConfig(config);\n\n this.adapter.sourceChange(newConfig, Utils.getCurrentTimestamp());\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.validNumber(event.width)) {\n this.sample.videoPlaybackWidth = event.width;\n }\n if (Utils.validNumber(event.height)) {\n this.sample.videoPlaybackHeight = event.height;\n }\n if (Utils.validNumber(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.validNumber(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.validNumber(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.validNumber(info.videoWindowWidth)) {\n this.sample.videoWindowWidth = info.videoWindowWidth;\n }\n if (Utils.validNumber(info.videoWindowHeight)) {\n this.sample.videoWindowHeight = info.videoWindowHeight;\n }\n if (Utils.validNumber(info.screenHeight)) {\n this.sample.screenHeight = info.screenHeight;\n }\n if (Utils.validNumber(info.screenWidth)) {\n this.sample.screenWidth = info.screenWidth;\n }\n if (Utils.validNumber(info.videoPlaybackHeight)) {\n this.sample.videoPlaybackHeight = info.videoPlaybackHeight;\n }\n if (Utils.validNumber(info.videoPlaybackWidth)) {\n this.sample.videoPlaybackWidth = info.videoPlaybackWidth;\n }\n if (Utils.validNumber(info.videoBitrate)) {\n this.sample.videoBitrate = info.videoBitrate;\n }\n if (Utils.validNumber(info.audioBitrate)) {\n this.sample.audioBitrate = info.audioBitrate;\n }\n if (Utils.validBoolean(info.isMuted)) {\n this.sample.isMuted = info.isMuted;\n }\n if (Utils.validBoolean(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.validBoolean(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.validNumber(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.validBoolean(isLiveFromPlayback) ? isLiveFromPlayback : false;\n }\n\n getMergedCollectorConfig(newConfig: AnalyticsConfig | undefined, oldConfig = this.config) {\n let mergedCollectorConfig = (oldConfig || {}).config;\n if (newConfig != null) {\n mergedCollectorConfig = {...mergedCollectorConfig, enabled: true, ...newConfig.config};\n }\n return mergedCollectorConfig;\n }\n\n getMergedAnalyticsConfig(newConfig: AnalyticsConfig | undefined, oldConfig = this.config): AnalyticsConfig {\n const mergedCollectorConfig = this.getMergedCollectorConfig(newConfig, oldConfig);\n const mergedConfig = {\n ...oldConfig,\n ...newConfig,\n ...{config: mergedCollectorConfig},\n };\n return mergedConfig;\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.validBoolean(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 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 threshhold = Converter.bitsToBytes(300 * 1000 * 1000); // 300 Megabit per second in bytes\n if (measure.speed >= threshhold) {\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\nexport default class QualityChangeService {\n private qualityChangeCount = 0;\n private previousVideoBitrate = 0;\n private previousAudioBitrate = 0;\n private resetIntervalId?: number;\n\n constructor(private qualityChangeThreshold: number = ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD) {}\n\n resetValues() {\n this.qualityChangeCount = 0;\n this.previousAudioBitrate = 0;\n this.previousVideoBitrate = 0;\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 newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousVideoBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n setVideoBitrate(newBitrate: number): void {\n this.previousVideoBitrate = newBitrate;\n }\n\n shouldAllowAudioQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousAudioBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n setAudioBitrate(newBitrate: number): void {\n this.previousAudioBitrate = newBitrate;\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 {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport * as Utils from '../utils/Utils';\nimport {isEmpty} from '../utils/stringUtils';\n\nexport const BITMOVIN_ANALYTICS_UUID_COOKIE_NAME = 'bitmovin_analytics_uuid';\n\nexport class SessionPersistenceHandler {\n readonly userId: string;\n\n private readonly cookiesEnabled: boolean;\n private readonly cookiesDomain: string | null;\n\n constructor(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n this.cookiesEnabled = collectorConfig == null || collectorConfig.cookiesEnabled !== false;\n if (collectorConfig != null && collectorConfig.cookiesDomain != null) {\n this.cookiesDomain = collectorConfig.cookiesDomain;\n } else {\n this.cookiesDomain = null;\n }\n\n if (!this.cookiesEnabled) {\n this.ensureNoCookiePresent();\n }\n\n this.userId = this.setupUserId();\n }\n\n private setupUserId() {\n let userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (isEmpty(userId)) {\n userId = this.createAndSetNewUserId();\n }\n return userId;\n }\n\n private createAndSetNewUserId() {\n const generatedId = Utils.generateUUID();\n this.writeCookie(generatedId);\n return generatedId;\n }\n\n private ensureNoCookiePresent() {\n const userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (isEmpty(userId)) {\n return;\n }\n const cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n document.cookie = cookie;\n }\n\n private writeCookie(userId: string) {\n if (!this.cookiesEnabled) {\n return;\n }\n let cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=${userId}; path=/; expires=\"Mon, 31 Dec 2029 23:00:00 GMT\"; max-age=315400000`;\n\n if (this.cookiesDomain != null) {\n cookie += `; domain=${this.cookiesDomain}`;\n }\n\n document.cookie = cookie;\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/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 {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 {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 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: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => 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: any) => void;\n setVideoTimeStartFromEvent: (event: any) => void;\n videoStartFailed: (event: Readonly<VideoStartFailedEvent>, sendRequest: boolean) => void;\n source_changing: (duration: number, state: string, event: any) => 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, eventlisteners\n release: () => void;\n playlistTransition: (event: Readonly<AnalyticsEventBase>) => void;\n}\n\nexport const defaultStateMachineCallbacks: StateMachineCallbacks = {\n setup: (time: number, state: string) => void {},\n startup: (time: number, state: string) => void {},\n playing: (time: number, state: string) => void {},\n heartbeat: (time: number, state: string, payload: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => void {},\n qualitychange: (time: number, state: string) => void {},\n qualitychange_pause: (time: number, state: string) => void {},\n qualitychange_rebuffering: (time: number, state: string) => void {},\n videoChange: (event: any) => void {},\n audioChange: (event: any) => void {},\n audiotrack_changing: () => void {},\n pause: (time: number, state: string) => void {},\n paused_seeking: (time: number, state: string) => void {},\n end_play_seeking: (time: number, state: string) => void {},\n rebuffering: (time: number, state: string) => void {},\n error: (event: Readonly<ErrorEvent>) => void {},\n end: (time: number, state: string) => void {},\n unload: (time: number, state: string) => void {},\n ad: (time: number, state: string) => void {},\n mute: () => void {},\n unMute: () => void {},\n subtitle_changing: () => void {},\n setVideoTimeEndFromEvent: (event: any) => void {},\n setVideoTimeStartFromEvent: (event: any) => void {},\n videoStartFailed: (event: Readonly<VideoStartFailedEvent>, sendRequest: boolean) => void {},\n source_changing: (time: number, state: string, event: any) => void {},\n startCasting: (time: 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: (time: number, state: string, event: any) => void {},\n customdatachange: (time?: number, state?: string, event?: {values: CustomDataValues}) => void {},\n release: () => void {},\n playlistTransition: (event: Readonly<AnalyticsEventBase>) => void {},\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(msg: string, ...optionalParamters: any[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.log(msg, ...optionalParamters);\n }\n\n logTable(fields: any[]) {\n /* eslint-disable-next-line no-console */\n console.table(fields);\n }\n\n errorMessageToUser(msg: string, ...optionalParamters: any[]) {\n /* eslint-disable-next-line no-console */\n console.error(msg, ...optionalParamters);\n }\n\n error(msg: string | undefined, ...optionalParamters: any[]) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.error(msg, ...optionalParamters);\n }\n\n warning(msg: string) {\n if (!this.showLogs) {\n return;\n }\n\n /* eslint-disable-next-line no-console */\n console.warn(msg);\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 validBoolean = (bool: any): boolean => {\n return bool != null && typeof bool === 'boolean';\n};\n\nexport const validNumber = (num: any): boolean => {\n return num != null && typeof num === 'number';\n};\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 * 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\nexport const getCookie = (cname: string): string => {\n const name = cname + '=';\n const ca = document.cookie.split(';');\n for (let c of ca) {\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n }\n return '';\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 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/AmazonIVSAdapter';\nimport {Bitmovin8Adapter} from './adapters/Bitmovin8Adapter';\nimport {CAFv3Adapter} from './adapters/CAFv3Adapter';\nimport {DashjsAdapter} from './adapters/DashjsAdapter';\nimport {HTMLVideoElementAdapter} from './adapters/HTMLVideoElementAdapter';\nimport {HlsAdapter} from './adapters/HlsAdapter';\nimport {ShakaAdapter} from './adapters/ShakaAdapter';\nimport {VideojsAdapter} from './adapters/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","playerConfig","getConfig","analyticsConfig","playerKey","key","Bitmovin8InternalAdapter","Bitmovin8Adapter","CAFv3InternalAdapter","CAFv3Adapter","DashjsInternalAdapter","DashjsAdapter","HTMLVideoElementInternalAdapter","HTMLVideoElementAdapter","HlsInternalAdapter","HlsAdapter","ShakaInternalAdapter","Promise","resolve","reject","then","result","catch","eventObject","currentTime","code","message","JSON","stringify","category","severity","data","additionalData","eventCallback","Event","ERROR","ShakaAdapter","VideojsInternalAdapter","VideojsAdapter","eventDispatcher","EventDispatcher","playerExports","on","PlayerEvent","DownloadFinished","onDownloadFinished","subscribe","callback","unsubscribe","dispatch","httpRequest","downloadTime","calculateTimeWithUndefined","httpStatus","success","timestamp","getCurrentTimestamp","url","size","timeToFirstByte","type","mapHttpRequestType","downloadType","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","Bitmovin8HttpRequestTrackingAdapter","ViewMode","onBeforeUnLoadEvent","getPlayerVersion","version","getPlayerName","Player","BITMOVIN","getPlayerTech","getPlayerType","getDrmPerformanceInfo","drmPerformanceInfo","stateMachine","Bitmovin8AnalyticsStateMachine","stateMachineCallbacks","speedMeter","Bitmovin8SpeedMeterAdapter","DownloadSpeedMeter","getDownloadSpeedMeter","segmentTracker","Bitmovin8SegmentTrackerAdapter","SegmentTracker","getSegmentTracker","httpRequestTrackingAdapter","videoCompletionTracker","getInfo","getSegments","_adModule","getCurrentTime","isAdPlaying","warning","lastTrackedCurrentTime","currentAd","ads","getActiveAd","initialize","registerPlayerEventListeners","registerUnloadEventListeners","Bitmovin8AdModule","windowEventTracker","requestTracking","HttpRequestTracking","ErrorDetailTracking","errorDetailTrackingSettingsProvider","ErrorDetailBackend","collectorConfig","errorDetailSubscribable","clearValues","reset","clearSegments","getAutoPlay","playback","autoplay","getCurrentPlaybackInfo","info","getCommonPlaybackInfo","getViewMode","Fullscreen","PlayerSize","Window","playerTech","isLive","videoDuration","normalizeVideoDuration","streamFormat","getStreamType","videoWindowWidth","getContainer","offsetWidth","videoWindowHeight","offsetHeight","isMuted","isCasting","audioLanguage","getAudio","lang","subtitleEnabled","droppedFrames","getSource","getDroppedVideoFrames","applySubtitleProperties","applyPlaybackQualityProperties","applyCastingProperties","applySourceProperties","onError","SourceUnloaded","_event","SOURCE_UNLOADED","SourceLoaded","resetSourceRelatedState","getDuration","setVideoDuration","SOURCE_LOADED","CastStarted","START_CAST","CastStopped","END_CAST","Play","issuer","PLAY","Playing","PLAYING","Paused","PAUSE","TimeChanged","TIMECHANGED","Seek","allowSeeking","SEEK","Seeked","SEEKED","StallStarted","START_BUFFERING","StallEnded","END_BUFFERING","AudioPlaybackQualityChanged","quality","getPlaybackAudioData","qualityChangeService","shouldAllowAudioQualityChange","bitrate","setAudioBitrate","AUDIO_CHANGE","codec","VideoPlaybackQualityChanged","getPlaybackVideoData","shouldAllowVideoQualityChange","setVideoBitrate","VIDEO_CHANGE","width","height","ViewModeChanged","START_FULLSCREEN","END_FULLSCREEN","AdStarted","START_AD","AdFinished","END_AD","AdSkipped","AdError","Muted","MUTE","Unmuted","UN_MUTE","legacyData","ErrorCode","BITMOVIN_PLAYER_LICENSING_ERROR","SETUP_MISSING_LICENSE_WHITELIST","_onLicenseCallFailed","PlaybackFinished","END","drmType","replace","drmLoadTime","AudioChanged","AUDIOTRACK_CHANGED","SubtitleEnabled","SUBTITLE_CHANGE","SubtitleDisabled","LicenseValidated","_onLicenseKeyReceived","licenseKey","handleCollectorUnload","UNLOAD","release","bind","Destroy","addEventListener","source","videoTitle","title","mpdUrl","dash","hls","progSourceInfo","getSourceInfoFromBitmovinSourceConfig","progressive","progUrl","videoBitrate","progBitrate","enabledSubtitle","subtitles","list","find","s","enabled","subtitleLanguage","videoQuality","videoPlaybackHeight","videoPlaybackWidth","videoCodec","audioQuality","audioBitrate","audioCodec","isAirplayActive","castTech","CastTech","AirPlay","remoteControlConfig","remotecontrol","GoogleCast","WebSocket","seekEvent","Math","abs","position","seekTarget","AnalyticsSettings","ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD","InternalAdapter","handleSegmentPlaybackEvent","removeSegment","handleOnDownloadFinishEvent","SegmentPlayback","segment","Utils","getURLResourceName","addSegment","meter","addMeasurement","duration","Date","context","CHROMECAST_SHAKA","currentItem","HTML5AnalyticsStateMachine","playerManager","getPlayerManager","isSeeking","register","window","cast","framework","getCurrentTimeSec","stats","getStats","getIsLive","mediaInformation","activeAudioTrack","trackContentType","language","activeTextTracks","t","join","SETUP","audioTracksManager","getAudioTracksManager","getActiveTrack","textTracksManager","getTextTracksManager","getActiveTracks","queueManager","getQueueManager","getCurrentItem","media","READY","currentMediaTime","onPaused","errorData","detailedErrorCode","reason","isBuffering","PLAYLIST_TRANSITION","streamType","getLiveSeekableRange","mediaPlayer","DASHJS","getVersion","videoEl","getVideoElement","setMediaElement","registerMediaElementEventsForDashJS","mediaElement","listenToMediaElementEvent","needsFirstPlayIntent","getMIMEType","MIMETypes","DASH","getStreamURL","toString","getCurrentQualityLevelInfo","currentVideoQuality","getBitrateInfoListFor","getQualityFor","HTML5InternalAdapter","previousMutedValue","HTML5","Infinity","initializeStateMachine","mediaElEventHandlers","bufferingTimeout","lastIsLiveStatus","isPaused","previousMediaTime","previousClientTime","needsReadyEvent","mediaElementSet","playerStatisticsProvider","registerWindowEvents","getStreamSources","isVideoInFullscreen","getDroppedFrames","muted","qualityInfo","unregisterMediaElement","registerMediaElement","onMaybeReady","streamUrl","getMIMETypeFromFileExtension","mimetype","getStreamTypeFromMIMEType","src","resetMedia","clearTimeout","wrapMediaElementLoad","readyState","checkQualityLevelAttributes","volume","isAudioMuted","checkSeeking","checkPlayheadProgress","onBuffering","handler","boundHandler","forEach","item","removeEventListener","onPageClose","paused","setTimeout","ended","BUFFERING_TIMECHANGED_TIMEOUT","silent","qualityLevelInfo","eventData","getSelectedSubtitleFromMediaElement","textTracks","attr","mode","isSubtitleDisplayed","callEvent","currentVideoTime","mediaTimeDif","clientTimeDif","browserInfo","getBrowserInfo","currentSrc","videoWidth","videoHeight","HLSJS","constructor","levels","currentLevel","currentLevelObj","details","live","onDestroying","HlsSpeedMeterAdapter","registerHlsEvents","HLS","onMediaAttaching","onMediaDetaching","onManifestLoading","onAudioTrackSwitched","onSubtitleLanguageSwitched","onHlsError","selectedSubtitle","getSelectedSubtitleLanguage","getSelectedAudioLanguage","errorName","fatal","errorMessage","getErrorCodeFromHlsErrorType","audioTrack","audioTracks","subtitleDisplay","subtitleTrack","subtitleTracks","subtitleTrackController","Events","FRAG_LOADED","eventName","handleFragmentLoadedEvent","frag","loadingDuration","loading","end","start","first","measurement","total","networkDetails","status","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","getMediaElement","SHAKA","onUnloading","videoElement","getAssetUri","activeVideoTrack","getVariantTracks","filter","track","active","videoId","videoBandwidth","bandwidth","_subtitleInfo","previousTime","videojs","VIDEOJS","VideojsAnalyticsStateMachine","mimeType","currentType","selectedAudioLanguage","getSelectedAudioTrackLanguage","codecInfo","getCodecInfo","tech","IWillNotUseThisInPlugins","isFullscreen","that","MANUAL_SOURCE_CHANGE","ready","getSubtitleInfo","seeking","newSubtitleInfo","hasInfoChanged","isDifferentSubtitleInfo","newSelectedAudioLanguage","vhs","mediaAttributes","getMediaAttributes","handlePageClose","sourceHandler","playlists","selectedPlaylist","attributes","BANDWIDTH","RESOLUTION","codecs","CODECS","split","CodecHelper","isVideoCodec","isAudioCodec","onAdStarted","onAdFinished","onAdBreakStarted","onAdBreakFinished","onAdClicked","onAdError","onAdManifestLoaded","onAdQuartile","onAdSkipped","onPlay","onPause","onBeforeUnload","AdCallbacks","adCallbacks","isLinearAdActive","getAdModuleInfo","getModuleInfo","AdBreakStarted","AdBreakFinished","AdClicked","AdQuartile","AdManifestLoaded","supportsDeferredLicenseLoading","AMAZON_IVS","isAutoplay","playerContext","AmazonIVSPlayerContext","heartbeatService","HeartbeatService","AmazonIVSStateMachine","setListener","listener","AmazonIVSPlayerEventListener","getHTMLVideoElement","windowEventListener","WindowEventListener","startMonitoring","RELEASE","getPosition","clientWidth","clientHeight","getQuality","getVideoAndAudioCodecs","StreamTypes","dispatcher","payload","errorEvent","exceptionMessage","exceptionStacktrace","ErrorService","State","EVENT_DELAY_MS","IDLE","cancelPause","PAUSE_SCHEDULED","PAUSE_CANCELLED","schedulePauseEvent","triggerPause","PauseEventDispatcher","pauseDispatcher","ignorePause","onStartupPlaying","onPlaying","playing","onRebuffering","startBuffering","onQualityChange","qualityChange","onSeek","seek","onSeeked","seeked","PlaybackService","StartupState","STARTUP_FINISHED","onInitialized","finishSetup","startStartup","finishStartup","STARTUP","VideoStartupService","videoStartupService","playbackService","errorService","onDurationChanged","finishedStartup","onQualityChanged","onTimeUpdate","AmazonIVSPlayerEventHandler","IVS_PLAYER_EVENT","DURATION_CHANGED","INITIALIZED","QUALITY_CHANGED","REBUFFERING","SEEK_COMPLETED","TIME_UPDATE","PLAYBACK_RATE_CHANGED","PLAYBACK_BLOCKED","eventHandler","startMonitoringIVSPlayer","startMonitoringHTMLVideoElement","video","COLLECTOR_EVENTS","observer","trigger","eventBus","CollectorEventBus","CollectorEvents","onPageUnload","UNLOADED","previousTotalDroppedFrames","getVideoPlaybackQuality","droppedVideoFrames","currentDroppedFrames","REBUFFERING_HEARTBEAT_INTERVALS","onEnterStateTimestamp","videoStartupTimeoutMs","Settings","ANALYTICS_VIDEOSTART_TIMEOUT","rebufferTimeoutMs","ANALYTICS_REBUFFER_TIMEOUT","currentRebufferingIntervalIndex","createStateMachine","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","errorCode","SOURCE_CHANGING","INITIAL_SOURCE_CHANGE","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","videoChange","audioChange","mute","unMute","onseek","onseeked","ontimechanged","played","onplayerError","exec","EventDebugging","getStates","setEnabledDebugging","seekStartedAt","PAUSED_SEEKING","AD","playlistTransition","fnName","pause","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","paused_seeking","getStateHandler","startup","startHeartbeat","stopHeartbeat","rebuffering","EXIT_BEFORE_VIDEOSTARTUP","failedEvent","isErrorEvent","shouldSendVideoStartupSample","QUALITY_CHANGE","qualitychange","SEEKING","ignore","in","onHeartbeat","heartbeatIntervalMs","heartbeatInterval","clearHeartbeat","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","videoStartupTime","droppedSampleFrames","startupTime","featureManager","FeatureManager","onErrorDetailEventDispatcher","authenticationCallback","authenticationCompleted","featureConfigs","configureFeatures","guardAgainstMissingVideoTitle","oldConfig","newConfig","guardAgainstMissingIsLive","getMergedAnalyticsConfig","setState","changeCustomData","sendAnalyticsRequestAndClearValues","setConfigParameters","impressionId","sessionHandler","userId","input","retVal","customDataValuesKeys","buildDefaultAnalyticsConfigValues","domain","getDomain","SessionPersistenceHandler","licenseKeyReceivedUnsubscriber","onLicenseKeyReceived","eventArgs","setupSample","init","setupStateMachineCallbacks","features","registerFeatures","adAnalytics","checkForErrorsInConfig","getPlayerInformationFromAdapter","isValidString","isBlank","setLogging","debug","resetFeatures","createBackend","generateNewImpressionId","setUserId","resetValues","NoOpBackend","stopResetInterval","getDomainFromConfig","sanitizePath","location","hostname","deviceInformation","createDeviceInformationFromConfig","cdnProvider","customUserId","transferCustomDataFields","experimentName","setDuration","performance","timing","loadTime","navigationStart","supportedVideoCodecs","supportedVideoFormats","drmPerformance","setCompletionValues","videoStartForClosedState","videoTimeStart","sendUnloadRequest","validNumber","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","sampleData","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","setPlaybackVideoPropertiesFromEvent","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","sendRequest","videoStartFailedReason","segmentNames","segments","errorSegments","subtitle_changing","setPlaybackInfoFromAdapter","getIsLiveFromConfigOrPlaybackInfo","validBoolean","platform","path","pathname","navigator","userLanguage","userAgent","completedTotal","downloadSpeedInfo","copySample","sendAnalyticsRequestSynchronous","sendRequestSynchronous","isLiveFromPlayback","getMergedCollectorConfig","mergedCollectorConfig","origin","addWatched","getCompletionPercentage","Number","isNaN","value","startResetInterval","increaseCounter","isQualityChangeEventEnabled","QUALITY_CHANGE_THRESHOLD_EXCEEDED","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","threshhold","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","newBitrate","resetIntervalId","resetCounter","ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL","queue","unloadQueue","syncQueue","adQueue","hasAdModule","analyticsCall","AnalyticsCall","sequenceNumber","updateSampleBeforeSending","BITMOVIN_ANALYTICS_UUID_COOKIE_NAME","cookiesEnabled","cookiesDomain","ensureNoCookiePresent","setupUserId","getCookie","isEmpty","createAndSetNewUserId","generatedId","writeCookie","cookie","document","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","_config","_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","source_changing","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","optionalParamters","table","warn","str","Logger","_items","poll","maxElements","MESSAGE_NAMESPACE","bool","num","now","c","r","random","cname","charAt","substring","getCustomDataString","customData","fromConfig","toConfig","CustomDataUtils","customDataField","getDocumentPropWithPrefix","prop","pascalCase","toUpperCase","prefix","fullscreenProp","nodeName","getHiddenProp","hiddenProp","BACKGROUND","FOREGROUND","domElement","createElement","href","numerator","denominator","tem","ua","M","test","appName","appVersion","pop","prev","threshold","inViewport","options","rootMargin","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","_observer","intersectionRatio","trackedObjects","obj","trim","suffix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","adapters"],"sourceRoot":""}