bitmovin-analytics 2.29.3 → 2.29.4
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/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/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/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/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/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/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 {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: Parameters<typeof player.load>): Promise<void> => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n try {\n await originalLoad.apply(player, args);\n } catch (error) {\n this.sendError(error);\n reject(error);\n }\n resolve();\n });\n };\n }\n\n private sendError(error): void {\n (this.internalAdapter as ShakaInternalAdapter).eventCallback(Event.ERROR, {\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}\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} 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: this.videoDuration ? this.videoDuration : 0,\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.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.setPreviousAudioBitrate(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.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.setPreviousVideoBitrate(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} 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: this.mediaInformation ? this.mediaInformation.duration : undefined,\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(null, 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} 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';\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\n constructor(protected mediaElement: HTMLVideoElement | null, 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 }\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: 0, // TODO: Implement `droppedFrames`\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: 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 = null;\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.shouldAllowVideoQualityChange(bitrate)) {\n this.setPreviousVideoBitrate(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(null, 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 {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 {ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD} from '../../utils/Settings';\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 protected stateMachine!: AnalyticsStateMachine;\n\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 previousVideoBitrate = 0;\n protected previousAudioBitrate = 0;\n protected qualityChangeCount = 0;\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 increaseQualityChangeCount(): void {\n this.qualityChangeCount++;\n }\n\n resetQualityChangeCount(): void {\n this.qualityChangeCount = 0;\n }\n\n resetSourceRelatedState(): void {\n this.drmPerformanceInfo = undefined;\n }\n\n isQualityChangeEventEnabled(): boolean {\n return this.qualityChangeCount <= ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD;\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 shouldAllowVideoQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousVideoBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousVideoBitrate(newBitrate: number): void {\n this.previousVideoBitrate = newBitrate;\n }\n\n protected shouldAllowAudioQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousAudioBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousAudioBitrate(newBitrate: number): void {\n this.previousAudioBitrate = newBitrate;\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} 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: 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.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.setPreviousVideoBitrate(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 {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 protected 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 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.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, fnName);\n }\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\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.ERROR) {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n try {\n callbackFunction(stateDuration, fnName, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + fnName, eventObject, e);\n }\n } else {\n logger.error('Could not find callback function for ' + fnName);\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 {\n Ad,\n AdBreak,\n AdBreakEvent,\n AdClickedEvent,\n AdEvent,\n AdManifestLoadedEvent,\n AdQuartileEvent,\n AdTagConfig,\n ErrorEvent,\n} from 'bitmovin-player';\n\nimport {AdModuleAPI} from '../adapters/internal/ads/AdModuleAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\nimport {ViewportTracker} from '../utils/ViewportTracker';\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 Settings from '../utils/Settings';\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 resetQualityChangeCountIntervalId?: number;\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 this.clearResetQualityChangeInterval();\n this.adapter.resetQualityChangeCount();\n }\n\n release() {\n this.backend = new NoOpBackend();\n this.adAnalytics?.release();\n this.clearResetQualityChangeInterval();\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.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 if (this.resetQualityChangeCountIntervalId == null) {\n this.resetQualityChangeCountIntervalId = window.setInterval(() => {\n this.adapter.resetQualityChangeCount();\n }, Settings.ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL);\n }\n\n this.adapter.increaseQualityChangeCount();\n if (!this.adapter.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 private clearResetQualityChangeInterval() {\n if (this.resetQualityChangeCountIntervalId != null) {\n window.clearInterval(this.resetQualityChangeCountIntervalId);\n delete this.resetQualityChangeCountIntervalId;\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 {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 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 * 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 {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 {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';\n\nconst AnalyticsPlayerModule = {\n name: 'analytics',\n module: {\n Analytics: Bitmovin8Adapter,\n },\n hooks: {\n setup: (module: any, player: any) => {\n const config = player.getConfig();\n if (!config || config.analytics === false) {\n return Promise.resolve();\n }\n const analyticsModule = module.Analytics;\n const analyticsModuleInstance = new analyticsModule(player);\n return Promise.resolve(analyticsModuleInstance);\n },\n },\n};\n\nexport type {AnalyticsConfig} from './types/AnalyticsConfig';\nexport {Player as Players};\nexport {CdnProvider as CdnProviders};\nexport {AnalyticsPlayerModule as PlayerModule};\nexport {VERSION as version};\nexport {HlsAdapter};\nexport {Bitmovin8Adapter};\nexport {VideojsAdapter};\nexport {CAFv3Adapter};\nexport {ShakaAdapter};\nexport {DashjsAdapter};\nexport {HTMLVideoElementAdapter};\n\nconst adapters = {\n HlsAdapter,\n Bitmovin8Adapter,\n VideojsAdapter,\n ShakaAdapter,\n DashjsAdapter,\n CAFv3Adapter,\n HTMLVideoElementAdapter,\n};\nexport {adapters};\n\nexport default {\n PlayerModule: AnalyticsPlayerModule,\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","playerConfig","getConfig","analyticsConfig","playerKey","key","Bitmovin8InternalAdapter","Analytics","wrapPlayerLoad","originalLoad","load","Bitmovin8Adapter","CAFv3InternalAdapter","CAFv3Adapter","DashjsInternalAdapter","DashjsAdapter","HTMLVideoElementInternalAdapter","HTMLVideoElementAdapter","HlsInternalAdapter","HlsAdapter","ShakaInternalAdapter","Promise","resolve","reject","sendError","eventCallback","Event","ERROR","currentTime","code","message","JSON","stringify","category","severity","data","additionalData","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","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","shouldAllowAudioQualityChange","bitrate","setPreviousAudioBitrate","AUDIO_CHANGE","codec","VideoPlaybackQualityChanged","getPlaybackVideoData","shouldAllowVideoQualityChange","setPreviousVideoBitrate","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","m3u8Url","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","registerWindowEvents","getStreamSources","isVideoInFullscreen","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","previousVideoBitrate","previousAudioBitrate","qualityChangeCount","_windowEventTracker","WindowEventTracker","eventType","eventObject","starttime","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","screenHeight","screen","screenWidth","increaseQualityChangeCount","resetQualityChangeCount","isQualityChangeEventEnabled","ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD","previousState","currentState","customdatachange","CUSTOM_DATA_CHANGE","newBitrate","isNaN","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","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","State","debuggingStates","enabledDebugging","seekTimestamp","seekedTimestamp","seekStarted","seekEnded","getAllStatesBut","getAllStates","i","errorCode","SOURCE_CHANGING","INITIAL_SOURCE_CHANGE","STARTUP","AD_STARTUP","EXIT_BEFORE_VIDEOSTART","REBUFFERING","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","fnName","String","shouldSendSample","videoStartFailed","seekDuration","end_play_seeking","unload","ad","noOp","callbackFunction","videoChange","audioChange","mute","unMute","onseek","onseeked","ontimechanged","played","onplayerError","exec","EventDebugging","getStates","setEnabledDebugging","seekStartedAt","INITIALIZED","PAUSED_SEEKING","AD","playlistTransition","pause","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","paused_seeking","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","supportsDeferredLicenseLoading","validString","setLogging","debug","resetFeatures","createBackend","generateNewImpressionId","setUserId","clearResetQualityChangeInterval","NoOpBackend","getDomainFromConfig","sanitizePath","location","hostname","cdnProvider","customUserId","transferCustomDataFields","experimentName","setup","setDuration","performance","timing","loadTime","navigationStart","startup","supportedVideoCodecs","supportedVideoFormats","drmPerformance","playing","setCompletionValues","videoStartForClosedState","videoTimeStart","sendUnloadRequest","validNumber","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","sampleData","qualitychange","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","setPlaybackVideoPropertiesFromEvent","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","seeked","rebuffering","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","value","resetQualityChangeCountIntervalId","ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL","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","then","result","Granted","remoteBackend","RemoteBackend","flushTo","catch","err","response","next","isPlayedAboveThreshold","download","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","exceptionMessage","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","exceptionStacktrace","subscribable","numberOfHttpRequests","errorDetails","_maxRequests","DEFAULT_MAX_REQUESTS","_httpRequestQueue","Queue","onDownloadFinishedHandler","addRequest","items","limit","offer","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","payload","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","observer","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","_observer","intersectionRatio","trackedObjects","obj","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","AnalyticsPlayerModule","hooks","analyticsModuleInstance","analyticsModule","PlayerModule","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/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/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/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/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/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 {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: Parameters<typeof player.load>): Promise<void> => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n try {\n await originalLoad.apply(player, args);\n } catch (error) {\n this.sendError(error);\n reject(error);\n }\n resolve();\n });\n };\n }\n\n private sendError(error): void {\n (this.internalAdapter as ShakaInternalAdapter).eventCallback(Event.ERROR, {\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}\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.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.setPreviousAudioBitrate(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.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.setPreviousVideoBitrate(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(null, 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';\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\n constructor(protected mediaElement: HTMLVideoElement | null, 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 }\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: 0, // TODO: Implement `droppedFrames`\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 = null;\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.shouldAllowVideoQualityChange(bitrate)) {\n this.setPreviousVideoBitrate(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(null, 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 {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 {ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD} from '../../utils/Settings';\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 protected stateMachine!: AnalyticsStateMachine;\n\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 previousVideoBitrate = 0;\n protected previousAudioBitrate = 0;\n protected qualityChangeCount = 0;\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 increaseQualityChangeCount(): void {\n this.qualityChangeCount++;\n }\n\n resetQualityChangeCount(): void {\n this.qualityChangeCount = 0;\n }\n\n resetSourceRelatedState(): void {\n this.drmPerformanceInfo = undefined;\n }\n\n isQualityChangeEventEnabled(): boolean {\n return this.qualityChangeCount <= ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD;\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 shouldAllowVideoQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousVideoBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousVideoBitrate(newBitrate: number): void {\n this.previousVideoBitrate = newBitrate;\n }\n\n protected shouldAllowAudioQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousAudioBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousAudioBitrate(newBitrate: number): void {\n this.previousAudioBitrate = newBitrate;\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.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.setPreviousVideoBitrate(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 {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 protected 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 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.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, fnName);\n }\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\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.ERROR) {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n try {\n callbackFunction(stateDuration, fnName, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + fnName, eventObject, e);\n }\n } else {\n logger.error('Could not find callback function for ' + fnName);\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 {\n Ad,\n AdBreak,\n AdBreakEvent,\n AdClickedEvent,\n AdEvent,\n AdManifestLoadedEvent,\n AdQuartileEvent,\n AdTagConfig,\n ErrorEvent,\n} from 'bitmovin-player';\n\nimport {AdModuleAPI} from '../adapters/internal/ads/AdModuleAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\nimport {ViewportTracker} from '../utils/ViewportTracker';\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 Settings from '../utils/Settings';\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 resetQualityChangeCountIntervalId?: number;\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 this.clearResetQualityChangeInterval();\n this.adapter.resetQualityChangeCount();\n }\n\n release() {\n this.backend = new NoOpBackend();\n this.adAnalytics?.release();\n this.clearResetQualityChangeInterval();\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.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 if (this.resetQualityChangeCountIntervalId == null) {\n this.resetQualityChangeCountIntervalId = window.setInterval(() => {\n this.adapter.resetQualityChangeCount();\n }, Settings.ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL);\n }\n\n this.adapter.increaseQualityChangeCount();\n if (!this.adapter.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 private clearResetQualityChangeInterval() {\n if (this.resetQualityChangeCountIntervalId != null) {\n window.clearInterval(this.resetQualityChangeCountIntervalId);\n delete this.resetQualityChangeCountIntervalId;\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 {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 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 * 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 {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';\n\nconst AnalyticsPlayerModule = {\n name: 'analytics',\n module: {\n Analytics: Bitmovin8Adapter,\n },\n hooks: {\n setup: (module: any, player: any) => {\n const config = player.getConfig();\n if (!config || config.analytics === false) {\n return Promise.resolve();\n }\n const analyticsModule = module.Analytics;\n const analyticsModuleInstance = new analyticsModule(player);\n return Promise.resolve(analyticsModuleInstance);\n },\n },\n};\n\nexport type {AnalyticsConfig} from './types/AnalyticsConfig';\nexport {Player as Players};\nexport {CdnProvider as CdnProviders};\nexport {AnalyticsPlayerModule as PlayerModule};\nexport {VERSION as version};\nexport {HlsAdapter};\nexport {Bitmovin8Adapter};\nexport {VideojsAdapter};\nexport {CAFv3Adapter};\nexport {ShakaAdapter};\nexport {DashjsAdapter};\nexport {HTMLVideoElementAdapter};\n\nconst adapters = {\n HlsAdapter,\n Bitmovin8Adapter,\n VideojsAdapter,\n ShakaAdapter,\n DashjsAdapter,\n CAFv3Adapter,\n HTMLVideoElementAdapter,\n};\nexport {adapters};\n\nexport default {\n PlayerModule: AnalyticsPlayerModule,\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","playerConfig","getConfig","analyticsConfig","playerKey","key","Bitmovin8InternalAdapter","Analytics","wrapPlayerLoad","originalLoad","load","Bitmovin8Adapter","CAFv3InternalAdapter","CAFv3Adapter","DashjsInternalAdapter","DashjsAdapter","HTMLVideoElementInternalAdapter","HTMLVideoElementAdapter","HlsInternalAdapter","HlsAdapter","ShakaInternalAdapter","Promise","resolve","reject","sendError","eventCallback","Event","ERROR","currentTime","code","message","JSON","stringify","category","severity","data","additionalData","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","shouldAllowAudioQualityChange","bitrate","setPreviousAudioBitrate","AUDIO_CHANGE","codec","VideoPlaybackQualityChanged","getPlaybackVideoData","shouldAllowVideoQualityChange","setPreviousVideoBitrate","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","m3u8Url","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","registerWindowEvents","getStreamSources","isVideoInFullscreen","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","previousVideoBitrate","previousAudioBitrate","qualityChangeCount","_windowEventTracker","WindowEventTracker","eventType","eventObject","starttime","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","screenHeight","screen","screenWidth","increaseQualityChangeCount","resetQualityChangeCount","isQualityChangeEventEnabled","ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD","previousState","currentState","customdatachange","CUSTOM_DATA_CHANGE","newBitrate","isNaN","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","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","State","debuggingStates","enabledDebugging","seekTimestamp","seekedTimestamp","seekStarted","seekEnded","getAllStatesBut","getAllStates","i","errorCode","SOURCE_CHANGING","INITIAL_SOURCE_CHANGE","STARTUP","AD_STARTUP","EXIT_BEFORE_VIDEOSTART","REBUFFERING","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","fnName","String","shouldSendSample","videoStartFailed","seekDuration","end_play_seeking","unload","ad","noOp","callbackFunction","videoChange","audioChange","mute","unMute","onseek","onseeked","ontimechanged","played","onplayerError","exec","EventDebugging","getStates","setEnabledDebugging","seekStartedAt","INITIALIZED","PAUSED_SEEKING","AD","playlistTransition","pause","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","paused_seeking","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","supportsDeferredLicenseLoading","validString","setLogging","debug","resetFeatures","createBackend","generateNewImpressionId","setUserId","clearResetQualityChangeInterval","NoOpBackend","getDomainFromConfig","sanitizePath","location","hostname","cdnProvider","customUserId","transferCustomDataFields","experimentName","setup","setDuration","performance","timing","loadTime","navigationStart","startup","supportedVideoCodecs","supportedVideoFormats","drmPerformance","playing","setCompletionValues","videoStartForClosedState","videoTimeStart","sendUnloadRequest","validNumber","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","sampleData","qualitychange","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","setPlaybackVideoPropertiesFromEvent","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","seeked","rebuffering","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","value","resetQualityChangeCountIntervalId","ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL","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","then","result","Granted","remoteBackend","RemoteBackend","flushTo","catch","err","response","next","isPlayedAboveThreshold","download","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","exceptionMessage","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","exceptionStacktrace","subscribable","numberOfHttpRequests","errorDetails","_maxRequests","DEFAULT_MAX_REQUESTS","_httpRequestQueue","Queue","onDownloadFinishedHandler","addRequest","items","limit","offer","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","payload","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","observer","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","_observer","intersectionRatio","trackedObjects","obj","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","AnalyticsPlayerModule","hooks","analyticsModuleInstance","analyticsModule","PlayerModule","adapters"],"sourceRoot":""}
|