diff --git a/dist/playkit-analytics-service.js b/dist/playkit-analytics-service.js index c0f037b2..e626c525 100644 --- a/dist/playkit-analytics-service.js +++ b/dist/playkit-analytics-service.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.analytics=t():(e.playkit=e.playkit||{},e.playkit.services=e.playkit.services||{},e.playkit.services.analytics=t())}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=9)}([function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(2);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function e(t,r,n,o){void 0===o&&(o={}),this.severity=t,this.category=r,this.code=n,this.data=o,e._logger.error("Category:"+r+" | Code:"+n+" |",o)};o(a,"Severity",{RECOVERABLE:1,CRITICAL:2}),o(a,"Category",{NETWORK:1,SERVICE:2,PROVIDER:3}),o(a,"Code",{UNSUPPORTED_SCHEME:1e3,BAD_HTTP_STATUS:1001,HTTP_ERROR:1002,TIMEOUT:1003,MALFORMED_DATA_URI:1004,BAD_SERVER_RESPONSE:1005,MULTIREQUEST_API_ERROR:1006,API_RESPONSE_MISMATCH:1007,ERROR:2e3,BLOCK_ACTION:2001,MEDIA_STATUS_NOT_READY:2002,MISSING_MANDATORY_PARAMS:3e3,MISSING_PLAY_SOURCE:3001,METHOD_NOT_IMPLEMENTED:3002}),o(a,"_logger",Object(n.a)("Error"))},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(0);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(e){void 0===e&&(e=new Map),o(this,"retryConfig",{async:!0,timeout:0,maxAttempts:4}),o(this,"_attemptCounter",1),this.headers=e}var t=e.prototype;return t.getUrl=function(e){return e+"/service/"+this.service+(this.action?"/action/"+this.action:"")},t.doHttpRequest=function(){var e=this,t=new Promise((function(t,r){e._requestPromise={resolve:t,reject:r}}));return this.url||this._requestPromise.reject(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.MALFORMED_DATA_URI,{url:this.url})),this._createXHR(),t},t._createXHR=function(){var e=this,t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status)try{var r=JSON.parse(t.responseText);return e.responseHeaders=e._getResponseHeaders(t),e._requestPromise.resolve(r)}catch(r){e._requestPromise.reject(e._createError(t,n.a.Code.BAD_SERVER_RESPONSE,{text:t.responseText}))}},t.open(this.method,this.url,this.retryConfig.async),this.retryConfig.async&&this.retryConfig.timeout&&(t.timeout=this.retryConfig.timeout);var r=performance.now();t.ontimeout=function(){e._handleError(t,n.a.Code.TIMEOUT,{timeout:(performance.now()-r)/1e3,statusText:t.statusText})},t.onerror=t.onabort=function(){e._handleError(t,n.a.Code.HTTP_ERROR,{text:t.responseText,statusText:t.statusText})},this.headers.forEach((function(e,r){t.setRequestHeader(r,e)})),t.send(this.params)},t._getResponseHeaders=function(e){return e.getAllResponseHeaders().split("\n").filter((function(e){return 0===e.toLowerCase().indexOf("x-")}))},t._handleError=function(e,t,r){var n=this._createError(e,t,r);if(e.onreadystatechange=function(){},e.onerror=function(){},e.ontimeout=function(){},e.onabort=function(){},!(this.retryConfig.maxAttempts&&this._attemptCounter0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return f}));var n=r(1),o=r(2);var a=function(e){var t,r,n;n=!1,(r="hasError")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,"KalturaAPIException"===e.objectType?(this.hasError=!0,this.error=new i(e.code,e.message)):e.error&&"KalturaAPIException"===e.error.objectType?(this.hasError=!0,this.error=new i(e.error.code,e.error.message)):this.data=e},i=function(e,t){this.code=e,this.message=t},s=r(0);function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),o=0;o0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return f}));var n=r(1),o=r(2);var a=function(e){var t,r,n;n=!1,(r="hasError")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,"KalturaAPIException"===e.objectType?(this.hasError=!0,this.error=new i(e.code,e.message)):e.error&&"KalturaAPIException"===e.error.objectType?(this.hasError=!0,this.error=new i(e.error.code,e.error.message)):this.data=e},i=function(e,t){this.code=e,this.message=t},s=r(0);function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),o=0;o}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = this.results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.results = results;\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","const param = a => {\n let s = [],\n rbracket = /\\[\\]$/,\n isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n },\n add = function (k, v) {\n v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;\n s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);\n },\n buildParams = function (prefix, obj) {\n let i, len, key;\n\n if (prefix) {\n if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n if (rbracket.test(prefix)) {\n add(prefix, obj[i]);\n } else {\n buildParams(prefix + ':' + (typeof obj[i] === 'object' ? i : ''), obj[i]);\n }\n }\n } else if (obj && String(obj) === '[object Object]') {\n for (key in obj) {\n buildParams(prefix + ':' + key, obj[key]);\n }\n } else {\n add(prefix, obj);\n }\n } else if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n add(obj[i].name, obj[i].value);\n }\n } else {\n for (key in obj) {\n buildParams(key, obj[key]);\n }\n }\n return s;\n };\n\n return buildParams('', a).join('&').replace(/%20/g, '+');\n};\n\nexport {param};\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nimport OVPService from '../ovp-service';\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport {param} from '../../../../util/param';\n\nconst SERVICE_NAME: string = 'analytics';\n\nexport default class OVPAnalyticsService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for analytics.trackEvent\n * @function trackEvent\n * @param {string} serviceUrl - The service base url\n * @param {Object} params - The event params\n * @param {string} [requestMethod] - The request method GET or POST\n * @returns {RequestBuilder} - The request builder\n * @static\n */\n static trackEvent(serviceUrl: string, params: Object, requestMethod: ?string): RequestBuilder {\n return requestMethod === 'POST'\n ? OVPAnalyticsService._trackEventByPOST(serviceUrl, params)\n : OVPAnalyticsService._trackEventByGET(serviceUrl, params);\n }\n\n static _trackEventByGET(serviceUrl: string, params: Object): RequestBuilder {\n const ovpParams = OVPConfiguration.get();\n const serviceParams = {};\n Object.assign(serviceParams, ovpParams.serviceParams, params);\n const request = new RequestBuilder();\n request.service = SERVICE_NAME;\n request.action = 'trackEvent';\n request.method = 'GET';\n request.tag = 'analytics-trackEvent';\n request.params = serviceParams;\n request.url = serviceUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(request.params);\n return request;\n }\n\n static _trackEventByPOST(serviceUrl: string, params: Object): RequestBuilder {\n const ovpParams = OVPConfiguration.get();\n const serviceParams = {};\n Object.assign(serviceParams, ovpParams.serviceParams, params);\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n const {eventType, partnerId, entryId, sessionId} = serviceParams;\n const urlParams = {eventType, partnerId, entryId, sessionId};\n ['eventType', 'partnerId', 'entryId', 'sessionId'].forEach(key => delete serviceParams[key]);\n request.service = SERVICE_NAME;\n request.action = 'trackEvent';\n request.method = 'POST';\n request.tag = 'analytics-trackEvent';\n request.params = JSON.stringify(serviceParams);\n request.url = serviceUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(urlParams);\n return request;\n }\n}\n","// @flow\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport OVPAnalyticsService from './analytics-service';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-analytics-service';\nconst VERSION = __VERSION__;\n\nexport {OVPAnalyticsService, OVPConfiguration, RequestBuilder, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./util/request-builder.js","./providers/./util/logger.js","./providers/./k-provider/ovp/config.js","./providers/./util/clone.js","./providers/./k-provider/common/base-service-result.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./util/param.js","./providers/./k-provider/ovp/services/ovp-service.js","./providers/./k-provider/ovp/services/analytics/analytics-service.js","./providers/./k-provider/ovp/services/analytics/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","RequestBuilder","headers","Map","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","status","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","JsLogger","VERSION","DEBUG","INFO","OFF","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","defaultConfig","cdnUrl","serviceParams","apiVersion","format","useApiCaptions","OVPConfiguration","set","clientConfig","clone","node","Array","isArray","length","slice","e","keys","ServiceResult","objectType","hasError","ServiceError","message","MultiRequestBuilder","add","requests","push","requestParams","serviceDef","execute","requestsMustSucceed","stringify","err","FAILED_PARSING_REQUEST","then","multiRequestResult","MultiRequestResult","success","results","result","map","errorResults","serviceResult","param","a","rbracket","obj","toString","k","v","encodeURIComponent","buildParams","prefix","len","test","String","join","replace","OVPService","getMultiRequest","playerVersion","ks","partnerId","config","ovpParams","clientTag","multiReq","OVPAnalyticsService","trackEvent","requestMethod","_trackEventByPOST","_trackEventByGET","tag","urlParams","eventType","entryId","sessionId","NAME","__NAME__","__VERSION__"],"mappings":"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","file":"playkit-analytics-service.js","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[\"analytics\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"services\"] = root[\"playkit\"][\"services\"] || {}, root[\"playkit\"][\"services\"][\"analytics\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n this.results = results;\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","const param = a => {\n let s = [],\n rbracket = /\\[\\]$/,\n isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n },\n add = function (k, v) {\n v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;\n s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);\n },\n buildParams = function (prefix, obj) {\n let i, len, key;\n\n if (prefix) {\n if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n if (rbracket.test(prefix)) {\n add(prefix, obj[i]);\n } else {\n buildParams(prefix + ':' + (typeof obj[i] === 'object' ? i : ''), obj[i]);\n }\n }\n } else if (obj && String(obj) === '[object Object]') {\n for (key in obj) {\n buildParams(prefix + ':' + key, obj[key]);\n }\n } else {\n add(prefix, obj);\n }\n } else if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n add(obj[i].name, obj[i].value);\n }\n } else {\n for (key in obj) {\n buildParams(key, obj[key]);\n }\n }\n return s;\n };\n\n return buildParams('', a).join('&').replace(/%20/g, '+');\n};\n\nexport {param};\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nimport OVPService from '../ovp-service';\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport {param} from '../../../../util/param';\n\nconst SERVICE_NAME: string = 'analytics';\n\nexport default class OVPAnalyticsService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for analytics.trackEvent\n * @function trackEvent\n * @param {string} serviceUrl - The service base url\n * @param {Object} params - The event params\n * @param {string} [requestMethod] - The request method GET or POST\n * @returns {RequestBuilder} - The request builder\n * @static\n */\n static trackEvent(serviceUrl: string, params: Object, requestMethod: ?string): RequestBuilder {\n return requestMethod === 'POST'\n ? OVPAnalyticsService._trackEventByPOST(serviceUrl, params)\n : OVPAnalyticsService._trackEventByGET(serviceUrl, params);\n }\n\n static _trackEventByGET(serviceUrl: string, params: Object): RequestBuilder {\n const ovpParams = OVPConfiguration.get();\n const serviceParams = {};\n Object.assign(serviceParams, ovpParams.serviceParams, params);\n const request = new RequestBuilder();\n request.service = SERVICE_NAME;\n request.action = 'trackEvent';\n request.method = 'GET';\n request.tag = 'analytics-trackEvent';\n request.params = serviceParams;\n request.url = serviceUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(request.params);\n return request;\n }\n\n static _trackEventByPOST(serviceUrl: string, params: Object): RequestBuilder {\n const ovpParams = OVPConfiguration.get();\n const serviceParams = {};\n Object.assign(serviceParams, ovpParams.serviceParams, params);\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n const {eventType, partnerId, entryId, sessionId} = serviceParams;\n const urlParams = {eventType, partnerId, entryId, sessionId};\n ['eventType', 'partnerId', 'entryId', 'sessionId'].forEach(key => delete serviceParams[key]);\n request.service = SERVICE_NAME;\n request.action = 'trackEvent';\n request.method = 'POST';\n request.tag = 'analytics-trackEvent';\n request.params = JSON.stringify(serviceParams);\n request.url = serviceUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(urlParams);\n return request;\n }\n}\n","// @flow\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport OVPAnalyticsService from './analytics-service';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-analytics-service';\nconst VERSION = __VERSION__;\n\nexport {OVPAnalyticsService, OVPConfiguration, RequestBuilder, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/playkit-bookmark-service.js b/dist/playkit-bookmark-service.js index e2e4e8aa..033ad39c 100644 --- a/dist/playkit-bookmark-service.js +++ b/dist/playkit-bookmark-service.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.bookmark=t():(e.playkit=e.playkit||{},e.playkit.services=e.playkit.services||{},e.playkit.services.bookmark=t())}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=8)}([function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(2);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function e(t,r,n,o){void 0===o&&(o={}),this.severity=t,this.category=r,this.code=n,this.data=o,e._logger.error("Category:"+r+" | Code:"+n+" |",o)};o(a,"Severity",{RECOVERABLE:1,CRITICAL:2}),o(a,"Category",{NETWORK:1,SERVICE:2,PROVIDER:3}),o(a,"Code",{UNSUPPORTED_SCHEME:1e3,BAD_HTTP_STATUS:1001,HTTP_ERROR:1002,TIMEOUT:1003,MALFORMED_DATA_URI:1004,BAD_SERVER_RESPONSE:1005,MULTIREQUEST_API_ERROR:1006,API_RESPONSE_MISMATCH:1007,ERROR:2e3,BLOCK_ACTION:2001,MEDIA_STATUS_NOT_READY:2002,MISSING_MANDATORY_PARAMS:3e3,MISSING_PLAY_SOURCE:3001,METHOD_NOT_IMPLEMENTED:3002}),o(a,"_logger",Object(n.a)("Error"))},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(0);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(e){void 0===e&&(e=new Map),o(this,"retryConfig",{async:!0,timeout:0,maxAttempts:4}),o(this,"_attemptCounter",1),this.headers=e}var t=e.prototype;return t.getUrl=function(e){return e+"/service/"+this.service+(this.action?"/action/"+this.action:"")},t.doHttpRequest=function(){var e=this,t=new Promise((function(t,r){e._requestPromise={resolve:t,reject:r}}));return this.url||this._requestPromise.reject(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.MALFORMED_DATA_URI,{url:this.url})),this._createXHR(),t},t._createXHR=function(){var e=this,t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status)try{var r=JSON.parse(t.responseText);return e.responseHeaders=e._getResponseHeaders(t),e._requestPromise.resolve(r)}catch(r){e._requestPromise.reject(e._createError(t,n.a.Code.BAD_SERVER_RESPONSE,{text:t.responseText}))}},t.open(this.method,this.url,this.retryConfig.async),this.retryConfig.async&&this.retryConfig.timeout&&(t.timeout=this.retryConfig.timeout);var r=performance.now();t.ontimeout=function(){e._handleError(t,n.a.Code.TIMEOUT,{timeout:(performance.now()-r)/1e3,statusText:t.statusText})},t.onerror=t.onabort=function(){e._handleError(t,n.a.Code.HTTP_ERROR,{text:t.responseText,statusText:t.statusText})},this.headers.forEach((function(e,r){t.setRequestHeader(r,e)})),t.send(this.params)},t._getResponseHeaders=function(e){return e.getAllResponseHeaders().split("\n").filter((function(e){return 0===e.toLowerCase().indexOf("x-")}))},t._handleError=function(e,t,r){var n=this._createError(e,t,r);if(e.onreadystatechange=function(){},e.onerror=function(){},e.ontimeout=function(){},e.onabort=function(){},!(this.retryConfig.maxAttempts&&this._attemptCounter0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return f}));var n=r(1),o=r(2);var a=function(e){var t,r,n;n=!1,(r="hasError")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,"KalturaAPIException"===e.objectType?(this.hasError=!0,this.error=new i(e.code,e.message)):e.error&&"KalturaAPIException"===e.error.objectType?(this.hasError=!0,this.error=new i(e.error.code,e.error.message)):this.data=e},i=function(e,t){this.code=e,this.message=t},s=r(0);function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),o=0;o0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return f}));var n=r(1),o=r(2);var a=function(e){var t,r,n;n=!1,(r="hasError")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,"KalturaAPIException"===e.objectType?(this.hasError=!0,this.error=new i(e.code,e.message)):e.error&&"KalturaAPIException"===e.error.objectType?(this.hasError=!0,this.error=new i(e.error.code,e.error.message)):this.data=e},i=function(e,t){this.code=e,this.message=t},s=r(0);function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),o=0;o}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = this.results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.results = results;\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceParams: {\n apiVersion: '5.2.6'\n }\n};\n\nexport default class OTTConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OTTConfiguration};\n","//@flow\nimport OTTService from '../ott-service';\nimport RequestBuilder from '../../../../util/request-builder';\nimport OTTConfiguration from '../../config';\n\nconst SERVICE_NAME: string = 'bookmark';\n\nexport default class OTTBookmarkService extends OTTService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function add\n * @param {string} serviceUrl - The service url\n * @param {string} ks - The ks\n * @param {Object} bookmark - The udid\n * @returns {RequestBuilder} - The request builder\n * @static\n */\n static add(serviceUrl: string, ks: string, bookmark: Object): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'add';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n const playerData: Object = {\n objectType: 'KalturaBookmarkPlayerData',\n action: bookmark.playerData.action,\n averageBitrate: bookmark.playerData.averageBitrate,\n totalBitrate: bookmark.playerData.totalBitrate,\n currentBitrate: bookmark.playerData.currentBitrate,\n fileId: bookmark.playerData.fileId\n };\n const bookmarkServiceParams: Object = {\n objectType: 'KalturaBookmark',\n type: bookmark.type,\n id: bookmark.id,\n position: bookmark.position,\n playerData: playerData\n };\n if (bookmark.programId) bookmarkServiceParams.programId = bookmark.programId;\n const config = OTTConfiguration.get();\n const serviceParams = config.serviceParams;\n Object.assign(serviceParams, {bookmark: bookmarkServiceParams, ks: ks});\n request.params = JSON.stringify(serviceParams);\n return request;\n }\n}\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OTTConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OTTService {\n /**\n * Gets a new instance of MultiRequestBuilder with ott params\n * @function getMultiRequest\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OTTConfiguration.get();\n const ottParams = config.serviceParams;\n if (ks) {\n Object.assign(ottParams, {ks: ks});\n }\n if (partnerId) {\n Object.assign(ottParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ottParams;\n return multiReq;\n }\n}\n","// @flow\nimport RequestBuilder from '../../../../util/request-builder';\nimport OTTConfiguration from '../../config';\nimport OTTBookmarkService from './bookmark-service';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-bookmark-service';\nconst VERSION = __VERSION__;\n\nexport {OTTBookmarkService, OTTConfiguration, RequestBuilder, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./util/request-builder.js","./providers/./util/logger.js","./providers/./util/clone.js","./providers/./k-provider/common/base-service-result.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./k-provider/ott/config.js","./providers/./k-provider/ott/services/bookmark/bookmark-service.js","./providers/./k-provider/ott/services/ott-service.js","./providers/./k-provider/ott/services/bookmark/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","RequestBuilder","headers","Map","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","status","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","JsLogger","VERSION","DEBUG","INFO","OFF","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","clone","node","Array","isArray","length","slice","e","keys","ServiceResult","objectType","hasError","ServiceError","message","MultiRequestBuilder","add","requests","push","requestParams","serviceDef","execute","requestsMustSucceed","stringify","err","FAILED_PARSING_REQUEST","then","multiRequestResult","MultiRequestResult","success","results","result","map","errorResults","serviceResult","defaultConfig","serviceParams","apiVersion","OTTConfiguration","set","clientConfig","OTTBookmarkService","ks","bookmark","playerData","averageBitrate","totalBitrate","currentBitrate","fileId","bookmarkServiceParams","type","id","position","programId","getMultiRequest","partnerId","config","ottParams","multiReq","NAME","__NAME__","__VERSION__"],"mappings":"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","file":"playkit-bookmark-service.js","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[\"bookmark\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"services\"] = root[\"playkit\"][\"services\"] || {}, root[\"playkit\"][\"services\"][\"bookmark\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 8);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n this.results = results;\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceParams: {\n apiVersion: '5.2.6'\n }\n};\n\nexport default class OTTConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OTTConfiguration};\n","//@flow\nimport OTTService from '../ott-service';\nimport RequestBuilder from '../../../../util/request-builder';\nimport OTTConfiguration from '../../config';\n\nconst SERVICE_NAME: string = 'bookmark';\n\nexport default class OTTBookmarkService extends OTTService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function add\n * @param {string} serviceUrl - The service url\n * @param {string} ks - The ks\n * @param {Object} bookmark - The udid\n * @returns {RequestBuilder} - The request builder\n * @static\n */\n static add(serviceUrl: string, ks: string, bookmark: Object): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'add';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n const playerData: Object = {\n objectType: 'KalturaBookmarkPlayerData',\n action: bookmark.playerData.action,\n averageBitrate: bookmark.playerData.averageBitrate,\n totalBitrate: bookmark.playerData.totalBitrate,\n currentBitrate: bookmark.playerData.currentBitrate,\n fileId: bookmark.playerData.fileId\n };\n const bookmarkServiceParams: Object = {\n objectType: 'KalturaBookmark',\n type: bookmark.type,\n id: bookmark.id,\n position: bookmark.position,\n playerData: playerData\n };\n if (bookmark.programId) bookmarkServiceParams.programId = bookmark.programId;\n const config = OTTConfiguration.get();\n const serviceParams = config.serviceParams;\n Object.assign(serviceParams, {bookmark: bookmarkServiceParams, ks: ks});\n request.params = JSON.stringify(serviceParams);\n return request;\n }\n}\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OTTConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OTTService {\n /**\n * Gets a new instance of MultiRequestBuilder with ott params\n * @function getMultiRequest\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OTTConfiguration.get();\n const ottParams = config.serviceParams;\n if (ks) {\n Object.assign(ottParams, {ks: ks});\n }\n if (partnerId) {\n Object.assign(ottParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ottParams;\n return multiReq;\n }\n}\n","// @flow\nimport RequestBuilder from '../../../../util/request-builder';\nimport OTTConfiguration from '../../config';\nimport OTTBookmarkService from './bookmark-service';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-bookmark-service';\nconst VERSION = __VERSION__;\n\nexport {OTTBookmarkService, OTTConfiguration, RequestBuilder, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/playkit-ott-provider.js b/dist/playkit-ott-provider.js index 73429e4d..bcfdab53 100644 --- a/dist/playkit-ott-provider.js +++ b/dist/playkit-ott-provider.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ott=t():(e.playkit=e.playkit||{},e.playkit.providers=e.playkit.providers||{},e.playkit.providers.ott=t())}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)r.d(n,a,function(t){return e[t]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=18)}([function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(3);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function e(t,r,n,a){void 0===a&&(a={}),this.severity=t,this.category=r,this.code=n,this.data=a,e._logger.error("Category:"+r+" | Code:"+n+" |",a)};a(i,"Severity",{RECOVERABLE:1,CRITICAL:2}),a(i,"Category",{NETWORK:1,SERVICE:2,PROVIDER:3}),a(i,"Code",{UNSUPPORTED_SCHEME:1e3,BAD_HTTP_STATUS:1001,HTTP_ERROR:1002,TIMEOUT:1003,MALFORMED_DATA_URI:1004,BAD_SERVER_RESPONSE:1005,MULTIREQUEST_API_ERROR:1006,API_RESPONSE_MISMATCH:1007,ERROR:2e3,BLOCK_ACTION:2001,MEDIA_STATUS_NOT_READY:2002,MISSING_MANDATORY_PARAMS:3e3,MISSING_PLAY_SOURCE:3001,METHOD_NOT_IMPLEMENTED:3002}),a(i,"_logger",Object(n.b)("Error"))},function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(8);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function(){function e(){this.metadata=new Map,this.sources=new n.a,this.type=e.Type.UNKNOWN}return e.prototype.toJSON=function(){return{id:this.id,name:this.name,sources:this.sources.toJSON(),duration:this.duration,dvrStatus:this.dvrStatus,status:this.status,metadata:this.metadata,type:this.type,poster:this.poster,assetReferenceType:this.assetReferenceType}},e}();a(i,"Type",{VOD:"Vod",LIVE:"Live",IMAGE:"Image",AUDIO:"Audio",UNKNOWN:"Unknown"}),a(i,"DvrStatus",{ON:1,OFF:0})},function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(0);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function(){function e(e){void 0===e&&(e=new Map),a(this,"retryConfig",{async:!0,timeout:0,maxAttempts:4}),a(this,"_attemptCounter",1),this.headers=e}var t=e.prototype;return t.getUrl=function(e){return e+"/service/"+this.service+(this.action?"/action/"+this.action:"")},t.doHttpRequest=function(){var e=this,t=new Promise((function(t,r){e._requestPromise={resolve:t,reject:r}}));return this.url||this._requestPromise.reject(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.MALFORMED_DATA_URI,{url:this.url})),this._createXHR(),t},t._createXHR=function(){var e=this,t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status)try{var r=JSON.parse(t.responseText);return e.responseHeaders=e._getResponseHeaders(t),e._requestPromise.resolve(r)}catch(r){e._requestPromise.reject(e._createError(t,n.a.Code.BAD_SERVER_RESPONSE,{text:t.responseText}))}},t.open(this.method,this.url,this.retryConfig.async),this.retryConfig.async&&this.retryConfig.timeout&&(t.timeout=this.retryConfig.timeout);var r=performance.now();t.ontimeout=function(){e._handleError(t,n.a.Code.TIMEOUT,{timeout:(performance.now()-r)/1e3,statusText:t.statusText})},t.onerror=t.onabort=function(){e._handleError(t,n.a.Code.HTTP_ERROR,{text:t.responseText,statusText:t.statusText})},this.headers.forEach((function(e,r){t.setRequestHeader(r,e)})),t.send(this.params)},t._getResponseHeaders=function(e){return e.getAllResponseHeaders().split("\n").filter((function(e){return 0===e.toLowerCase().indexOf("x-")}))},t._handleError=function(e,t,r){var n=this._createError(e,t,r);if(e.onreadystatechange=function(){},e.onerror=function(){},e.ontimeout=function(){},e.onabort=function(){},!(this.retryConfig.maxAttempts&&this._attemptCounter0&&(e.drmData=[],this.drmData.forEach((function(t){Array.isArray(e.drmData)&&e.drmData.push(t.toJSON())}))),e},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));r(11);var n=r(0);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function(){function e(e){a(this,"_loadersResponseMap",new Map),a(this,"_loaders",new Map),this._networkRetryConfig=e}var t=e.prototype;return t.add=function(e,t,r){var n=this,a=new e(t);if(a.isValid()){this._loaders.set(e.id,a);var i=this._multiRequest.requests.length,s=a.requests;this._multiRequest.retryConfig=this._networkRetryConfig,s.forEach((function(e){e.params=e.params||{},e.params.ks=e.params.ks||r,n._multiRequest.add(e)}));var o=Array.from(new Array(s.length),(function(e,t){return t+i}));this._loadersResponseMap.set(e.id,o)}},t.fetchData=function(e){var t=this;return new Promise((function(r,a){t._multiRequest.execute(e).then((function(e){t._multiResponse=e.response,t.prepareData(e.response).success?r(t._loaders):a(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.API_RESPONSE_MISMATCH,{headers:e.headers}))}),(function(e){a(e)}))}))},t.prepareData=function(e){var t=this;return this._loaders.forEach((function(r,n){var a=t._loadersResponseMap.get(n);try{a&&a.length>0&&(r.response=e.results.slice(a[0],a[a.length-1]+1))}catch(e){return{success:!1,error:e}}})),{success:!0,data:this._loaders}},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return c}));var n=r(2),a=r(3),i=r(4),s=r(0);function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),a=0;a0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));r(1);var n=function(){this.items=[]}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var n=function(e){this.url=e.url,this.clickThroughUrl=e.clickThroughUrl}},,function(e,t,r){"use strict";r.r(t),r.d(t,"Provider",(function(){return ee})),r.d(t,"ContextType",(function(){return ne})),r.d(t,"MediaType",(function(){return ae})),r.d(t,"NAME",(function(){return te})),r.d(t,"VERSION",(function(){return re}));var n=r(13),a=r(3),i=r(14),s={serviceParams:{apiVersion:"5.2.6"}},o=function(){function e(){}return e.set=function(e){e&&Object.assign(s,e)},e.get=function(){return Object(i.a)(s)},e}(),u=r(10),c=r(11),p=function(){function e(){}return e.getMultiRequest=function(e,t){var r=o.get(),n=r.serviceParams;e&&Object.assign(n,{ks:e}),t&&Object.assign(n,{partnerId:t});var a=new Map;a.set("Content-Type","application/json");var i=new c.a(a);return i.method="POST",i.service="multirequest",i.url=i.getUrl(r.serviceUrl),i.params=n,i},e}();var f=function(e){var t,r;function n(t,r,n){var a;return void 0===r&&(r=""),(a=e.call(this,n)||this)._multiRequest=p.getMultiRequest(r,t),a}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a),d=r(2);var l=function(e){var t,r;function n(){return e.apply(this,arguments)||this}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.anonymousLogin=function(e,t,r){var n=new Map;n.set("Content-Type","application/json");var a=new d.a(n);a.service="ottuser",a.action="anonymousLogin",a.method="POST",a.url=a.getUrl(e);var i={partnerId:t};return r&&Object.assign(i,{udid:r}),a.params=i,a},n}(p);function h(e,t){for(var r=0;r0},t.getProtocol=function(e){var t="";if(this.protocols&&this.protocols.length>0)this.protocols.split(",").forEach((function(r){r===e&&(t=r)}));else if("http"===e)return e;return t},e}();var A=function(e){this.streamertype=e.streamertype,this.url=e.url};function C(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function P(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(A,"StreamerType",{HLS:"hls",DASH:"dash",PROGRESSIVE:"progressive"});var S=function(e){var t,r;function n(t){var r;if(P(C(r=e.call(this,t)||this),"sources",[]),P(C(r),"actions",[]),P(C(r),"messages",[]),P(C(r),"plugins",[]),!r.hasError){var n=t.messages;n&&n.map((function(e){return r.messages.push(new _.a(e))}));var a=t.actions;a&&a.map((function(e){return r.actions.push(new R(e))}));var i=t.sources;i&&i.map((function(e){return r.sources.push(new I(e))}));var s=t.plugins;s&&s.map((function(e){return r.plugins.push(new A(e))}))}return r}r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r;var a=n.prototype;return a.hasBlockAction=function(){return void 0!==this.getBlockAction()},a.getBlockAction=function(){return this.actions.find((function(e){return e.type===R.Type.BLOCK}))},a.getErrorMessages=function(){return this.messages},n}(v.a);function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function L(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}P(S,"Type",{TRAILER:"TRAILER",CATCHUP:"CATCHUP",START_OVER:"START_OVER",PLAYBACK:"PLAYBACK"});var D=function(e){var t,r;function n(t){var r;return L(w(r=e.call(this,t)||this),"name",""),L(w(r),"description",""),L(w(r),"tags",[]),L(w(r),"metas",[]),L(w(r),"pictures",[]),r.hasError||(r.id=t.id,r.name=t.name,r.description=t.description,r.metas=r._formatTagsMetas(t.metas),r.tags=r._formatTagsMetas(t.tags),r.pictures=t.images),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.prototype._formatTagsMetas=function(e){var t=[];return Object.keys(e).forEach((function(r){if(e[r].objects){var n="";e[r].objects.forEach((function(e){n+=e.value+"|"})),t.push({key:r,value:n})}else t.push({key:r,value:e[r].value})})),t},n}(v.a);function k(e,t){for(var r=0;r0?{type:K.a.Type.LIVE,dvrStatus:K.a.DvrStatus.OFF}:{type:K.a.Type.VOD}},U),V[D.Type.EPG]=((B={})[S.Type.CATCHUP]=function(){return{type:K.a.Type.VOD}},B[S.Type.START_OVER]=function(){return{type:K.a.Type.LIVE,dvrStatus:K.a.DvrStatus.ON}},B),V[D.Type.RECORDING]=((q={})[S.Type.PLAYBACK]=function(){return{type:K.a.Type.VOD}},q),V),z=function(){function e(){}return e.getMediaEntry=function(t,r){var n=new K.a;e._fillBaseData(n,t,r);var a=t.playBackContextResult,i=t.mediaDataResult,s=a.sources,o=e._filterSourcesByFormats(s,r.formats);n.sources=e._getParsedSources(o);var u=e._getMediaType(i.data,r.mediaType,r.contextType);return n.type=u.type,n.dvrStatus=u.dvrStatus,n.duration=Math.max.apply(Math,s.map((function(e){return e.duration}))),n},e.getEntryList=function(t,r){var n=new G.a;return t.playlistItems.entries.forEach((function(t){var a=new K.a,i=r.find((function(e){return e.entryId===t.mediaDataResult.id}));e._fillBaseData(a,t,i),n.items.push(a)})),n},e.getBumper=function(e){var t=e.playBackContextResult.plugins.find((function(e){return e.streamertype===A.StreamerType.PROGRESSIVE}));if(t)return new J.a(t)},e._fillBaseData=function(t,r,n){var a=r.mediaDataResult,i=e.reconstructMetadata(a);return i.description=a.description,i.name=a.name,a.data.epgId&&(i.epgId=a.data.epgId),a.data.recordingId&&(i.recordingId=a.data.recordingId),n&&n.mediaType&&(i.mediaType=n.mediaType),t.metadata=i,t.poster=e._getPoster(a.pictures),t.id=a.id,t},e.reconstructMetadata=function(t){return{metas:e.addToMetaObject(t.metas),tags:e.addToMetaObject(t.tags)}},e.addToMetaObject=function(e){var t={};return e&&e.forEach((function(e){t[e.key]=e.value})),t},e._getPoster=function(e){if(e&&e.length>0){var t=e[0].url;return/.*\/thumbnail\/.*(?:width|height)\/\d+\/(?:height|width)\/\d+/.test(t)?t:e.map((function(e){return{url:e.url,width:e.width,height:e.height}}))}return""},e._getMediaType=function(e,t,r){var n={type:K.a.Type.UNKNOWN};return Q[t]&&Q[t][r]&&(n=Q[t][r](e)),n},e._filterSourcesByFormats=function(e,t){return t.length>0&&(e=e.filter((function(e){return t.includes(e.type)}))),e},e._getParsedSources=function(t){var r=new W.a,n=function(t){var n=e._parseAdaptiveSource(t);if(n){var a=X.b.get(t.format);r.map(n,a)}};return t&&t.length>0&&(t.filter((function(e){return!Object(X.c)(e.format)})).forEach(n),t.filter((function(e){return Object(X.c)(e.format)})).forEach(n)),r},e._parseAdaptiveSource=function(t){var r=new Y.a;if(t){var n=t.url,a=X.b.get(t.format);if(a&&(r.mimetype=a.mimeType),!n)return e._logger.error("failed to create play url from source, discarding source: ("+t.fileId+"), "+t.format+"."),null;if(r.url=n,r.id=t.fileId+","+t.format,t.hasDrmData()){var i=[];t.drm.forEach((function(e){i.push(new F.a(e.licenseURL,O.a.Scheme[e.scheme],e.certificate))})),r.drmData=i}}return r},e.hasBlockAction=function(e){return e.playBackContextResult.hasBlockAction()},e.getBlockAction=function(e){return e.playBackContextResult.getBlockAction()},e.getErrorMessages=function(e){return e.playBackContextResult.getErrorMessages()},e}();!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(z,"_logger",Object(a.b)("OTTProviderParser"));var Z=r(0);function $(e,t){for(var r=0;r-1&&(t.vr={}),Object.assign(t.metadata,e.metadata),t},i=n,(s=[{key:"env",get:function(){return o.get()}}])&&$(i.prototype,s),u&&$(i,u),n}(n.a),te="playkit-js-providers-ott",re="2.34.0",ne=S.Type,ae=D.Type}])})); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ott=t():(e.playkit=e.playkit||{},e.playkit.providers=e.playkit.providers||{},e.playkit.providers.ott=t())}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)r.d(n,a,function(t){return e[t]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=18)}([function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(3);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function e(t,r,n,a){void 0===a&&(a={}),this.severity=t,this.category=r,this.code=n,this.data=a,e._logger.error("Category:"+r+" | Code:"+n+" |",a)};a(i,"Severity",{RECOVERABLE:1,CRITICAL:2}),a(i,"Category",{NETWORK:1,SERVICE:2,PROVIDER:3}),a(i,"Code",{UNSUPPORTED_SCHEME:1e3,BAD_HTTP_STATUS:1001,HTTP_ERROR:1002,TIMEOUT:1003,MALFORMED_DATA_URI:1004,BAD_SERVER_RESPONSE:1005,MULTIREQUEST_API_ERROR:1006,API_RESPONSE_MISMATCH:1007,ERROR:2e3,BLOCK_ACTION:2001,MEDIA_STATUS_NOT_READY:2002,MISSING_MANDATORY_PARAMS:3e3,MISSING_PLAY_SOURCE:3001,METHOD_NOT_IMPLEMENTED:3002}),a(i,"_logger",Object(n.b)("Error"))},function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(8);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function(){function e(){this.metadata=new Map,this.sources=new n.a,this.type=e.Type.UNKNOWN}return e.prototype.toJSON=function(){return{id:this.id,name:this.name,sources:this.sources.toJSON(),duration:this.duration,dvrStatus:this.dvrStatus,status:this.status,metadata:this.metadata,type:this.type,poster:this.poster,assetReferenceType:this.assetReferenceType}},e}();a(i,"Type",{VOD:"Vod",LIVE:"Live",IMAGE:"Image",AUDIO:"Audio",UNKNOWN:"Unknown"}),a(i,"DvrStatus",{ON:1,OFF:0})},function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(0);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function(){function e(e){void 0===e&&(e=new Map),a(this,"retryConfig",{async:!0,timeout:0,maxAttempts:4}),a(this,"_attemptCounter",1),this.headers=e}var t=e.prototype;return t.getUrl=function(e){return e+"/service/"+this.service+(this.action?"/action/"+this.action:"")},t.doHttpRequest=function(){var e=this,t=new Promise((function(t,r){e._requestPromise={resolve:t,reject:r}}));return this.url||this._requestPromise.reject(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.MALFORMED_DATA_URI,{url:this.url})),this._createXHR(),t},t._createXHR=function(){var e=this,t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status)try{var r=JSON.parse(t.responseText);return e.responseHeaders=e._getResponseHeaders(t),e._requestPromise.resolve(r)}catch(r){e._requestPromise.reject(e._createError(t,n.a.Code.BAD_SERVER_RESPONSE,{text:t.responseText}))}},t.open(this.method,this.url,this.retryConfig.async),this.retryConfig.async&&this.retryConfig.timeout&&(t.timeout=this.retryConfig.timeout);var r=performance.now();t.ontimeout=function(){e._handleError(t,n.a.Code.TIMEOUT,{timeout:(performance.now()-r)/1e3,statusText:t.statusText})},t.onerror=t.onabort=function(){e._handleError(t,n.a.Code.HTTP_ERROR,{text:t.responseText,statusText:t.statusText})},this.headers.forEach((function(e,r){t.setRequestHeader(r,e)})),t.send(this.params)},t._getResponseHeaders=function(e){return e.getAllResponseHeaders().split("\n").filter((function(e){return 0===e.toLowerCase().indexOf("x-")}))},t._handleError=function(e,t,r){var n=this._createError(e,t,r);if(e.onreadystatechange=function(){},e.onerror=function(){},e.ontimeout=function(){},e.onabort=function(){},!(this.retryConfig.maxAttempts&&this._attemptCounter0&&(e.drmData=[],this.drmData.forEach((function(t){Array.isArray(e.drmData)&&e.drmData.push(t.toJSON())}))),e},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));r(11);var n=r(0);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function(){function e(e){a(this,"_loadersResponseMap",new Map),a(this,"_loaders",new Map),this._networkRetryConfig=e}var t=e.prototype;return t.add=function(e,t,r){var n=this,a=new e(t);if(a.isValid()){this._loaders.set(e.id,a);var i=this._multiRequest.requests.length,s=a.requests;this._multiRequest.retryConfig=this._networkRetryConfig,s.forEach((function(e){e.params=e.params||{},e.params.ks=e.params.ks||r,n._multiRequest.add(e)}));var o=Array.from(new Array(s.length),(function(e,t){return t+i}));this._loadersResponseMap.set(e.id,o)}},t.fetchData=function(e){var t=this;return new Promise((function(r,a){t._multiRequest.execute(e).then((function(e){t._multiResponse=e.response,t.prepareData(e.response).success?r(t._loaders):a(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.API_RESPONSE_MISMATCH,{headers:e.headers}))}),(function(e){a(e)}))}))},t.prepareData=function(e){var t=this;return this._loaders.forEach((function(r,n){var a=t._loadersResponseMap.get(n);try{a&&a.length>0&&(r.response=e.results.slice(a[0],a[a.length-1]+1))}catch(e){return{success:!1,error:e}}})),{success:!0,data:this._loaders}},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return c}));var n=r(2),a=r(3),i=r(4),s=r(0);function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),a=0;a0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));r(1);var n=function(){this.items=[]}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var n=function(e){this.url=e.url,this.clickThroughUrl=e.clickThroughUrl}},,function(e,t,r){"use strict";r.r(t),r.d(t,"Provider",(function(){return ee})),r.d(t,"ContextType",(function(){return ne})),r.d(t,"MediaType",(function(){return ae})),r.d(t,"NAME",(function(){return te})),r.d(t,"VERSION",(function(){return re}));var n=r(13),a=r(3),i=r(14),s={serviceParams:{apiVersion:"5.2.6"}},o=function(){function e(){}return e.set=function(e){e&&Object.assign(s,e)},e.get=function(){return Object(i.a)(s)},e}(),u=r(10),c=r(11),p=function(){function e(){}return e.getMultiRequest=function(e,t){var r=o.get(),n=r.serviceParams;e&&Object.assign(n,{ks:e}),t&&Object.assign(n,{partnerId:t});var a=new Map;a.set("Content-Type","application/json");var i=new c.a(a);return i.method="POST",i.service="multirequest",i.url=i.getUrl(r.serviceUrl),i.params=n,i},e}();var f=function(e){var t,r;function n(t,r,n){var a;return void 0===r&&(r=""),(a=e.call(this,n)||this)._multiRequest=p.getMultiRequest(r,t),a}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a),d=r(2);var l=function(e){var t,r;function n(){return e.apply(this,arguments)||this}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.anonymousLogin=function(e,t,r){var n=new Map;n.set("Content-Type","application/json");var a=new d.a(n);a.service="ottuser",a.action="anonymousLogin",a.method="POST",a.url=a.getUrl(e);var i={partnerId:t};return r&&Object.assign(i,{udid:r}),a.params=i,a},n}(p);function h(e,t){for(var r=0;r0},t.getProtocol=function(e){var t="";if(this.protocols&&this.protocols.length>0)this.protocols.split(",").forEach((function(r){r===e&&(t=r)}));else if("http"===e)return e;return t},e}();var A=function(e){this.streamertype=e.streamertype,this.url=e.url};function C(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function P(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(A,"StreamerType",{HLS:"hls",DASH:"dash",PROGRESSIVE:"progressive"});var S=function(e){var t,r;function n(t){var r;if(P(C(r=e.call(this,t)||this),"sources",[]),P(C(r),"actions",[]),P(C(r),"messages",[]),P(C(r),"plugins",[]),!r.hasError){var n=t.messages;n&&n.map((function(e){return r.messages.push(new _.a(e))}));var a=t.actions;a&&a.map((function(e){return r.actions.push(new R(e))}));var i=t.sources;i&&i.map((function(e){return r.sources.push(new I(e))}));var s=t.plugins;s&&s.map((function(e){return r.plugins.push(new A(e))}))}return r}r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r;var a=n.prototype;return a.hasBlockAction=function(){return void 0!==this.getBlockAction()},a.getBlockAction=function(){return this.actions.find((function(e){return e.type===R.Type.BLOCK}))},a.getErrorMessages=function(){return this.messages},n}(v.a);function w(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function L(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}P(S,"Type",{TRAILER:"TRAILER",CATCHUP:"CATCHUP",START_OVER:"START_OVER",PLAYBACK:"PLAYBACK"});var D=function(e){var t,r;function n(t){var r;return L(w(r=e.call(this,t)||this),"name",""),L(w(r),"description",""),L(w(r),"tags",[]),L(w(r),"metas",[]),L(w(r),"pictures",[]),r.hasError||(r.id=t.id,r.name=t.name,r.description=t.description,r.metas=r._formatTagsMetas(t.metas),r.tags=r._formatTagsMetas(t.tags),r.pictures=t.images),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.prototype._formatTagsMetas=function(e){var t=[];return Object.keys(e).forEach((function(r){if(e[r].objects){var n="";e[r].objects.forEach((function(e){n+=e.value+"|"})),t.push({key:r,value:n})}else t.push({key:r,value:e[r].value})})),t},n}(v.a);function k(e,t){for(var r=0;r0?{type:K.a.Type.LIVE,dvrStatus:K.a.DvrStatus.OFF}:{type:K.a.Type.VOD}},U),V[D.Type.EPG]=((B={})[S.Type.CATCHUP]=function(){return{type:K.a.Type.VOD}},B[S.Type.START_OVER]=function(){return{type:K.a.Type.LIVE,dvrStatus:K.a.DvrStatus.ON}},B),V[D.Type.RECORDING]=((q={})[S.Type.PLAYBACK]=function(){return{type:K.a.Type.VOD}},q),V),z=function(){function e(){}return e.getMediaEntry=function(t,r){var n=new K.a;e._fillBaseData(n,t,r);var a=t.playBackContextResult,i=t.mediaDataResult,s=a.sources,o=e._filterSourcesByFormats(s,r.formats);n.sources=e._getParsedSources(o);var u=e._getMediaType(i.data,r.mediaType,r.contextType);return n.type=u.type,n.dvrStatus=u.dvrStatus,n.duration=Math.max.apply(Math,s.map((function(e){return e.duration}))),n},e.getEntryList=function(t,r){var n=new G.a;return t.playlistItems.entries.forEach((function(t){var a=new K.a,i=r.find((function(e){return e.entryId===t.mediaDataResult.id}));e._fillBaseData(a,t,i),n.items.push(a)})),n},e.getBumper=function(e){var t=e.playBackContextResult.plugins.find((function(e){return e.streamertype===A.StreamerType.PROGRESSIVE}));if(t)return new J.a(t)},e._fillBaseData=function(t,r,n){var a=r.mediaDataResult,i=e.reconstructMetadata(a);return i.description=a.description,i.name=a.name,a.data.epgId&&(i.epgId=a.data.epgId),a.data.recordingId&&(i.recordingId=a.data.recordingId),n&&n.mediaType&&(i.mediaType=n.mediaType),t.metadata=i,t.poster=e._getPoster(a.pictures),t.id=a.id,t},e.reconstructMetadata=function(t){return{metas:e.addToMetaObject(t.metas),tags:e.addToMetaObject(t.tags)}},e.addToMetaObject=function(e){var t={};return e&&e.forEach((function(e){t[e.key]=e.value})),t},e._getPoster=function(e){if(e&&e.length>0){var t=e[0].url;return/.*\/thumbnail\/.*(?:width|height)\/\d+\/(?:height|width)\/\d+/.test(t)?t:e.map((function(e){return{url:e.url,width:e.width,height:e.height}}))}return""},e._getMediaType=function(e,t,r){var n={type:K.a.Type.UNKNOWN};return Q[t]&&Q[t][r]&&(n=Q[t][r](e)),n},e._filterSourcesByFormats=function(e,t){return t.length>0&&(e=e.filter((function(e){return t.includes(e.type)}))),e},e._getParsedSources=function(t){var r=new W.a,n=function(t){var n=e._parseAdaptiveSource(t);if(n){var a=X.b.get(t.format);r.map(n,a)}};return t&&t.length>0&&(t.filter((function(e){return!Object(X.c)(e.format)})).forEach(n),t.filter((function(e){return Object(X.c)(e.format)})).forEach(n)),r},e._parseAdaptiveSource=function(t){var r=new Y.a;if(t){var n=t.url,a=X.b.get(t.format);if(a&&(r.mimetype=a.mimeType),!n)return e._logger.error("failed to create play url from source, discarding source: ("+t.fileId+"), "+t.format+"."),null;if(r.url=n,r.id=t.fileId+","+t.format,t.hasDrmData()){var i=[];t.drm.forEach((function(e){i.push(new F.a(e.licenseURL,O.a.Scheme[e.scheme],e.certificate))})),r.drmData=i}}return r},e.hasBlockAction=function(e){return e.playBackContextResult.hasBlockAction()},e.getBlockAction=function(e){return e.playBackContextResult.getBlockAction()},e.getErrorMessages=function(e){return e.playBackContextResult.getErrorMessages()},e}();!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(z,"_logger",Object(a.b)("OTTProviderParser"));var Z=r(0);function $(e,t){for(var r=0;r-1&&(t.vr={}),Object.assign(t.metadata,e.metadata),t},i=n,(s=[{key:"env",get:function(){return o.get()}}])&&$(i.prototype,s),u&&$(i,u),n}(n.a),te="playkit-js-providers-ott",re="2.34.0",ne=S.Type,ae=D.Type}])})); //# sourceMappingURL=playkit-ott-provider.js.map \ No newline at end of file diff --git a/dist/playkit-ott-provider.js.map b/dist/playkit-ott-provider.js.map index bad498ef..62178358 100644 --- a/dist/playkit-ott-provider.js.map +++ b/dist/playkit-ott-provider.js.map @@ -1 +1 @@ -{"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./entities/media-entry.js","./providers/./util/request-builder.js","./providers/./util/logger.js","./providers/./k-provider/common/base-service-result.js","./providers/./entities/media-format.js","./providers/./k-provider/common/response-types/kaltura-drm-playback-plugin-data.js","./providers/./k-provider/common/response-types/kaltura-access-control-message.js","./providers/./entities/media-sources.js","./providers/./entities/media-source.js","./providers/./k-provider/common/data-loader-manager.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./entities/drm.js","./providers/./k-provider/common/base-provider.js","./providers/./util/clone.js","./providers/./entities/entry-list.js","./providers/./entities/bumper.js","./providers/./k-provider/ott/config.js","./providers/./k-provider/ott/services/ott-service.js","./providers/./k-provider/ott/loaders/data-loader-manager.js","./providers/./k-provider/ott/services/user-service.js","./providers/./k-provider/ott/loaders/session-loader.js","./providers/./k-provider/ott/services/asset-service.js","./providers/./k-provider/ott/response-types/kaltura-rule-action.js","./providers/./k-provider/ott/response-types/kaltura-playback-source.js","./providers/./k-provider/ott/response-types/kaltura-bumper-playback-plugin-data.js","./providers/./k-provider/ott/response-types/kaltura-playback-context.js","./providers/./k-provider/ott/response-types/kaltura-asset.js","./providers/./k-provider/ott/loaders/asset-loader.js","./providers/./k-provider/ott/loaders/asset-list-loader.js","./providers/./k-provider/ott/provider-parser.js","./providers/./k-provider/ott/provider.js","./providers/./k-provider/ott/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","MediaEntry","metadata","Map","sources","MediaSources","type","Type","UNKNOWN","toJSON","id","duration","dvrStatus","status","poster","assetReferenceType","VOD","LIVE","IMAGE","AUDIO","ON","OFF","RequestBuilder","headers","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","JsLogger","VERSION","DEBUG","INFO","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","LogLevel","setLogger","logger","getLogLevel","setLogLevel","level","ServiceResult","objectType","hasError","ServiceError","message","MediaFormat","DASH","mimeType","pathExt","HLS","WVM","MP4","MP3","SupportedStreamFormat","isProgressiveSource","formatName","sourceFormat","KalturaDrmPlaybackPluginData","drm","scheme","licenseURL","certificate","WIDEVINE_CENC","PLAYREADY_CENC","FAIRPLAY","KalturaAccessControlMessage","progressive","dash","hls","map","source","mediaFormat","push","h","MediaSource","mimetype","bandwidth","width","height","label","drmData","length","Array","isArray","DataLoaderManager","networkRetryConfig","_networkRetryConfig","add","loader","ks","execution_loader","isValid","_loaders","set","startIndex","_multiRequest","requests","executionLoaderResponseMap","from","val","index","_loadersResponseMap","fetchData","requestsMustSucceed","execute","then","_multiResponse","prepareData","success","err","loaderDataIndexes","results","slice","MultiRequestBuilder","requestParams","serviceDef","stringify","FAILED_PARSING_REQUEST","multiRequestResult","MultiRequestResult","result","errorResults","serviceResult","Drm","licenseUrl","BaseProvider","options","playerVersion","_partnerId","partnerId","_widgetId","widgetId","_uiConfId","uiConfId","_isAnonymous","_ks","_playerVersion","defaultWidgetId","getMediaConfig","mediaInfo","getPlaylistConfig","playlistInfo","getEntryListConfig","entryListInfo","_verifyHasSources","concat","messages","clone","node","e","keys","EntryList","items","Bumper","clickThroughUrl","defaultConfig","serviceParams","apiVersion","OTTConfiguration","clientConfig","OTTService","getMultiRequest","config","ottParams","multiReq","OTTDataLoaderManager","OTTUserService","anonymousLogin","udid","OTTSessionLoader","buildRequests","UserService","_requests","_response","OTTAssetService","getPlaybackContext","assetId","playbackContextOptions","contextDataParams","assetType","KalturaRuleAction","BLOCK","START_DATE_OFFSET","END_DATE_OFFSET","USER_BLOCK","ALLOW_PLAYBACK","BLOCK_PLAYBACK","APPLY_DISCOUNT_MODULE","KalturaPlaybackSource","format","adsPolicy","adsParam","fileId","protocols","hasDrmData","getProtocol","protocol","returnValue","KalturaBumpersPlaybackPluginData","streamertype","PROGRESSIVE","KalturaPlaybackContext","actions","plugins","plugin","hasBlockAction","undefined","getBlockAction","find","getErrorMessages","TRAILER","CATCHUP","START_OVER","PLAYBACK","KalturaAsset","description","metas","_formatTagsMetas","tags","pictures","images","objectToParse","parsed","objects","MEDIA","RECORDING","EPG","EPG_INTERNAL","EPG_EXTERNAL","NPVR","OTTAssetLoader","_entryId","entryId","playbackContext","mediaDataResult","playBackContextResult","OTTAssetListLoader","playlistItems","entries","_entries","entry","AssetReferenceType","item","MediaTypeCombinations","mediaAssetData","enableTrickPlay","DvrStatus","parseInt","externalIds","OTTProviderParser","getMediaEntry","assetResponse","requestData","mediaEntry","_fillBaseData","mediaAsset","kalturaSources","filteredKalturaSources","_filterSourcesByFormats","formats","_getParsedSources","typeData","_getMediaType","mediaType","contextType","Math","max","apply","getEntryList","playlistResponse","requestEntries","entryList","requestEntry","getBumper","progressiveBumper","bumper","StreamerType","metaData","reconstructMetadata","epgId","recordingId","_getPoster","addToMetaObject","list","categoryObj","test","pic","includes","addAdaptiveSource","parsedSource","_parseAdaptiveSource","kalturaSource","mediaSource","playUrl","drmParams","Scheme","OTTProvider","env","networkRetryParameters","_dataLoader","mediaProtocol","assetFileIds","fileIds","context","streamerType","urlType","adapterData","_parseDataFromResponse","mediaConfig","session","isAnonymous","_getDefaultSourcesObject","has","sessionLoader","assetLoader","_getSourcesObject","_parseEntryListDataFromResponse","playlistConfig","playlistLoader","dvr","vr","sourcesObject","mediaSources","NAME","__NAME__","__VERSION__","ContextType","MediaType"],"mappings":"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","file":"playkit-ott-provider.js","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[\"ott\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"providers\"] = root[\"playkit\"][\"providers\"] || {}, root[\"playkit\"][\"providers\"][\"ott\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 18);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport MediaSources from './media-sources';\n\nexport default class MediaEntry {\n static Type: {[type: string]: string} = {\n VOD: 'Vod',\n LIVE: 'Live',\n IMAGE: 'Image',\n AUDIO: 'Audio',\n UNKNOWN: 'Unknown'\n };\n static DvrStatus: {[type: string]: number} = {\n ON: 1,\n OFF: 0\n };\n\n /**\n * @member - entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - entry name\n * @type {string}\n */\n name: string;\n /**\n * @member - entry sources\n * @type {MediaSources}\n */\n sources: MediaSources;\n /**\n * @member - entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - entry type\n * @type {string}\n */\n type: string;\n /**\n * @member - entry metadata\n * @type {Object}\n */\n metadata: Object;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - media status\n * @type {number}\n */\n status: number;\n /**\n * @member - media poster\n * @type {string | Array}\n */\n poster: string | Array;\n\n /**\n * @member - assetReferenceType\n * @type {string }\n */\n assetReferenceType: string;\n\n /**\n * @constructor\n */\n constructor() {\n this.metadata = new Map();\n this.sources = new MediaSources();\n this.type = MediaEntry.Type.UNKNOWN;\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaEntryObject} - The json class object.\n */\n toJSON(): ProviderMediaEntryObject {\n return {\n id: this.id,\n name: this.name,\n sources: this.sources.toJSON(),\n duration: this.duration,\n dvrStatus: this.dvrStatus,\n status: this.status,\n metadata: this.metadata,\n type: this.type,\n poster: this.poster,\n assetReferenceType: this.assetReferenceType\n };\n }\n}\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nexport const MediaFormat: {[name: string]: ProviderMediaFormatType} = {\n DASH: {\n name: 'dash',\n mimeType: 'application/dash+xml',\n pathExt: 'mpd'\n },\n HLS: {\n name: 'hls',\n mimeType: 'application/x-mpegURL',\n pathExt: 'm3u8'\n },\n WVM: {\n name: 'wvm',\n mimeType: 'video/wvm',\n pathExt: 'wvm'\n },\n MP4: {\n name: 'mp4',\n mimeType: 'video/mp4',\n pathExt: 'mp4'\n },\n MP3: {\n name: 'mp3',\n mimeType: 'audio/mpeg',\n pathExt: 'mp3'\n }\n};\n\nexport const SupportedStreamFormat: Map = new Map([\n ['mpegdash', MediaFormat.DASH],\n ['applehttp', MediaFormat.HLS],\n ['url', MediaFormat.MP4]\n]);\n\n/**\n * returns a boolean whether a source is progressive or not\n * @param {string} formatName - the format name\n * @returns {boolean} - if source is progressive or not\n */\nfunction isProgressiveSource(formatName: string): boolean {\n const sourceFormat = SupportedStreamFormat.get(formatName);\n return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;\n}\n\nexport {isProgressiveSource};\n","//@flow\nexport class KalturaDrmPlaybackPluginData {\n static Scheme: {[scheme: string]: string} = {\n 'drm.PLAYREADY_CENC': 'com.microsoft.playready',\n 'drm.WIDEVINE_CENC': 'com.widevine.alpha',\n 'fairplay.FAIRPLAY': 'com.apple.fairplay',\n WIDEVINE_CENC: 'com.widevine.alpha',\n PLAYREADY_CENC: 'com.microsoft.playready',\n FAIRPLAY: 'com.apple.fairplay'\n };\n\n /**\n * @member - The drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - The license URL\n * @type {string}\n */\n licenseURL: string;\n\n /**\n * @member - The drm certificate\n * @type {?string}\n */\n certificate: ?string;\n\n /**\n * @constructor\n * @param {Object} drm The json response\n */\n constructor(drm: any) {\n this.scheme = drm.scheme;\n this.licenseURL = drm.licenseURL;\n this.certificate = drm.certificate;\n }\n}\n","//@flow\nexport class KalturaAccessControlMessage {\n /**\n * @member - The access control message\n * @type {string}\n */\n message: string;\n /**\n * @member - The access control message code\n * @@type {string}\n */\n code: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n this.message = data.message;\n this.code = data.code;\n }\n}\n","// @flow\nimport MediaSource from './media-source';\nimport {MediaFormat} from './media-format';\n\nexport default class MediaSources {\n /**\n * Progressive download media sources container.\n * @type {Array}\n * @public\n */\n progressive: Array;\n /**\n * Dash media sources container.\n * @type {Array}\n * @public\n */\n dash: Array;\n /**\n * Hls media sources container.\n * @type {Array}\n * @public\n */\n hls: Array;\n captions: Array;\n\n /**\n * @constructor\n */\n constructor() {\n this.progressive = [];\n this.dash = [];\n this.hls = [];\n }\n\n /**\n * Maps the source to one of the containers according to his media format.\n * @param {MediaSource} source - The source to add to one of the containers.\n * @param {MediaFormat} mediaFormat - The media format of the source.\n * @returns {void}\n */\n map(source: MediaSource, mediaFormat: ?ProviderMediaFormatType) {\n if (mediaFormat) {\n switch (mediaFormat.name) {\n case MediaFormat.MP4.name:\n this.progressive.push(source);\n break;\n case MediaFormat.DASH.name:\n this.dash.push(source);\n break;\n case MediaFormat.HLS.name:\n this.hls.push(source);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourcesObject} - The json class object.\n */\n toJSON(): ProviderMediaSourcesObject {\n const response: ProviderMediaSourcesObject = {\n progressive: [],\n dash: [],\n hls: []\n };\n this.progressive.forEach(p => response.progressive.push(p.toJSON()));\n this.hls.forEach(h => response.hls.push(h.toJSON()));\n this.dash.forEach(d => response.dash.push(d.toJSON()));\n return response;\n }\n}\n","//@flow\nimport Drm from './drm';\n\nexport default class MediaSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n /**\n * @member - media source drm data\n * @type {Array}\n */\n drmData: Array;\n /**\n * @member - media source bandwidth\n * @type {number}\n */\n bandwidth: number;\n /**\n * @member - media source width\n * @type {number}\n */\n width: number;\n /**\n * @member - media source height\n * @type {number}\n */\n height: number;\n /**\n * @member - media source label\n * @type {string}\n */\n label: string;\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourceObject} - The json class object.\n */\n toJSON(): ProviderMediaSourceObject {\n const response: ProviderMediaSourceObject = {\n id: this.id,\n url: this.url,\n mimetype: this.mimetype\n };\n if (this.bandwidth) response.bandwidth = this.bandwidth;\n if (this.width) response.width = this.width;\n if (this.height) response.height = this.height;\n if (this.label) response.label = this.label;\n if (this.drmData && this.drmData.length > 0) {\n response.drmData = [];\n this.drmData.forEach(d => {\n if (Array.isArray(response.drmData)) {\n response.drmData.push(d.toJSON());\n }\n });\n }\n return response;\n }\n}\n","// @flow\nimport MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';\nimport Error from '../../util/error/error';\n\nexport default class DataLoaderManager {\n /**\n * @member - Loaders response map index\n * @type {Map>}\n * @private\n */\n _loadersResponseMap: Map> = new Map();\n /**\n * @member - Loaders multi request\n * @type {MultiRequestBuilder}\n * @protected\n */\n _multiRequest: MultiRequestBuilder;\n /**\n * @member - Loaders multi response\n * @type {MultiRequestResult}\n * @private\n */\n _multiResponse: MultiRequestResult;\n /**\n * @member - Loaders to execute\n * @type {Map}\n * @private\n */\n _loaders: Map = new Map();\n\n _networkRetryConfig: ProviderNetworkRetryParameters;\n\n constructor(networkRetryConfig: ProviderNetworkRetryParameters) {\n this._networkRetryConfig = networkRetryConfig;\n }\n\n /**\n * Add loader to execution loaders map\n * @function\n * @param {Function} loader Loader to add\n * @param {Object} params Loader params\n * @param {string} ks ks\n * @returns {void}\n */\n add(loader: Function, params: Object, ks?: string): void {\n let execution_loader = new loader(params);\n if (execution_loader.isValid()) {\n this._loaders.set(loader.id, execution_loader);\n // Get the start index from the multiReqeust before adding current execution_loader requests\n let startIndex = this._multiRequest.requests.length;\n // Get the requests\n let requests = execution_loader.requests;\n this._multiRequest.retryConfig = this._networkRetryConfig;\n // Add requests to multiRequest queue\n requests.forEach(request => {\n request.params = request.params || {};\n request.params.ks = request.params.ks || ks;\n this._multiRequest.add(request);\n });\n // Create range array of current execution_loader requests\n let executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);\n // Add to map\n this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);\n }\n }\n\n /**\n * Get data from all loaders using multi request\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @function\n * @returns {Promise} Promise\n */\n fetchData(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n this._multiRequest.execute(requestsMustSucceed).then(\n data => {\n this._multiResponse = data.response;\n let preparedData: Object = this.prepareData(data.response);\n if (preparedData.success) {\n resolve(this._loaders);\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {\n headers: data.headers\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n /**\n * Prepare fetched data\n * @function\n * @param {MultiRequestResult} response - The multi request result\n * @returns {Object} - The prepared data\n */\n prepareData(response: MultiRequestResult): Object {\n this._loaders.forEach((loader, name) => {\n let loaderDataIndexes = this._loadersResponseMap.get(name);\n try {\n if (loaderDataIndexes && loaderDataIndexes.length > 0) {\n loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);\n }\n } catch (err) {\n return {success: false, error: err};\n }\n });\n return {success: true, data: this._loaders};\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = this.results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.results = results;\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nexport default class Drm {\n /**\n * @member - license url\n * @type {string}\n */\n licenseUrl: string;\n /**\n * @member - drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - drm certificate\n * @type {string}\n */\n certificate: string;\n\n /**\n * @constructor\n * @param {string} licenseUrl - the license url\n * @param {string} scheme - the drm scheme\n * @param {?string} certificate - the drm certificate\n */\n constructor(licenseUrl: string, scheme: string, certificate: ?string) {\n this.licenseUrl = licenseUrl;\n this.scheme = scheme;\n if (certificate) {\n this.certificate = certificate;\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderDrmDataObject} - The json class object.\n */\n toJSON(): ProviderDrmDataObject {\n const response: ProviderDrmDataObject = {\n licenseUrl: this.licenseUrl,\n scheme: this.scheme\n };\n if (this.certificate) response.certificate = this.certificate;\n return response;\n }\n}\n","// @flow\nimport {getLogLevel, setLogLevel, setLogger, type LogLevelType, LogLevel} from '../../util/logger';\nimport DataLoaderManager from './data-loader-manager';\nimport Error from '../../util/error/error';\n\nexport default class BaseProvider {\n _partnerId: number;\n _widgetId: ?string;\n _ks: string;\n _uiConfId: ?number;\n _dataLoader: DataLoaderManager;\n _playerVersion: string;\n _logger: any;\n _isAnonymous: boolean;\n _networkRetryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n get partnerId(): number {\n return this._partnerId;\n }\n\n get widgetId(): string {\n return this._widgetId || this.defaultWidgetId;\n }\n\n get defaultWidgetId(): string {\n return '_' + this._partnerId;\n }\n\n get uiConfId(): ?number {\n return this._uiConfId;\n }\n\n get ks(): string {\n return this._ks;\n }\n\n set ks(value: string): void {\n this._ks = value;\n }\n\n get playerVersion(): string {\n return this._playerVersion;\n }\n\n get isAnonymous(): boolean {\n return this._isAnonymous;\n }\n\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n setLogger(options.logger);\n this._partnerId = options.partnerId;\n this._widgetId = options.widgetId;\n this._uiConfId = options.uiConfId;\n this._isAnonymous = !options.ks;\n this._ks = options.ks || '';\n this._playerVersion = playerVersion;\n }\n\n // eslint-disable-next-line no-unused-vars\n getMediaConfig(mediaInfo: MI): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'getMediaConfig method must be implement by the derived class'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading playlist by id'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading entry list'\n })\n );\n }\n\n _verifyHasSources(sources: ProviderMediaConfigSourcesObject) {\n if (sources.hls.concat(sources.dash, sources.progressive).length === 0) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {\n action: '',\n messages: `No play source for entry id: ${sources.id}`\n });\n }\n }\n\n get LogLevel(): LogLevelType {\n return LogLevel;\n }\n\n getLogLevel(name?: string): Object {\n return getLogLevel(name);\n }\n\n setLogLevel(level: Object, name?: string): void {\n setLogLevel(level, name);\n }\n}\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class EntryList {\n /**\n * @member - entry list items\n * @type {Array}\n */\n items: Array;\n\n constructor() {\n this.items = [];\n }\n}\n","//@flow\n\nexport default class Bumper {\n /**\n * @member - bumper url\n * @type {string}\n */\n url: string;\n /**\n * @member - bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n\n /**\n * @constructor\n * @param {Object} data - The bumper response\n */\n constructor(data: Object) {\n this.url = data.url;\n this.clickThroughUrl = data.clickThroughUrl;\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceParams: {\n apiVersion: '5.2.6'\n }\n};\n\nexport default class OTTConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OTTConfiguration};\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OTTConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OTTService {\n /**\n * Gets a new instance of MultiRequestBuilder with ott params\n * @function getMultiRequest\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OTTConfiguration.get();\n const ottParams = config.serviceParams;\n if (ks) {\n Object.assign(ottParams, {ks: ks});\n }\n if (partnerId) {\n Object.assign(ottParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ottParams;\n return multiReq;\n }\n}\n","// @flow\nimport DataLoaderManager from '../../common/data-loader-manager';\nimport OTTService from '../services/ott-service';\n/**\n * OTTDataLoaderManager is a class that handles the OTT data loading\n * @param {string} partnerId - partner id\n * @param {string} ks - ks\n * @param {ProviderNetworkRetryParameters} [networkRetryConfig] - network retry configuration\n */\nexport default class OTTDataLoaderManager extends DataLoaderManager {\n constructor(partnerId: number, ks: string = '', networkRetryConfig: ProviderNetworkRetryParameters) {\n super(networkRetryConfig);\n this._multiRequest = OTTService.getMultiRequest(ks, partnerId);\n }\n}\n","//@flow\nimport OTTService from './ott-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'ottuser';\n\nexport default class OTTUserService extends OTTService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} partnerId The partner ID\n * @param {string} udid The udid\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static anonymousLogin(serviceUrl: string, partnerId: number, udid?: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'anonymousLogin';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n const params: Object = {partnerId: partnerId};\n if (udid) {\n Object.assign(params, {udid: udid});\n }\n request.params = params;\n return request;\n }\n}\n","//@flow\nimport UserService from '../services/user-service';\nimport OTTConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\n\nexport default class OTTSessionLoader implements ILoader {\n _partnerId: number;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'session';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._partnerId = params.partnerId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.ks = response[0].data.ks;\n }\n\n get response(): any {\n return this._response.ks;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OTTConfiguration.get();\n const requests: Array = [];\n requests.push(UserService.anonymousLogin(config.serviceUrl, params.partnerId, params.udid));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._partnerId;\n }\n}\n","//@flow\nimport OTTService from './ott-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'asset';\n\nexport default class OTTAssetService extends OTTService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The partner ID\n * @param {string} assetId The asset ID\n * @param {string} type The asset type (media/recording/epg)\n * @param {ProviderPlaybackContextOptions} playbackContextOptions The playbackContextOptions\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static getPlaybackContext(\n serviceUrl: string,\n ks: string,\n assetId: string,\n type: string,\n playbackContextOptions: ProviderPlaybackContextOptions\n ): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'getPlaybackContext';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n const contextDataParams: Object = {objectType: 'KalturaPlaybackContextOptions'};\n Object.assign(contextDataParams, playbackContextOptions);\n request.params = {assetId: assetId, assetType: type, contextDataParams: contextDataParams, ks: ks};\n return request;\n }\n\n static get(serviceUrl: string, ks: string, assetId: string, assetReferenceType: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'get';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.params = {id: assetId, assetReferenceType: assetReferenceType, ks: ks};\n return request;\n }\n}\n","//@flow\nexport default class KalturaRuleAction {\n static Type: {[type: string]: string | number} = {\n BLOCK: 'BLOCK',\n START_DATE_OFFSET: 'START_DATE_OFFSET',\n END_DATE_OFFSET: 'END_DATE_OFFSET',\n USER_BLOCK: 'USER_BLOCK',\n ALLOW_PLAYBACK: 'ALLOW_PLAYBACK',\n BLOCK_PLAYBACK: 'BLOCK_PLAYBACK',\n APPLY_DISCOUNT_MODULE: 'APPLY_DISCOUNT_MODULE'\n };\n\n /**\n * @member - The type of the action\n * @type {string|number}\n */\n type: string | number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.type = data.type;\n }\n}\n","//@flow\nimport {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';\n\nexport type OTTKalturaPlaybackSource = KalturaPlaybackSource;\n\nexport default class KalturaPlaybackSource {\n format: string;\n protocols: string;\n drm: Array = [];\n adsPolicy: string;\n adsParam: string;\n duration: number;\n url: string;\n type: string;\n fileId: number;\n\n /**\n * @constructor\n * @param {Object} source The response\n */\n constructor(source: Object) {\n this.format = source.format;\n this.adsPolicy = source.adsPolicy;\n this.adsParam = source.adsParam;\n this.duration = source.duration;\n this.url = source.url;\n this.type = source.type;\n this.fileId = source.id;\n this.protocols = source.protocols;\n if (source.drm) {\n source.drm.map(drm => this.drm.push(new KalturaDrmPlaybackPluginData(drm)));\n }\n }\n\n /**\n * Checks if source has DRM data\n * @function hasDrmData\n * @returns {boolean} Is source has DRM\n */\n hasDrmData(): boolean {\n return this.drm && this.drm.length > 0;\n }\n\n /**\n * Returns source desired protocol if supported\n * @param {string} protocol - the desired protocol for the source (base play url protocol)\n * @returns {string} - protocol if protocol is in the protocols list - if not empty string returned\n */\n getProtocol(protocol: string): string {\n let returnValue: string = '';\n if (this.protocols && this.protocols.length > 0) {\n let protocolsArr: Array = this.protocols.split(',');\n protocolsArr.forEach(p => {\n if (p === protocol) {\n returnValue = p;\n }\n });\n } else if (protocol === 'http') {\n return protocol;\n }\n return returnValue;\n }\n}\n","//@flow\nexport default class KalturaBumpersPlaybackPluginData {\n static StreamerType: {[type: string]: string} = {\n HLS: 'hls',\n DASH: 'dash',\n PROGRESSIVE: 'progressive'\n };\n\n /**\n * @member - The streamer type\n * @type {string}\n */\n streamertype: string;\n /**\n * @member - The url\n * @type {string}\n */\n url: string;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.streamertype = data.streamertype;\n this.url = data.url;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';\nimport KalturaRuleAction from './kaltura-rule-action';\nimport KalturaPlaybackSource from './kaltura-playback-source';\nimport KalturaBumpersPlaybackPluginData from './kaltura-bumper-playback-plugin-data';\n\nexport default class KalturaPlaybackContext extends ServiceResult {\n static Type: {[type: string]: string} = {\n TRAILER: 'TRAILER',\n CATCHUP: 'CATCHUP',\n START_OVER: 'START_OVER',\n PLAYBACK: 'PLAYBACK'\n };\n /**\n * @member - The playback sources\n * @type {Array}\n */\n sources: Array = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array}\n */\n actions: Array = [];\n /**\n * @member - Array of access control massages\n * @type {Array}\n */\n messages: Array = [];\n /**\n * @member - Array of bumper plugins\n * @type {Array}\n */\n plugins: Array = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n const messages = response.messages;\n if (messages) {\n messages.map(message => this.messages.push(new KalturaAccessControlMessage(message)));\n }\n const actions = response.actions;\n if (actions) {\n actions.map(action => this.actions.push(new KalturaRuleAction(action)));\n }\n const sources = response.sources;\n if (sources) {\n sources.map(source => this.sources.push(new KalturaPlaybackSource(source)));\n }\n const plugins = response.plugins;\n if (plugins) {\n plugins.map(plugin => this.plugins.push(new KalturaBumpersPlaybackPluginData(plugin)));\n }\n }\n }\n\n hasBlockAction(): boolean {\n return this.getBlockAction() !== undefined;\n }\n\n getBlockAction(): ?KalturaRuleAction {\n return this.actions.find(action => action.type === KalturaRuleAction.Type.BLOCK);\n }\n\n getErrorMessages(): Array {\n return this.messages;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\n\nexport default class KalturaAsset extends ServiceResult {\n static Type: {[type: string]: string} = {\n MEDIA: 'media',\n RECORDING: 'recording',\n EPG: 'epg'\n };\n\n static AssetReferenceType: {[type: string]: string} = {\n MEDIA: 'media',\n EPG_INTERNAL: 'epg_internal',\n EPG_EXTERNAL: 'epg_external',\n NPVR: 'nPVR'\n };\n /**\n * @member - The asset id\n * @type {number}\n */\n id: number;\n /**\n * @member - The asset name\n * @type {string}\n */\n name: string = '';\n /**\n * @member - The asset name description\n * @type {string}\n */\n description: string = '';\n /**\n * @member - The asset tags\n * @type {Array}\n */\n tags: Array = [];\n /**\n * @member - The asset metas\n * @type {Array}\n */\n metas: Array = [];\n /**\n * @member - The asset images\n * @type {Array}\n */\n pictures: Array = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n this.id = response.id;\n this.name = response.name;\n this.description = response.description;\n this.metas = this._formatTagsMetas(response.metas);\n this.tags = this._formatTagsMetas(response.tags);\n this.pictures = response.images;\n }\n }\n\n _formatTagsMetas(objectToParse: any): Array {\n const parsed = [];\n Object.keys(objectToParse).forEach(function (key) {\n if (objectToParse[key].objects) {\n let value = '';\n objectToParse[key].objects.forEach(function (object) {\n value += object.value + '|';\n });\n parsed.push({key: key, value: value});\n } else {\n parsed.push({key: key, value: objectToParse[key].value});\n }\n });\n return parsed;\n }\n}\n","//@flow\nimport OTTAssetService from '../services/asset-service';\nimport OTTConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\nimport KalturaPlaybackContext from '../response-types/kaltura-playback-context';\nimport KalturaAsset from '../response-types/kaltura-asset';\n\ntype OTTAssetLoaderResponse = {mediaDataResult: KalturaAsset, playBackContextResult: KalturaPlaybackContext};\nexport type {OTTAssetLoaderResponse};\n\nexport default class OTTAssetLoader implements ILoader {\n _entryId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'asset';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entryId = params.entryId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.mediaDataResult = new KalturaAsset(response[0].data);\n this._response.playBackContextResult = new KalturaPlaybackContext(response[1].data);\n }\n\n get response(): OTTAssetLoaderResponse {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OTTConfiguration.get();\n const requests: Array = [];\n requests.push(OTTAssetService.get(config.serviceUrl, params.ks, params.entryId, params.assetReferenceType));\n requests.push(OTTAssetService.getPlaybackContext(config.serviceUrl, params.ks, params.entryId, params.type, params.playbackContext));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._entryId;\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OTTConfiguration from '../config';\nimport OTTAssetService from '../services/asset-service';\nimport KalturaAsset from '../response-types/kaltura-asset';\n\nexport default class OTTAssetListLoader implements ILoader {\n _entries: Array;\n _requests: Array;\n _response: any = {playlistItems: {entries: []}};\n\n static get id(): string {\n return 'asset_list';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entries = params.entries;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n response.forEach(item => {\n this._response.playlistItems.entries.push({mediaDataResult: new KalturaAsset(item.data)});\n });\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OTTConfiguration.get();\n const requests: Array = [];\n params.entries.forEach(entry => {\n const assetReferenceType = entry.assetReferenceType || KalturaAsset.AssetReferenceType.MEDIA;\n requests.push(OTTAssetService.get(config.serviceUrl, params.ks, entry.entryId || entry, assetReferenceType));\n });\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entries && this._entries.length);\n }\n}\n","//@flow\nimport getLogger from '../../util/logger';\nimport KalturaPlaybackSource from './response-types/kaltura-playback-source';\nimport KalturaPlaybackContext from './response-types/kaltura-playback-context';\nimport KalturaAsset from './response-types/kaltura-asset';\nimport MediaEntry from '../../entities/media-entry';\nimport Drm from '../../entities/drm';\nimport MediaSource from '../../entities/media-source';\nimport MediaSources from '../../entities/media-sources';\nimport EntryList from '../../entities/entry-list';\nimport Bumper from '../../entities/bumper';\nimport {SupportedStreamFormat, isProgressiveSource} from '../../entities/media-format';\nimport {KalturaDrmPlaybackPluginData} from '../common/response-types/kaltura-drm-playback-plugin-data';\nimport KalturaRuleAction from './response-types/kaltura-rule-action';\nimport {KalturaAccessControlMessage} from '../common/response-types/kaltura-access-control-message';\nimport type {OTTAssetLoaderResponse} from './loaders/asset-loader';\nimport KalturaBumpersPlaybackPluginData from './response-types/kaltura-bumper-playback-plugin-data';\n\nconst LIVE_ASST_OBJECT_TYPE: string = 'KalturaLiveAsset';\n\nconst MediaTypeCombinations: {[mediaType: string]: Object} = {\n [KalturaAsset.Type.MEDIA]: {\n [KalturaPlaybackContext.Type.TRAILER]: () => ({type: MediaEntry.Type.VOD}),\n [KalturaPlaybackContext.Type.PLAYBACK]: mediaAssetData => {\n if (mediaAssetData.objectType === LIVE_ASST_OBJECT_TYPE) {\n return {type: MediaEntry.Type.LIVE, dvrStatus: mediaAssetData.enableTrickPlay ? MediaEntry.DvrStatus.ON : MediaEntry.DvrStatus.OFF};\n } else if (parseInt(mediaAssetData.externalIds) > 0) {\n return {type: MediaEntry.Type.LIVE, dvrStatus: MediaEntry.DvrStatus.OFF};\n }\n return {type: MediaEntry.Type.VOD};\n }\n },\n [KalturaAsset.Type.EPG]: {\n [KalturaPlaybackContext.Type.CATCHUP]: () => ({type: MediaEntry.Type.VOD}),\n [KalturaPlaybackContext.Type.START_OVER]: () => ({type: MediaEntry.Type.LIVE, dvrStatus: MediaEntry.DvrStatus.ON})\n },\n [KalturaAsset.Type.RECORDING]: {\n [KalturaPlaybackContext.Type.PLAYBACK]: () => ({type: MediaEntry.Type.VOD})\n }\n};\n\nexport default class OTTProviderParser {\n static _logger = getLogger('OTTProviderParser');\n\n /**\n * Returns parsed media entry by given OTT response objects.\n * @function getMediaEntry\n * @param {any} assetResponse - The asset response.\n * @param {Object} requestData - The request data object.\n * @returns {MediaEntry} - The media entry\n * @static\n * @public\n */\n static getMediaEntry(assetResponse: any, requestData: Object): MediaEntry {\n const mediaEntry = new MediaEntry();\n OTTProviderParser._fillBaseData(mediaEntry, assetResponse, requestData);\n const playbackContext = assetResponse.playBackContextResult;\n const mediaAsset = assetResponse.mediaDataResult;\n const kalturaSources = playbackContext.sources;\n const filteredKalturaSources = OTTProviderParser._filterSourcesByFormats(kalturaSources, requestData.formats);\n mediaEntry.sources = OTTProviderParser._getParsedSources(filteredKalturaSources);\n const typeData = OTTProviderParser._getMediaType(mediaAsset.data, requestData.mediaType, requestData.contextType);\n mediaEntry.type = typeData.type;\n mediaEntry.dvrStatus = typeData.dvrStatus;\n mediaEntry.duration = Math.max.apply(\n Math,\n kalturaSources.map(source => source.duration)\n );\n return mediaEntry;\n }\n\n /**\n * Returns parsed entry list by given OTT response objects\n * @function getEntryList\n * @param {any} playlistResponse - response\n * @param {Array} requestEntries - entries list\n * @returns {Playlist} - The entry list\n * @static\n * @public\n */\n static getEntryList(playlistResponse: any, requestEntries: Array): EntryList {\n const entryList = new EntryList();\n const playlistItems = playlistResponse.playlistItems.entries;\n playlistItems.forEach(entry => {\n const mediaEntry = new MediaEntry();\n const requestData = requestEntries.find(requestEntry => requestEntry.entryId === entry.mediaDataResult.id);\n OTTProviderParser._fillBaseData(mediaEntry, entry, requestData);\n entryList.items.push(mediaEntry);\n });\n return entryList;\n }\n\n /**\n * Returns parsed bumper by given OTT response objects.\n * @function getBumper\n * @param {any} assetResponse - The asset response.\n * @returns {?Bumper} - The bumper\n * @static\n * @public\n */\n static getBumper(assetResponse: any): ?Bumper {\n const playbackContext = assetResponse.playBackContextResult;\n const progressiveBumper = playbackContext.plugins.find(\n bumper => bumper.streamertype === KalturaBumpersPlaybackPluginData.StreamerType.PROGRESSIVE\n );\n if (progressiveBumper) {\n return new Bumper(progressiveBumper);\n }\n }\n\n static _fillBaseData(mediaEntry: MediaEntry, assetResponse: any, requestData: any) {\n const mediaAsset = assetResponse.mediaDataResult;\n const metaData = OTTProviderParser.reconstructMetadata(mediaAsset);\n metaData.description = mediaAsset.description;\n metaData.name = mediaAsset.name;\n if (mediaAsset.data.epgId) metaData.epgId = mediaAsset.data.epgId;\n if (mediaAsset.data.recordingId) metaData.recordingId = mediaAsset.data.recordingId;\n if (requestData && requestData.mediaType) metaData.mediaType = requestData.mediaType;\n mediaEntry.metadata = metaData;\n mediaEntry.poster = OTTProviderParser._getPoster(mediaAsset.pictures);\n mediaEntry.id = mediaAsset.id;\n return mediaEntry;\n }\n\n /**\n * reconstruct the metadata\n * @param {Object} mediaAsset the mediaAsset that contains the response with the metadata.\n * @returns {Object} reconstructed metadata object\n */\n static reconstructMetadata(mediaAsset: Object): Object {\n const metadata = {\n metas: OTTProviderParser.addToMetaObject(mediaAsset.metas),\n tags: OTTProviderParser.addToMetaObject(mediaAsset.tags)\n };\n return metadata;\n }\n\n /**\n * transform an array of [{key: value},{key: value}...] to an object\n * @param {Array} list a list of objects\n * @returns {Object} an mapped object of the arrayed list.\n */\n static addToMetaObject(list: Array): Object {\n let categoryObj = {};\n if (list) {\n list.forEach(item => {\n categoryObj[item.key] = item.value;\n });\n }\n return categoryObj;\n }\n\n /**\n * Gets the poster url without width and height.\n * @param {Array} pictures - Media pictures.\n * @returns {string | Array} - Poster base url or array of poster candidates.\n * @private\n */\n static _getPoster(pictures: Array): string | Array {\n if (pictures && pictures.length > 0) {\n const picObj = pictures[0];\n const url = picObj.url;\n // Search for thumbnail service\n const regex = /.*\\/thumbnail\\/.*(?:width|height)\\/\\d+\\/(?:height|width)\\/\\d+/;\n if (regex.test(url)) {\n return url;\n }\n return pictures.map(pic => ({url: pic.url, width: pic.width, height: pic.height}));\n }\n return '';\n }\n\n /**\n * Gets the media type (LIVE/VOD)\n * @param {Object} mediaAssetData - The media asset data.\n * @param {string} mediaType - The asset media type.\n * @param {string} contextType - The asset context type.\n * @returns {Object} - The type data object.\n * @private\n */\n static _getMediaType(mediaAssetData: Object, mediaType: string, contextType: string): Object {\n let typeData = {type: MediaEntry.Type.UNKNOWN};\n if (MediaTypeCombinations[mediaType] && MediaTypeCombinations[mediaType][contextType]) {\n typeData = MediaTypeCombinations[mediaType][contextType](mediaAssetData);\n }\n return typeData;\n }\n\n /**\n * Filtered the kalturaSources array by device type.\n * @param {Array} kalturaSources - The kaltura sources.\n * @param {Array} formats - Partner device formats.\n * @returns {Array} - Filtered kalturaSources array.\n * @private\n */\n static _filterSourcesByFormats(kalturaSources: Array, formats: Array): Array {\n if (formats.length > 0) {\n kalturaSources = kalturaSources.filter(source => formats.includes(source.type));\n }\n return kalturaSources;\n }\n\n /**\n * Returns the parsed sources\n * @function _getParsedSources\n * @param {Array} kalturaSources - The kaltura sources\n * @param {Object} playbackContext - The playback context\n * @return {MediaSources} - A media sources\n * @static\n * @private\n */\n static _getParsedSources(kalturaSources: Array): MediaSources {\n const sources = new MediaSources();\n const addAdaptiveSource = (source: KalturaPlaybackSource) => {\n const parsedSource = OTTProviderParser._parseAdaptiveSource(source);\n if (parsedSource) {\n const sourceFormat = SupportedStreamFormat.get(source.format);\n sources.map(parsedSource, sourceFormat);\n }\n };\n const parseAdaptiveSources = () => {\n kalturaSources.filter(source => !isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n const parseProgressiveSources = () => {\n kalturaSources.filter(source => isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n if (kalturaSources && kalturaSources.length > 0) {\n parseAdaptiveSources();\n parseProgressiveSources();\n }\n return sources;\n }\n\n /**\n * Returns a parsed adaptive source\n * @function _parseAdaptiveSource\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @returns {?MediaSource} - The parsed adaptive kalturaSource\n * @static\n * @private\n */\n static _parseAdaptiveSource(kalturaSource: ?KalturaPlaybackSource): ?MediaSource {\n const mediaSource = new MediaSource();\n if (kalturaSource) {\n const playUrl = kalturaSource.url;\n const mediaFormat = SupportedStreamFormat.get(kalturaSource.format);\n if (mediaFormat) {\n mediaSource.mimetype = mediaFormat.mimeType;\n }\n if (!playUrl) {\n OTTProviderParser._logger.error(\n `failed to create play url from source, discarding source: (${kalturaSource.fileId}), ${kalturaSource.format}.`\n );\n return null;\n }\n mediaSource.url = playUrl;\n mediaSource.id = kalturaSource.fileId + ',' + kalturaSource.format;\n if (kalturaSource.hasDrmData()) {\n const drmParams: Array = [];\n kalturaSource.drm.forEach(drm => {\n drmParams.push(new Drm(drm.licenseURL, KalturaDrmPlaybackPluginData.Scheme[drm.scheme], drm.certificate));\n });\n mediaSource.drmData = drmParams;\n }\n }\n return mediaSource;\n }\n\n static hasBlockAction(response: OTTAssetLoaderResponse): boolean {\n return response.playBackContextResult.hasBlockAction();\n }\n\n static getBlockAction(response: OTTAssetLoaderResponse): ?KalturaRuleAction {\n return response.playBackContextResult.getBlockAction();\n }\n\n static getErrorMessages(response: OTTAssetLoaderResponse): Array {\n return response.playBackContextResult.getErrorMessages();\n }\n}\n","// @flow\nimport BaseProvider from '../common/base-provider';\nimport getLogger from '../../util/logger';\nimport OTTConfiguration from './config';\nimport OTTDataLoaderManager from './loaders/data-loader-manager';\nimport OTTSessionLoader from './loaders/session-loader';\nimport OTTAssetLoader from './loaders/asset-loader';\nimport OTTAssetListLoader from './loaders/asset-list-loader';\nimport OTTProviderParser from './provider-parser';\nimport KalturaAsset from './response-types/kaltura-asset';\nimport KalturaPlaybackContext from './response-types/kaltura-playback-context';\nimport MediaEntry from '../../entities/media-entry';\nimport Error from '../../util/error/error';\n\nexport default class OTTProvider extends BaseProvider {\n /**\n * @constructor\n * @param {ProviderOptionsObject} options - provider options\n * @param {string} playerVersion - player version\n */\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n super(options, playerVersion);\n this._logger = getLogger('OTTProvider');\n OTTConfiguration.set(options.env);\n this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);\n }\n\n get env() {\n return OTTConfiguration.get();\n }\n\n /**\n * Gets the backend media config.\n * @param {OTTProviderMediaInfoObject} mediaInfo - ott media info\n * @returns {Promise} - The provider media config\n */\n getMediaConfig(mediaInfo: OTTProviderMediaInfoObject): Promise {\n if (mediaInfo.ks) {\n this.ks = mediaInfo.ks;\n this._isAnonymous = false;\n }\n this._dataLoader = new OTTDataLoaderManager(this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entryId = mediaInfo.entryId;\n if (entryId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OTTSessionLoader, {partnerId: this.partnerId});\n }\n const contextType = mediaInfo.contextType || KalturaPlaybackContext.Type.PLAYBACK;\n const mediaType = mediaInfo.mediaType || KalturaAsset.Type.MEDIA;\n const assetReferenceType = mediaInfo.assetReferenceType || KalturaAsset.AssetReferenceType.MEDIA;\n const playbackContext: ProviderPlaybackContextOptions = {\n mediaProtocol: mediaInfo.protocol,\n assetFileIds: mediaInfo.fileIds,\n context: contextType\n };\n if (mediaInfo.streamerType) {\n playbackContext.streamerType = mediaInfo.streamerType;\n }\n if (mediaInfo.urlType) {\n playbackContext.urlType = mediaInfo.urlType;\n }\n if (mediaInfo.adapterData) {\n playbackContext.adapterData = mediaInfo.adapterData;\n }\n this._dataLoader.add(OTTAssetLoader, {\n entryId: entryId,\n ks: ks,\n type: mediaType,\n playbackContext: playbackContext,\n assetReferenceType: assetReferenceType\n });\n const requestData = {\n contextType: contextType,\n mediaType: mediaType,\n formats: mediaInfo.formats || []\n };\n return this._dataLoader.fetchData().then(\n response => {\n try {\n resolve(this._parseDataFromResponse(response, requestData));\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));\n }\n });\n }\n\n _parseDataFromResponse(data: Map, requestData: Object): ProviderMediaConfigObject {\n this._logger.debug('Data parsing started');\n const mediaConfig: ProviderMediaConfigObject = {\n session: {\n isAnonymous: this._isAnonymous,\n partnerId: this.partnerId\n },\n sources: this._getDefaultSourcesObject(),\n plugins: {}\n };\n if (this.uiConfId) {\n mediaConfig.session.uiConfId = this.uiConfId;\n }\n if (data) {\n if (data.has(OTTSessionLoader.id)) {\n const sessionLoader = data.get(OTTSessionLoader.id);\n if (sessionLoader && sessionLoader.response) {\n mediaConfig.session.ks = sessionLoader.response;\n }\n } else {\n mediaConfig.session.ks = this.ks;\n }\n if (data.has(OTTAssetLoader.id)) {\n const assetLoader = data.get(OTTAssetLoader.id);\n if (assetLoader && assetLoader.response && Object.keys(assetLoader.response).length) {\n const response = (assetLoader: OTTAssetLoader).response;\n if (OTTProviderParser.hasBlockAction(response)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {\n action: OTTProviderParser.getBlockAction(response),\n messages: OTTProviderParser.getErrorMessages(response)\n });\n }\n const mediaEntry = OTTProviderParser.getMediaEntry(response, requestData);\n Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));\n this._verifyHasSources(mediaConfig.sources);\n const bumper = OTTProviderParser.getBumper(response);\n if (bumper) {\n Object.assign(mediaConfig.plugins, {bumper});\n }\n }\n }\n }\n this._logger.debug('Data parsing finished', mediaConfig);\n return mediaConfig;\n }\n\n /**\n * Gets playlist config from entry list.\n * @param {ProviderEntryListObject} entryListInfo - ott entry list info\n * @returns {Promise} - The provider playlist config\n */\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n if (entryListInfo.ks) {\n this.ks = entryListInfo.ks;\n this._isAnonymous = false;\n }\n this._dataLoader = new OTTDataLoaderManager(this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entries = entryListInfo.entries;\n if (entries && entries.length) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OTTSessionLoader, {partnerId: this.partnerId});\n }\n this._dataLoader.add(OTTAssetListLoader, {entries, ks});\n this._dataLoader.fetchData(false).then(\n response => {\n resolve(this._parseEntryListDataFromResponse(response, entries));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parseEntryListDataFromResponse(data: Map, requestEntries: Array): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = {\n id: '',\n metadata: {\n name: '',\n description: ''\n },\n poster: '',\n items: []\n };\n if (data && data.has(OTTAssetListLoader.id)) {\n const playlistLoader = data.get(OTTAssetListLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const entryList = OTTProviderParser.getEntryList(playlistLoader.response, requestEntries);\n entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n _getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {\n return {\n hls: [],\n dash: [],\n progressive: [],\n id: '',\n duration: 0,\n type: MediaEntry.Type.UNKNOWN,\n poster: '',\n dvr: false,\n vr: null,\n metadata: {\n name: '',\n description: '',\n tags: ''\n }\n };\n }\n\n _getSourcesObject(mediaEntry: MediaEntry) {\n const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();\n const mediaSources = mediaEntry.sources.toJSON();\n sourcesObject.hls = mediaSources.hls;\n sourcesObject.dash = mediaSources.dash;\n sourcesObject.progressive = mediaSources.progressive;\n sourcesObject.id = mediaEntry.id;\n sourcesObject.duration = mediaEntry.duration;\n sourcesObject.type = mediaEntry.type;\n sourcesObject.dvr = !!mediaEntry.dvrStatus;\n sourcesObject.poster = mediaEntry.poster;\n if (\n mediaEntry.metadata &&\n mediaEntry.metadata.metas &&\n typeof mediaEntry.metadata.metas.tags === 'string' &&\n mediaEntry.metadata.metas.tags.indexOf('360') > -1\n ) {\n sourcesObject.vr = {};\n }\n Object.assign(sourcesObject.metadata, mediaEntry.metadata);\n return sourcesObject;\n }\n}\n","// @flow\nimport OTTProvider from './provider';\nimport KalturaPlaybackContext from './response-types/kaltura-playback-context';\nimport KalturaAsset from './response-types/kaltura-asset';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-ott';\nconst VERSION = __VERSION__;\n\nconst ContextType = KalturaPlaybackContext.Type;\nconst MediaType = KalturaAsset.Type;\n\nexport {OTTProvider as Provider, ContextType, MediaType, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./entities/media-entry.js","./providers/./util/request-builder.js","./providers/./util/logger.js","./providers/./k-provider/common/base-service-result.js","./providers/./entities/media-format.js","./providers/./k-provider/common/response-types/kaltura-drm-playback-plugin-data.js","./providers/./k-provider/common/response-types/kaltura-access-control-message.js","./providers/./entities/media-sources.js","./providers/./entities/media-source.js","./providers/./k-provider/common/data-loader-manager.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./entities/drm.js","./providers/./k-provider/common/base-provider.js","./providers/./util/clone.js","./providers/./entities/entry-list.js","./providers/./entities/bumper.js","./providers/./k-provider/ott/config.js","./providers/./k-provider/ott/services/ott-service.js","./providers/./k-provider/ott/loaders/data-loader-manager.js","./providers/./k-provider/ott/services/user-service.js","./providers/./k-provider/ott/loaders/session-loader.js","./providers/./k-provider/ott/services/asset-service.js","./providers/./k-provider/ott/response-types/kaltura-rule-action.js","./providers/./k-provider/ott/response-types/kaltura-playback-source.js","./providers/./k-provider/ott/response-types/kaltura-bumper-playback-plugin-data.js","./providers/./k-provider/ott/response-types/kaltura-playback-context.js","./providers/./k-provider/ott/response-types/kaltura-asset.js","./providers/./k-provider/ott/loaders/asset-loader.js","./providers/./k-provider/ott/loaders/asset-list-loader.js","./providers/./k-provider/ott/provider-parser.js","./providers/./k-provider/ott/provider.js","./providers/./k-provider/ott/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","MediaEntry","metadata","Map","sources","MediaSources","type","Type","UNKNOWN","toJSON","id","duration","dvrStatus","status","poster","assetReferenceType","VOD","LIVE","IMAGE","AUDIO","ON","OFF","RequestBuilder","headers","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","JsLogger","VERSION","DEBUG","INFO","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","LogLevel","setLogger","logger","getLogLevel","setLogLevel","level","ServiceResult","objectType","hasError","ServiceError","message","MediaFormat","DASH","mimeType","pathExt","HLS","WVM","MP4","MP3","SupportedStreamFormat","isProgressiveSource","formatName","sourceFormat","KalturaDrmPlaybackPluginData","drm","scheme","licenseURL","certificate","WIDEVINE_CENC","PLAYREADY_CENC","FAIRPLAY","KalturaAccessControlMessage","progressive","dash","hls","map","source","mediaFormat","push","h","MediaSource","mimetype","bandwidth","width","height","label","drmData","length","Array","isArray","DataLoaderManager","networkRetryConfig","_networkRetryConfig","add","loader","ks","execution_loader","isValid","_loaders","set","startIndex","_multiRequest","requests","executionLoaderResponseMap","from","val","index","_loadersResponseMap","fetchData","requestsMustSucceed","execute","then","_multiResponse","prepareData","success","err","loaderDataIndexes","results","slice","MultiRequestBuilder","requestParams","serviceDef","stringify","FAILED_PARSING_REQUEST","multiRequestResult","MultiRequestResult","result","errorResults","serviceResult","Drm","licenseUrl","BaseProvider","options","playerVersion","_partnerId","partnerId","_widgetId","widgetId","_uiConfId","uiConfId","_isAnonymous","_ks","_playerVersion","defaultWidgetId","getMediaConfig","mediaInfo","getPlaylistConfig","playlistInfo","getEntryListConfig","entryListInfo","_verifyHasSources","concat","messages","clone","node","e","keys","EntryList","items","Bumper","clickThroughUrl","defaultConfig","serviceParams","apiVersion","OTTConfiguration","clientConfig","OTTService","getMultiRequest","config","ottParams","multiReq","OTTDataLoaderManager","OTTUserService","anonymousLogin","udid","OTTSessionLoader","buildRequests","UserService","_requests","_response","OTTAssetService","getPlaybackContext","assetId","playbackContextOptions","contextDataParams","assetType","KalturaRuleAction","BLOCK","START_DATE_OFFSET","END_DATE_OFFSET","USER_BLOCK","ALLOW_PLAYBACK","BLOCK_PLAYBACK","APPLY_DISCOUNT_MODULE","KalturaPlaybackSource","format","adsPolicy","adsParam","fileId","protocols","hasDrmData","getProtocol","protocol","returnValue","KalturaBumpersPlaybackPluginData","streamertype","PROGRESSIVE","KalturaPlaybackContext","actions","plugins","plugin","hasBlockAction","undefined","getBlockAction","find","getErrorMessages","TRAILER","CATCHUP","START_OVER","PLAYBACK","KalturaAsset","description","metas","_formatTagsMetas","tags","pictures","images","objectToParse","parsed","objects","MEDIA","RECORDING","EPG","EPG_INTERNAL","EPG_EXTERNAL","NPVR","OTTAssetLoader","_entryId","entryId","playbackContext","mediaDataResult","playBackContextResult","OTTAssetListLoader","playlistItems","entries","_entries","entry","AssetReferenceType","item","MediaTypeCombinations","mediaAssetData","enableTrickPlay","DvrStatus","parseInt","externalIds","OTTProviderParser","getMediaEntry","assetResponse","requestData","mediaEntry","_fillBaseData","mediaAsset","kalturaSources","filteredKalturaSources","_filterSourcesByFormats","formats","_getParsedSources","typeData","_getMediaType","mediaType","contextType","Math","max","apply","getEntryList","playlistResponse","requestEntries","entryList","requestEntry","getBumper","progressiveBumper","bumper","StreamerType","metaData","reconstructMetadata","epgId","recordingId","_getPoster","addToMetaObject","list","categoryObj","test","pic","includes","addAdaptiveSource","parsedSource","_parseAdaptiveSource","kalturaSource","mediaSource","playUrl","drmParams","Scheme","OTTProvider","env","networkRetryParameters","_dataLoader","mediaProtocol","assetFileIds","fileIds","context","streamerType","urlType","adapterData","_parseDataFromResponse","mediaConfig","session","isAnonymous","_getDefaultSourcesObject","has","sessionLoader","assetLoader","_getSourcesObject","_parseEntryListDataFromResponse","playlistConfig","playlistLoader","dvr","vr","sourcesObject","mediaSources","NAME","__NAME__","__VERSION__","ContextType","MediaType"],"mappings":"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","file":"playkit-ott-provider.js","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[\"ott\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"providers\"] = root[\"playkit\"][\"providers\"] || {}, root[\"playkit\"][\"providers\"][\"ott\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 18);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport MediaSources from './media-sources';\n\nexport default class MediaEntry {\n static Type: {[type: string]: string} = {\n VOD: 'Vod',\n LIVE: 'Live',\n IMAGE: 'Image',\n AUDIO: 'Audio',\n UNKNOWN: 'Unknown'\n };\n static DvrStatus: {[type: string]: number} = {\n ON: 1,\n OFF: 0\n };\n\n /**\n * @member - entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - entry name\n * @type {string}\n */\n name: string;\n /**\n * @member - entry sources\n * @type {MediaSources}\n */\n sources: MediaSources;\n /**\n * @member - entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - entry type\n * @type {string}\n */\n type: string;\n /**\n * @member - entry metadata\n * @type {Object}\n */\n metadata: Object;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - media status\n * @type {number}\n */\n status: number;\n /**\n * @member - media poster\n * @type {string | Array}\n */\n poster: string | Array;\n\n /**\n * @member - assetReferenceType\n * @type {string }\n */\n assetReferenceType: string;\n\n /**\n * @constructor\n */\n constructor() {\n this.metadata = new Map();\n this.sources = new MediaSources();\n this.type = MediaEntry.Type.UNKNOWN;\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaEntryObject} - The json class object.\n */\n toJSON(): ProviderMediaEntryObject {\n return {\n id: this.id,\n name: this.name,\n sources: this.sources.toJSON(),\n duration: this.duration,\n dvrStatus: this.dvrStatus,\n status: this.status,\n metadata: this.metadata,\n type: this.type,\n poster: this.poster,\n assetReferenceType: this.assetReferenceType\n };\n }\n}\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nexport const MediaFormat: {[name: string]: ProviderMediaFormatType} = {\n DASH: {\n name: 'dash',\n mimeType: 'application/dash+xml',\n pathExt: 'mpd'\n },\n HLS: {\n name: 'hls',\n mimeType: 'application/x-mpegURL',\n pathExt: 'm3u8'\n },\n WVM: {\n name: 'wvm',\n mimeType: 'video/wvm',\n pathExt: 'wvm'\n },\n MP4: {\n name: 'mp4',\n mimeType: 'video/mp4',\n pathExt: 'mp4'\n },\n MP3: {\n name: 'mp3',\n mimeType: 'audio/mpeg',\n pathExt: 'mp3'\n }\n};\n\nexport const SupportedStreamFormat: Map = new Map([\n ['mpegdash', MediaFormat.DASH],\n ['applehttp', MediaFormat.HLS],\n ['url', MediaFormat.MP4]\n]);\n\n/**\n * returns a boolean whether a source is progressive or not\n * @param {string} formatName - the format name\n * @returns {boolean} - if source is progressive or not\n */\nfunction isProgressiveSource(formatName: string): boolean {\n const sourceFormat = SupportedStreamFormat.get(formatName);\n return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;\n}\n\nexport {isProgressiveSource};\n","//@flow\nexport class KalturaDrmPlaybackPluginData {\n static Scheme: {[scheme: string]: string} = {\n 'drm.PLAYREADY_CENC': 'com.microsoft.playready',\n 'drm.WIDEVINE_CENC': 'com.widevine.alpha',\n 'fairplay.FAIRPLAY': 'com.apple.fairplay',\n WIDEVINE_CENC: 'com.widevine.alpha',\n PLAYREADY_CENC: 'com.microsoft.playready',\n FAIRPLAY: 'com.apple.fairplay'\n };\n\n /**\n * @member - The drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - The license URL\n * @type {string}\n */\n licenseURL: string;\n\n /**\n * @member - The drm certificate\n * @type {?string}\n */\n certificate: ?string;\n\n /**\n * @constructor\n * @param {Object} drm The json response\n */\n constructor(drm: any) {\n this.scheme = drm.scheme;\n this.licenseURL = drm.licenseURL;\n this.certificate = drm.certificate;\n }\n}\n","//@flow\nexport class KalturaAccessControlMessage {\n /**\n * @member - The access control message\n * @type {string}\n */\n message: string;\n /**\n * @member - The access control message code\n * @@type {string}\n */\n code: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n this.message = data.message;\n this.code = data.code;\n }\n}\n","// @flow\nimport MediaSource from './media-source';\nimport {MediaFormat} from './media-format';\n\nexport default class MediaSources {\n /**\n * Progressive download media sources container.\n * @type {Array}\n * @public\n */\n progressive: Array;\n /**\n * Dash media sources container.\n * @type {Array}\n * @public\n */\n dash: Array;\n /**\n * Hls media sources container.\n * @type {Array}\n * @public\n */\n hls: Array;\n captions: Array;\n\n /**\n * @constructor\n */\n constructor() {\n this.progressive = [];\n this.dash = [];\n this.hls = [];\n }\n\n /**\n * Maps the source to one of the containers according to his media format.\n * @param {MediaSource} source - The source to add to one of the containers.\n * @param {MediaFormat} mediaFormat - The media format of the source.\n * @returns {void}\n */\n map(source: MediaSource, mediaFormat: ?ProviderMediaFormatType) {\n if (mediaFormat) {\n switch (mediaFormat.name) {\n case MediaFormat.MP4.name:\n this.progressive.push(source);\n break;\n case MediaFormat.DASH.name:\n this.dash.push(source);\n break;\n case MediaFormat.HLS.name:\n this.hls.push(source);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourcesObject} - The json class object.\n */\n toJSON(): ProviderMediaSourcesObject {\n const response: ProviderMediaSourcesObject = {\n progressive: [],\n dash: [],\n hls: []\n };\n this.progressive.forEach(p => response.progressive.push(p.toJSON()));\n this.hls.forEach(h => response.hls.push(h.toJSON()));\n this.dash.forEach(d => response.dash.push(d.toJSON()));\n return response;\n }\n}\n","//@flow\nimport Drm from './drm';\n\nexport default class MediaSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n /**\n * @member - media source drm data\n * @type {Array}\n */\n drmData: Array;\n /**\n * @member - media source bandwidth\n * @type {number}\n */\n bandwidth: number;\n /**\n * @member - media source width\n * @type {number}\n */\n width: number;\n /**\n * @member - media source height\n * @type {number}\n */\n height: number;\n /**\n * @member - media source label\n * @type {string}\n */\n label: string;\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourceObject} - The json class object.\n */\n toJSON(): ProviderMediaSourceObject {\n const response: ProviderMediaSourceObject = {\n id: this.id,\n url: this.url,\n mimetype: this.mimetype\n };\n if (this.bandwidth) response.bandwidth = this.bandwidth;\n if (this.width) response.width = this.width;\n if (this.height) response.height = this.height;\n if (this.label) response.label = this.label;\n if (this.drmData && this.drmData.length > 0) {\n response.drmData = [];\n this.drmData.forEach(d => {\n if (Array.isArray(response.drmData)) {\n response.drmData.push(d.toJSON());\n }\n });\n }\n return response;\n }\n}\n","// @flow\nimport MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';\nimport Error from '../../util/error/error';\n\nexport default class DataLoaderManager {\n /**\n * @member - Loaders response map index\n * @type {Map>}\n * @private\n */\n _loadersResponseMap: Map> = new Map();\n /**\n * @member - Loaders multi request\n * @type {MultiRequestBuilder}\n * @protected\n */\n _multiRequest: MultiRequestBuilder;\n /**\n * @member - Loaders multi response\n * @type {MultiRequestResult}\n * @private\n */\n _multiResponse: MultiRequestResult;\n /**\n * @member - Loaders to execute\n * @type {Map}\n * @private\n */\n _loaders: Map = new Map();\n\n _networkRetryConfig: ProviderNetworkRetryParameters;\n\n constructor(networkRetryConfig: ProviderNetworkRetryParameters) {\n this._networkRetryConfig = networkRetryConfig;\n }\n\n /**\n * Add loader to execution loaders map\n * @function\n * @param {Function} loader Loader to add\n * @param {Object} params Loader params\n * @param {string} ks ks\n * @returns {void}\n */\n add(loader: Function, params: Object, ks?: string): void {\n let execution_loader = new loader(params);\n if (execution_loader.isValid()) {\n this._loaders.set(loader.id, execution_loader);\n // Get the start index from the multiReqeust before adding current execution_loader requests\n let startIndex = this._multiRequest.requests.length;\n // Get the requests\n let requests = execution_loader.requests;\n this._multiRequest.retryConfig = this._networkRetryConfig;\n // Add requests to multiRequest queue\n requests.forEach(request => {\n request.params = request.params || {};\n request.params.ks = request.params.ks || ks;\n this._multiRequest.add(request);\n });\n // Create range array of current execution_loader requests\n let executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);\n // Add to map\n this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);\n }\n }\n\n /**\n * Get data from all loaders using multi request\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @function\n * @returns {Promise} Promise\n */\n fetchData(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n this._multiRequest.execute(requestsMustSucceed).then(\n data => {\n this._multiResponse = data.response;\n let preparedData: Object = this.prepareData(data.response);\n if (preparedData.success) {\n resolve(this._loaders);\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {\n headers: data.headers\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n /**\n * Prepare fetched data\n * @function\n * @param {MultiRequestResult} response - The multi request result\n * @returns {Object} - The prepared data\n */\n prepareData(response: MultiRequestResult): Object {\n this._loaders.forEach((loader, name) => {\n let loaderDataIndexes = this._loadersResponseMap.get(name);\n try {\n if (loaderDataIndexes && loaderDataIndexes.length > 0) {\n loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);\n }\n } catch (err) {\n return {success: false, error: err};\n }\n });\n return {success: true, data: this._loaders};\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n this.results = results;\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nexport default class Drm {\n /**\n * @member - license url\n * @type {string}\n */\n licenseUrl: string;\n /**\n * @member - drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - drm certificate\n * @type {string}\n */\n certificate: string;\n\n /**\n * @constructor\n * @param {string} licenseUrl - the license url\n * @param {string} scheme - the drm scheme\n * @param {?string} certificate - the drm certificate\n */\n constructor(licenseUrl: string, scheme: string, certificate: ?string) {\n this.licenseUrl = licenseUrl;\n this.scheme = scheme;\n if (certificate) {\n this.certificate = certificate;\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderDrmDataObject} - The json class object.\n */\n toJSON(): ProviderDrmDataObject {\n const response: ProviderDrmDataObject = {\n licenseUrl: this.licenseUrl,\n scheme: this.scheme\n };\n if (this.certificate) response.certificate = this.certificate;\n return response;\n }\n}\n","// @flow\nimport {getLogLevel, setLogLevel, setLogger, type LogLevelType, LogLevel} from '../../util/logger';\nimport DataLoaderManager from './data-loader-manager';\nimport Error from '../../util/error/error';\n\nexport default class BaseProvider {\n _partnerId: number;\n _widgetId: ?string;\n _ks: string;\n _uiConfId: ?number;\n _dataLoader: DataLoaderManager;\n _playerVersion: string;\n _logger: any;\n _isAnonymous: boolean;\n _networkRetryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n get partnerId(): number {\n return this._partnerId;\n }\n\n get widgetId(): string {\n return this._widgetId || this.defaultWidgetId;\n }\n\n get defaultWidgetId(): string {\n return '_' + this._partnerId;\n }\n\n get uiConfId(): ?number {\n return this._uiConfId;\n }\n\n get ks(): string {\n return this._ks;\n }\n\n set ks(value: string): void {\n this._ks = value;\n }\n\n get playerVersion(): string {\n return this._playerVersion;\n }\n\n get isAnonymous(): boolean {\n return this._isAnonymous;\n }\n\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n setLogger(options.logger);\n this._partnerId = options.partnerId;\n this._widgetId = options.widgetId;\n this._uiConfId = options.uiConfId;\n this._isAnonymous = !options.ks;\n this._ks = options.ks || '';\n this._playerVersion = playerVersion;\n }\n\n // eslint-disable-next-line no-unused-vars\n getMediaConfig(mediaInfo: MI): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'getMediaConfig method must be implement by the derived class'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading playlist by id'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading entry list'\n })\n );\n }\n\n _verifyHasSources(sources: ProviderMediaConfigSourcesObject) {\n if (sources.hls.concat(sources.dash, sources.progressive).length === 0) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {\n action: '',\n messages: `No play source for entry id: ${sources.id}`\n });\n }\n }\n\n get LogLevel(): LogLevelType {\n return LogLevel;\n }\n\n getLogLevel(name?: string): Object {\n return getLogLevel(name);\n }\n\n setLogLevel(level: Object, name?: string): void {\n setLogLevel(level, name);\n }\n}\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class EntryList {\n /**\n * @member - entry list items\n * @type {Array}\n */\n items: Array;\n\n constructor() {\n this.items = [];\n }\n}\n","//@flow\n\nexport default class Bumper {\n /**\n * @member - bumper url\n * @type {string}\n */\n url: string;\n /**\n * @member - bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n\n /**\n * @constructor\n * @param {Object} data - The bumper response\n */\n constructor(data: Object) {\n this.url = data.url;\n this.clickThroughUrl = data.clickThroughUrl;\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceParams: {\n apiVersion: '5.2.6'\n }\n};\n\nexport default class OTTConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OTTConfiguration};\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OTTConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OTTService {\n /**\n * Gets a new instance of MultiRequestBuilder with ott params\n * @function getMultiRequest\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OTTConfiguration.get();\n const ottParams = config.serviceParams;\n if (ks) {\n Object.assign(ottParams, {ks: ks});\n }\n if (partnerId) {\n Object.assign(ottParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ottParams;\n return multiReq;\n }\n}\n","// @flow\nimport DataLoaderManager from '../../common/data-loader-manager';\nimport OTTService from '../services/ott-service';\n/**\n * OTTDataLoaderManager is a class that handles the OTT data loading\n * @param {string} partnerId - partner id\n * @param {string} ks - ks\n * @param {ProviderNetworkRetryParameters} [networkRetryConfig] - network retry configuration\n */\nexport default class OTTDataLoaderManager extends DataLoaderManager {\n constructor(partnerId: number, ks: string = '', networkRetryConfig: ProviderNetworkRetryParameters) {\n super(networkRetryConfig);\n this._multiRequest = OTTService.getMultiRequest(ks, partnerId);\n }\n}\n","//@flow\nimport OTTService from './ott-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'ottuser';\n\nexport default class OTTUserService extends OTTService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} partnerId The partner ID\n * @param {string} udid The udid\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static anonymousLogin(serviceUrl: string, partnerId: number, udid?: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'anonymousLogin';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n const params: Object = {partnerId: partnerId};\n if (udid) {\n Object.assign(params, {udid: udid});\n }\n request.params = params;\n return request;\n }\n}\n","//@flow\nimport UserService from '../services/user-service';\nimport OTTConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\n\nexport default class OTTSessionLoader implements ILoader {\n _partnerId: number;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'session';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._partnerId = params.partnerId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.ks = response[0].data.ks;\n }\n\n get response(): any {\n return this._response.ks;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OTTConfiguration.get();\n const requests: Array = [];\n requests.push(UserService.anonymousLogin(config.serviceUrl, params.partnerId, params.udid));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._partnerId;\n }\n}\n","//@flow\nimport OTTService from './ott-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'asset';\n\nexport default class OTTAssetService extends OTTService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The partner ID\n * @param {string} assetId The asset ID\n * @param {string} type The asset type (media/recording/epg)\n * @param {ProviderPlaybackContextOptions} playbackContextOptions The playbackContextOptions\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static getPlaybackContext(\n serviceUrl: string,\n ks: string,\n assetId: string,\n type: string,\n playbackContextOptions: ProviderPlaybackContextOptions\n ): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'getPlaybackContext';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n const contextDataParams: Object = {objectType: 'KalturaPlaybackContextOptions'};\n Object.assign(contextDataParams, playbackContextOptions);\n request.params = {assetId: assetId, assetType: type, contextDataParams: contextDataParams, ks: ks};\n return request;\n }\n\n static get(serviceUrl: string, ks: string, assetId: string, assetReferenceType: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'get';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.params = {id: assetId, assetReferenceType: assetReferenceType, ks: ks};\n return request;\n }\n}\n","//@flow\nexport default class KalturaRuleAction {\n static Type: {[type: string]: string | number} = {\n BLOCK: 'BLOCK',\n START_DATE_OFFSET: 'START_DATE_OFFSET',\n END_DATE_OFFSET: 'END_DATE_OFFSET',\n USER_BLOCK: 'USER_BLOCK',\n ALLOW_PLAYBACK: 'ALLOW_PLAYBACK',\n BLOCK_PLAYBACK: 'BLOCK_PLAYBACK',\n APPLY_DISCOUNT_MODULE: 'APPLY_DISCOUNT_MODULE'\n };\n\n /**\n * @member - The type of the action\n * @type {string|number}\n */\n type: string | number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.type = data.type;\n }\n}\n","//@flow\nimport {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';\n\nexport type OTTKalturaPlaybackSource = KalturaPlaybackSource;\n\nexport default class KalturaPlaybackSource {\n format: string;\n protocols: string;\n drm: Array = [];\n adsPolicy: string;\n adsParam: string;\n duration: number;\n url: string;\n type: string;\n fileId: number;\n\n /**\n * @constructor\n * @param {Object} source The response\n */\n constructor(source: Object) {\n this.format = source.format;\n this.adsPolicy = source.adsPolicy;\n this.adsParam = source.adsParam;\n this.duration = source.duration;\n this.url = source.url;\n this.type = source.type;\n this.fileId = source.id;\n this.protocols = source.protocols;\n if (source.drm) {\n source.drm.map(drm => this.drm.push(new KalturaDrmPlaybackPluginData(drm)));\n }\n }\n\n /**\n * Checks if source has DRM data\n * @function hasDrmData\n * @returns {boolean} Is source has DRM\n */\n hasDrmData(): boolean {\n return this.drm && this.drm.length > 0;\n }\n\n /**\n * Returns source desired protocol if supported\n * @param {string} protocol - the desired protocol for the source (base play url protocol)\n * @returns {string} - protocol if protocol is in the protocols list - if not empty string returned\n */\n getProtocol(protocol: string): string {\n let returnValue: string = '';\n if (this.protocols && this.protocols.length > 0) {\n let protocolsArr: Array = this.protocols.split(',');\n protocolsArr.forEach(p => {\n if (p === protocol) {\n returnValue = p;\n }\n });\n } else if (protocol === 'http') {\n return protocol;\n }\n return returnValue;\n }\n}\n","//@flow\nexport default class KalturaBumpersPlaybackPluginData {\n static StreamerType: {[type: string]: string} = {\n HLS: 'hls',\n DASH: 'dash',\n PROGRESSIVE: 'progressive'\n };\n\n /**\n * @member - The streamer type\n * @type {string}\n */\n streamertype: string;\n /**\n * @member - The url\n * @type {string}\n */\n url: string;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.streamertype = data.streamertype;\n this.url = data.url;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';\nimport KalturaRuleAction from './kaltura-rule-action';\nimport KalturaPlaybackSource from './kaltura-playback-source';\nimport KalturaBumpersPlaybackPluginData from './kaltura-bumper-playback-plugin-data';\n\nexport default class KalturaPlaybackContext extends ServiceResult {\n static Type: {[type: string]: string} = {\n TRAILER: 'TRAILER',\n CATCHUP: 'CATCHUP',\n START_OVER: 'START_OVER',\n PLAYBACK: 'PLAYBACK'\n };\n /**\n * @member - The playback sources\n * @type {Array}\n */\n sources: Array = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array}\n */\n actions: Array = [];\n /**\n * @member - Array of access control massages\n * @type {Array}\n */\n messages: Array = [];\n /**\n * @member - Array of bumper plugins\n * @type {Array}\n */\n plugins: Array = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n const messages = response.messages;\n if (messages) {\n messages.map(message => this.messages.push(new KalturaAccessControlMessage(message)));\n }\n const actions = response.actions;\n if (actions) {\n actions.map(action => this.actions.push(new KalturaRuleAction(action)));\n }\n const sources = response.sources;\n if (sources) {\n sources.map(source => this.sources.push(new KalturaPlaybackSource(source)));\n }\n const plugins = response.plugins;\n if (plugins) {\n plugins.map(plugin => this.plugins.push(new KalturaBumpersPlaybackPluginData(plugin)));\n }\n }\n }\n\n hasBlockAction(): boolean {\n return this.getBlockAction() !== undefined;\n }\n\n getBlockAction(): ?KalturaRuleAction {\n return this.actions.find(action => action.type === KalturaRuleAction.Type.BLOCK);\n }\n\n getErrorMessages(): Array {\n return this.messages;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\n\nexport default class KalturaAsset extends ServiceResult {\n static Type: {[type: string]: string} = {\n MEDIA: 'media',\n RECORDING: 'recording',\n EPG: 'epg'\n };\n\n static AssetReferenceType: {[type: string]: string} = {\n MEDIA: 'media',\n EPG_INTERNAL: 'epg_internal',\n EPG_EXTERNAL: 'epg_external',\n NPVR: 'nPVR'\n };\n /**\n * @member - The asset id\n * @type {number}\n */\n id: number;\n /**\n * @member - The asset name\n * @type {string}\n */\n name: string = '';\n /**\n * @member - The asset name description\n * @type {string}\n */\n description: string = '';\n /**\n * @member - The asset tags\n * @type {Array}\n */\n tags: Array = [];\n /**\n * @member - The asset metas\n * @type {Array}\n */\n metas: Array = [];\n /**\n * @member - The asset images\n * @type {Array}\n */\n pictures: Array = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n this.id = response.id;\n this.name = response.name;\n this.description = response.description;\n this.metas = this._formatTagsMetas(response.metas);\n this.tags = this._formatTagsMetas(response.tags);\n this.pictures = response.images;\n }\n }\n\n _formatTagsMetas(objectToParse: any): Array {\n const parsed = [];\n Object.keys(objectToParse).forEach(function (key) {\n if (objectToParse[key].objects) {\n let value = '';\n objectToParse[key].objects.forEach(function (object) {\n value += object.value + '|';\n });\n parsed.push({key: key, value: value});\n } else {\n parsed.push({key: key, value: objectToParse[key].value});\n }\n });\n return parsed;\n }\n}\n","//@flow\nimport OTTAssetService from '../services/asset-service';\nimport OTTConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\nimport KalturaPlaybackContext from '../response-types/kaltura-playback-context';\nimport KalturaAsset from '../response-types/kaltura-asset';\n\ntype OTTAssetLoaderResponse = {mediaDataResult: KalturaAsset, playBackContextResult: KalturaPlaybackContext};\nexport type {OTTAssetLoaderResponse};\n\nexport default class OTTAssetLoader implements ILoader {\n _entryId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'asset';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entryId = params.entryId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.mediaDataResult = new KalturaAsset(response[0].data);\n this._response.playBackContextResult = new KalturaPlaybackContext(response[1].data);\n }\n\n get response(): OTTAssetLoaderResponse {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OTTConfiguration.get();\n const requests: Array = [];\n requests.push(OTTAssetService.get(config.serviceUrl, params.ks, params.entryId, params.assetReferenceType));\n requests.push(OTTAssetService.getPlaybackContext(config.serviceUrl, params.ks, params.entryId, params.type, params.playbackContext));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._entryId;\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OTTConfiguration from '../config';\nimport OTTAssetService from '../services/asset-service';\nimport KalturaAsset from '../response-types/kaltura-asset';\n\nexport default class OTTAssetListLoader implements ILoader {\n _entries: Array;\n _requests: Array;\n _response: any = {playlistItems: {entries: []}};\n\n static get id(): string {\n return 'asset_list';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entries = params.entries;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n response.forEach(item => {\n this._response.playlistItems.entries.push({mediaDataResult: new KalturaAsset(item.data)});\n });\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OTTConfiguration.get();\n const requests: Array = [];\n params.entries.forEach(entry => {\n const assetReferenceType = entry.assetReferenceType || KalturaAsset.AssetReferenceType.MEDIA;\n requests.push(OTTAssetService.get(config.serviceUrl, params.ks, entry.entryId || entry, assetReferenceType));\n });\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entries && this._entries.length);\n }\n}\n","//@flow\nimport getLogger from '../../util/logger';\nimport KalturaPlaybackSource from './response-types/kaltura-playback-source';\nimport KalturaPlaybackContext from './response-types/kaltura-playback-context';\nimport KalturaAsset from './response-types/kaltura-asset';\nimport MediaEntry from '../../entities/media-entry';\nimport Drm from '../../entities/drm';\nimport MediaSource from '../../entities/media-source';\nimport MediaSources from '../../entities/media-sources';\nimport EntryList from '../../entities/entry-list';\nimport Bumper from '../../entities/bumper';\nimport {SupportedStreamFormat, isProgressiveSource} from '../../entities/media-format';\nimport {KalturaDrmPlaybackPluginData} from '../common/response-types/kaltura-drm-playback-plugin-data';\nimport KalturaRuleAction from './response-types/kaltura-rule-action';\nimport {KalturaAccessControlMessage} from '../common/response-types/kaltura-access-control-message';\nimport type {OTTAssetLoaderResponse} from './loaders/asset-loader';\nimport KalturaBumpersPlaybackPluginData from './response-types/kaltura-bumper-playback-plugin-data';\n\nconst LIVE_ASST_OBJECT_TYPE: string = 'KalturaLiveAsset';\n\nconst MediaTypeCombinations: {[mediaType: string]: Object} = {\n [KalturaAsset.Type.MEDIA]: {\n [KalturaPlaybackContext.Type.TRAILER]: () => ({type: MediaEntry.Type.VOD}),\n [KalturaPlaybackContext.Type.PLAYBACK]: mediaAssetData => {\n if (mediaAssetData.objectType === LIVE_ASST_OBJECT_TYPE) {\n return {type: MediaEntry.Type.LIVE, dvrStatus: mediaAssetData.enableTrickPlay ? MediaEntry.DvrStatus.ON : MediaEntry.DvrStatus.OFF};\n } else if (parseInt(mediaAssetData.externalIds) > 0) {\n return {type: MediaEntry.Type.LIVE, dvrStatus: MediaEntry.DvrStatus.OFF};\n }\n return {type: MediaEntry.Type.VOD};\n }\n },\n [KalturaAsset.Type.EPG]: {\n [KalturaPlaybackContext.Type.CATCHUP]: () => ({type: MediaEntry.Type.VOD}),\n [KalturaPlaybackContext.Type.START_OVER]: () => ({type: MediaEntry.Type.LIVE, dvrStatus: MediaEntry.DvrStatus.ON})\n },\n [KalturaAsset.Type.RECORDING]: {\n [KalturaPlaybackContext.Type.PLAYBACK]: () => ({type: MediaEntry.Type.VOD})\n }\n};\n\nexport default class OTTProviderParser {\n static _logger = getLogger('OTTProviderParser');\n\n /**\n * Returns parsed media entry by given OTT response objects.\n * @function getMediaEntry\n * @param {any} assetResponse - The asset response.\n * @param {Object} requestData - The request data object.\n * @returns {MediaEntry} - The media entry\n * @static\n * @public\n */\n static getMediaEntry(assetResponse: any, requestData: Object): MediaEntry {\n const mediaEntry = new MediaEntry();\n OTTProviderParser._fillBaseData(mediaEntry, assetResponse, requestData);\n const playbackContext = assetResponse.playBackContextResult;\n const mediaAsset = assetResponse.mediaDataResult;\n const kalturaSources = playbackContext.sources;\n const filteredKalturaSources = OTTProviderParser._filterSourcesByFormats(kalturaSources, requestData.formats);\n mediaEntry.sources = OTTProviderParser._getParsedSources(filteredKalturaSources);\n const typeData = OTTProviderParser._getMediaType(mediaAsset.data, requestData.mediaType, requestData.contextType);\n mediaEntry.type = typeData.type;\n mediaEntry.dvrStatus = typeData.dvrStatus;\n mediaEntry.duration = Math.max.apply(\n Math,\n kalturaSources.map(source => source.duration)\n );\n return mediaEntry;\n }\n\n /**\n * Returns parsed entry list by given OTT response objects\n * @function getEntryList\n * @param {any} playlistResponse - response\n * @param {Array} requestEntries - entries list\n * @returns {Playlist} - The entry list\n * @static\n * @public\n */\n static getEntryList(playlistResponse: any, requestEntries: Array): EntryList {\n const entryList = new EntryList();\n const playlistItems = playlistResponse.playlistItems.entries;\n playlistItems.forEach(entry => {\n const mediaEntry = new MediaEntry();\n const requestData = requestEntries.find(requestEntry => requestEntry.entryId === entry.mediaDataResult.id);\n OTTProviderParser._fillBaseData(mediaEntry, entry, requestData);\n entryList.items.push(mediaEntry);\n });\n return entryList;\n }\n\n /**\n * Returns parsed bumper by given OTT response objects.\n * @function getBumper\n * @param {any} assetResponse - The asset response.\n * @returns {?Bumper} - The bumper\n * @static\n * @public\n */\n static getBumper(assetResponse: any): ?Bumper {\n const playbackContext = assetResponse.playBackContextResult;\n const progressiveBumper = playbackContext.plugins.find(\n bumper => bumper.streamertype === KalturaBumpersPlaybackPluginData.StreamerType.PROGRESSIVE\n );\n if (progressiveBumper) {\n return new Bumper(progressiveBumper);\n }\n }\n\n static _fillBaseData(mediaEntry: MediaEntry, assetResponse: any, requestData: any) {\n const mediaAsset = assetResponse.mediaDataResult;\n const metaData = OTTProviderParser.reconstructMetadata(mediaAsset);\n metaData.description = mediaAsset.description;\n metaData.name = mediaAsset.name;\n if (mediaAsset.data.epgId) metaData.epgId = mediaAsset.data.epgId;\n if (mediaAsset.data.recordingId) metaData.recordingId = mediaAsset.data.recordingId;\n if (requestData && requestData.mediaType) metaData.mediaType = requestData.mediaType;\n mediaEntry.metadata = metaData;\n mediaEntry.poster = OTTProviderParser._getPoster(mediaAsset.pictures);\n mediaEntry.id = mediaAsset.id;\n return mediaEntry;\n }\n\n /**\n * reconstruct the metadata\n * @param {Object} mediaAsset the mediaAsset that contains the response with the metadata.\n * @returns {Object} reconstructed metadata object\n */\n static reconstructMetadata(mediaAsset: Object): Object {\n const metadata = {\n metas: OTTProviderParser.addToMetaObject(mediaAsset.metas),\n tags: OTTProviderParser.addToMetaObject(mediaAsset.tags)\n };\n return metadata;\n }\n\n /**\n * transform an array of [{key: value},{key: value}...] to an object\n * @param {Array} list a list of objects\n * @returns {Object} an mapped object of the arrayed list.\n */\n static addToMetaObject(list: Array): Object {\n let categoryObj = {};\n if (list) {\n list.forEach(item => {\n categoryObj[item.key] = item.value;\n });\n }\n return categoryObj;\n }\n\n /**\n * Gets the poster url without width and height.\n * @param {Array} pictures - Media pictures.\n * @returns {string | Array} - Poster base url or array of poster candidates.\n * @private\n */\n static _getPoster(pictures: Array): string | Array {\n if (pictures && pictures.length > 0) {\n const picObj = pictures[0];\n const url = picObj.url;\n // Search for thumbnail service\n const regex = /.*\\/thumbnail\\/.*(?:width|height)\\/\\d+\\/(?:height|width)\\/\\d+/;\n if (regex.test(url)) {\n return url;\n }\n return pictures.map(pic => ({url: pic.url, width: pic.width, height: pic.height}));\n }\n return '';\n }\n\n /**\n * Gets the media type (LIVE/VOD)\n * @param {Object} mediaAssetData - The media asset data.\n * @param {string} mediaType - The asset media type.\n * @param {string} contextType - The asset context type.\n * @returns {Object} - The type data object.\n * @private\n */\n static _getMediaType(mediaAssetData: Object, mediaType: string, contextType: string): Object {\n let typeData = {type: MediaEntry.Type.UNKNOWN};\n if (MediaTypeCombinations[mediaType] && MediaTypeCombinations[mediaType][contextType]) {\n typeData = MediaTypeCombinations[mediaType][contextType](mediaAssetData);\n }\n return typeData;\n }\n\n /**\n * Filtered the kalturaSources array by device type.\n * @param {Array} kalturaSources - The kaltura sources.\n * @param {Array} formats - Partner device formats.\n * @returns {Array} - Filtered kalturaSources array.\n * @private\n */\n static _filterSourcesByFormats(kalturaSources: Array, formats: Array): Array {\n if (formats.length > 0) {\n kalturaSources = kalturaSources.filter(source => formats.includes(source.type));\n }\n return kalturaSources;\n }\n\n /**\n * Returns the parsed sources\n * @function _getParsedSources\n * @param {Array} kalturaSources - The kaltura sources\n * @param {Object} playbackContext - The playback context\n * @return {MediaSources} - A media sources\n * @static\n * @private\n */\n static _getParsedSources(kalturaSources: Array): MediaSources {\n const sources = new MediaSources();\n const addAdaptiveSource = (source: KalturaPlaybackSource) => {\n const parsedSource = OTTProviderParser._parseAdaptiveSource(source);\n if (parsedSource) {\n const sourceFormat = SupportedStreamFormat.get(source.format);\n sources.map(parsedSource, sourceFormat);\n }\n };\n const parseAdaptiveSources = () => {\n kalturaSources.filter(source => !isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n const parseProgressiveSources = () => {\n kalturaSources.filter(source => isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n if (kalturaSources && kalturaSources.length > 0) {\n parseAdaptiveSources();\n parseProgressiveSources();\n }\n return sources;\n }\n\n /**\n * Returns a parsed adaptive source\n * @function _parseAdaptiveSource\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @returns {?MediaSource} - The parsed adaptive kalturaSource\n * @static\n * @private\n */\n static _parseAdaptiveSource(kalturaSource: ?KalturaPlaybackSource): ?MediaSource {\n const mediaSource = new MediaSource();\n if (kalturaSource) {\n const playUrl = kalturaSource.url;\n const mediaFormat = SupportedStreamFormat.get(kalturaSource.format);\n if (mediaFormat) {\n mediaSource.mimetype = mediaFormat.mimeType;\n }\n if (!playUrl) {\n OTTProviderParser._logger.error(\n `failed to create play url from source, discarding source: (${kalturaSource.fileId}), ${kalturaSource.format}.`\n );\n return null;\n }\n mediaSource.url = playUrl;\n mediaSource.id = kalturaSource.fileId + ',' + kalturaSource.format;\n if (kalturaSource.hasDrmData()) {\n const drmParams: Array = [];\n kalturaSource.drm.forEach(drm => {\n drmParams.push(new Drm(drm.licenseURL, KalturaDrmPlaybackPluginData.Scheme[drm.scheme], drm.certificate));\n });\n mediaSource.drmData = drmParams;\n }\n }\n return mediaSource;\n }\n\n static hasBlockAction(response: OTTAssetLoaderResponse): boolean {\n return response.playBackContextResult.hasBlockAction();\n }\n\n static getBlockAction(response: OTTAssetLoaderResponse): ?KalturaRuleAction {\n return response.playBackContextResult.getBlockAction();\n }\n\n static getErrorMessages(response: OTTAssetLoaderResponse): Array {\n return response.playBackContextResult.getErrorMessages();\n }\n}\n","// @flow\nimport BaseProvider from '../common/base-provider';\nimport getLogger from '../../util/logger';\nimport OTTConfiguration from './config';\nimport OTTDataLoaderManager from './loaders/data-loader-manager';\nimport OTTSessionLoader from './loaders/session-loader';\nimport OTTAssetLoader from './loaders/asset-loader';\nimport OTTAssetListLoader from './loaders/asset-list-loader';\nimport OTTProviderParser from './provider-parser';\nimport KalturaAsset from './response-types/kaltura-asset';\nimport KalturaPlaybackContext from './response-types/kaltura-playback-context';\nimport MediaEntry from '../../entities/media-entry';\nimport Error from '../../util/error/error';\n\nexport default class OTTProvider extends BaseProvider {\n /**\n * @constructor\n * @param {ProviderOptionsObject} options - provider options\n * @param {string} playerVersion - player version\n */\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n super(options, playerVersion);\n this._logger = getLogger('OTTProvider');\n OTTConfiguration.set(options.env);\n this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);\n }\n\n get env() {\n return OTTConfiguration.get();\n }\n\n /**\n * Gets the backend media config.\n * @param {OTTProviderMediaInfoObject} mediaInfo - ott media info\n * @returns {Promise} - The provider media config\n */\n getMediaConfig(mediaInfo: OTTProviderMediaInfoObject): Promise {\n if (mediaInfo.ks) {\n this.ks = mediaInfo.ks;\n this._isAnonymous = false;\n }\n this._dataLoader = new OTTDataLoaderManager(this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entryId = mediaInfo.entryId;\n if (entryId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OTTSessionLoader, {partnerId: this.partnerId});\n }\n const contextType = mediaInfo.contextType || KalturaPlaybackContext.Type.PLAYBACK;\n const mediaType = mediaInfo.mediaType || KalturaAsset.Type.MEDIA;\n const assetReferenceType = mediaInfo.assetReferenceType || KalturaAsset.AssetReferenceType.MEDIA;\n const playbackContext: ProviderPlaybackContextOptions = {\n mediaProtocol: mediaInfo.protocol,\n assetFileIds: mediaInfo.fileIds,\n context: contextType\n };\n if (mediaInfo.streamerType) {\n playbackContext.streamerType = mediaInfo.streamerType;\n }\n if (mediaInfo.urlType) {\n playbackContext.urlType = mediaInfo.urlType;\n }\n if (mediaInfo.adapterData) {\n playbackContext.adapterData = mediaInfo.adapterData;\n }\n this._dataLoader.add(OTTAssetLoader, {\n entryId: entryId,\n ks: ks,\n type: mediaType,\n playbackContext: playbackContext,\n assetReferenceType: assetReferenceType\n });\n const requestData = {\n contextType: contextType,\n mediaType: mediaType,\n formats: mediaInfo.formats || []\n };\n return this._dataLoader.fetchData().then(\n response => {\n try {\n resolve(this._parseDataFromResponse(response, requestData));\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));\n }\n });\n }\n\n _parseDataFromResponse(data: Map, requestData: Object): ProviderMediaConfigObject {\n this._logger.debug('Data parsing started');\n const mediaConfig: ProviderMediaConfigObject = {\n session: {\n isAnonymous: this._isAnonymous,\n partnerId: this.partnerId\n },\n sources: this._getDefaultSourcesObject(),\n plugins: {}\n };\n if (this.uiConfId) {\n mediaConfig.session.uiConfId = this.uiConfId;\n }\n if (data) {\n if (data.has(OTTSessionLoader.id)) {\n const sessionLoader = data.get(OTTSessionLoader.id);\n if (sessionLoader && sessionLoader.response) {\n mediaConfig.session.ks = sessionLoader.response;\n }\n } else {\n mediaConfig.session.ks = this.ks;\n }\n if (data.has(OTTAssetLoader.id)) {\n const assetLoader = data.get(OTTAssetLoader.id);\n if (assetLoader && assetLoader.response && Object.keys(assetLoader.response).length) {\n const response = (assetLoader: OTTAssetLoader).response;\n if (OTTProviderParser.hasBlockAction(response)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {\n action: OTTProviderParser.getBlockAction(response),\n messages: OTTProviderParser.getErrorMessages(response)\n });\n }\n const mediaEntry = OTTProviderParser.getMediaEntry(response, requestData);\n Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));\n this._verifyHasSources(mediaConfig.sources);\n const bumper = OTTProviderParser.getBumper(response);\n if (bumper) {\n Object.assign(mediaConfig.plugins, {bumper});\n }\n }\n }\n }\n this._logger.debug('Data parsing finished', mediaConfig);\n return mediaConfig;\n }\n\n /**\n * Gets playlist config from entry list.\n * @param {ProviderEntryListObject} entryListInfo - ott entry list info\n * @returns {Promise} - The provider playlist config\n */\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n if (entryListInfo.ks) {\n this.ks = entryListInfo.ks;\n this._isAnonymous = false;\n }\n this._dataLoader = new OTTDataLoaderManager(this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entries = entryListInfo.entries;\n if (entries && entries.length) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OTTSessionLoader, {partnerId: this.partnerId});\n }\n this._dataLoader.add(OTTAssetListLoader, {entries, ks});\n this._dataLoader.fetchData(false).then(\n response => {\n resolve(this._parseEntryListDataFromResponse(response, entries));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parseEntryListDataFromResponse(data: Map, requestEntries: Array): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = {\n id: '',\n metadata: {\n name: '',\n description: ''\n },\n poster: '',\n items: []\n };\n if (data && data.has(OTTAssetListLoader.id)) {\n const playlistLoader = data.get(OTTAssetListLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const entryList = OTTProviderParser.getEntryList(playlistLoader.response, requestEntries);\n entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n _getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {\n return {\n hls: [],\n dash: [],\n progressive: [],\n id: '',\n duration: 0,\n type: MediaEntry.Type.UNKNOWN,\n poster: '',\n dvr: false,\n vr: null,\n metadata: {\n name: '',\n description: '',\n tags: ''\n }\n };\n }\n\n _getSourcesObject(mediaEntry: MediaEntry) {\n const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();\n const mediaSources = mediaEntry.sources.toJSON();\n sourcesObject.hls = mediaSources.hls;\n sourcesObject.dash = mediaSources.dash;\n sourcesObject.progressive = mediaSources.progressive;\n sourcesObject.id = mediaEntry.id;\n sourcesObject.duration = mediaEntry.duration;\n sourcesObject.type = mediaEntry.type;\n sourcesObject.dvr = !!mediaEntry.dvrStatus;\n sourcesObject.poster = mediaEntry.poster;\n if (\n mediaEntry.metadata &&\n mediaEntry.metadata.metas &&\n typeof mediaEntry.metadata.metas.tags === 'string' &&\n mediaEntry.metadata.metas.tags.indexOf('360') > -1\n ) {\n sourcesObject.vr = {};\n }\n Object.assign(sourcesObject.metadata, mediaEntry.metadata);\n return sourcesObject;\n }\n}\n","// @flow\nimport OTTProvider from './provider';\nimport KalturaPlaybackContext from './response-types/kaltura-playback-context';\nimport KalturaAsset from './response-types/kaltura-asset';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-ott';\nconst VERSION = __VERSION__;\n\nconst ContextType = KalturaPlaybackContext.Type;\nconst MediaType = KalturaAsset.Type;\n\nexport {OTTProvider as Provider, ContextType, MediaType, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/playkit-ovp-provider.js b/dist/playkit-ovp-provider.js index 481ff221..bdd2061a 100644 --- a/dist/playkit-ovp-provider.js +++ b/dist/playkit-ovp-provider.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ovp=t():(e.playkit=e.playkit||{},e.playkit.providers=e.playkit.providers||{},e.playkit.providers.ovp=t())}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=17)}([function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(3);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function e(t,r,n,i){void 0===i&&(i={}),this.severity=t,this.category=r,this.code=n,this.data=i,e._logger.error("Category:"+r+" | Code:"+n+" |",i)};i(a,"Severity",{RECOVERABLE:1,CRITICAL:2}),i(a,"Category",{NETWORK:1,SERVICE:2,PROVIDER:3}),i(a,"Code",{UNSUPPORTED_SCHEME:1e3,BAD_HTTP_STATUS:1001,HTTP_ERROR:1002,TIMEOUT:1003,MALFORMED_DATA_URI:1004,BAD_SERVER_RESPONSE:1005,MULTIREQUEST_API_ERROR:1006,API_RESPONSE_MISMATCH:1007,ERROR:2e3,BLOCK_ACTION:2001,MEDIA_STATUS_NOT_READY:2002,MISSING_MANDATORY_PARAMS:3e3,MISSING_PLAY_SOURCE:3001,METHOD_NOT_IMPLEMENTED:3002}),i(a,"_logger",Object(n.b)("Error"))},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(8);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(){this.metadata=new Map,this.sources=new n.a,this.type=e.Type.UNKNOWN}return e.prototype.toJSON=function(){return{id:this.id,name:this.name,sources:this.sources.toJSON(),duration:this.duration,dvrStatus:this.dvrStatus,status:this.status,metadata:this.metadata,type:this.type,poster:this.poster,assetReferenceType:this.assetReferenceType}},e}();i(a,"Type",{VOD:"Vod",LIVE:"Live",IMAGE:"Image",AUDIO:"Audio",UNKNOWN:"Unknown"}),i(a,"DvrStatus",{ON:1,OFF:0})},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(0);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(e){void 0===e&&(e=new Map),i(this,"retryConfig",{async:!0,timeout:0,maxAttempts:4}),i(this,"_attemptCounter",1),this.headers=e}var t=e.prototype;return t.getUrl=function(e){return e+"/service/"+this.service+(this.action?"/action/"+this.action:"")},t.doHttpRequest=function(){var e=this,t=new Promise((function(t,r){e._requestPromise={resolve:t,reject:r}}));return this.url||this._requestPromise.reject(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.MALFORMED_DATA_URI,{url:this.url})),this._createXHR(),t},t._createXHR=function(){var e=this,t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status)try{var r=JSON.parse(t.responseText);return e.responseHeaders=e._getResponseHeaders(t),e._requestPromise.resolve(r)}catch(r){e._requestPromise.reject(e._createError(t,n.a.Code.BAD_SERVER_RESPONSE,{text:t.responseText}))}},t.open(this.method,this.url,this.retryConfig.async),this.retryConfig.async&&this.retryConfig.timeout&&(t.timeout=this.retryConfig.timeout);var r=performance.now();t.ontimeout=function(){e._handleError(t,n.a.Code.TIMEOUT,{timeout:(performance.now()-r)/1e3,statusText:t.statusText})},t.onerror=t.onabort=function(){e._handleError(t,n.a.Code.HTTP_ERROR,{text:t.responseText,statusText:t.statusText})},this.headers.forEach((function(e,r){t.setRequestHeader(r,e)})),t.send(this.params)},t._getResponseHeaders=function(e){return e.getAllResponseHeaders().split("\n").filter((function(e){return 0===e.toLowerCase().indexOf("x-")}))},t._handleError=function(e,t,r){var n=this._createError(e,t,r);if(e.onreadystatechange=function(){},e.onerror=function(){},e.ontimeout=function(){},e.onabort=function(){},!(this.retryConfig.maxAttempts&&this._attemptCounter0&&(e.drmData=[],this.drmData.forEach((function(t){Array.isArray(e.drmData)&&e.drmData.push(t.toJSON())}))),e},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));r(11);var n=r(0);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(e){i(this,"_loadersResponseMap",new Map),i(this,"_loaders",new Map),this._networkRetryConfig=e}var t=e.prototype;return t.add=function(e,t,r){var n=this,i=new e(t);if(i.isValid()){this._loaders.set(e.id,i);var a=this._multiRequest.requests.length,s=i.requests;this._multiRequest.retryConfig=this._networkRetryConfig,s.forEach((function(e){e.params=e.params||{},e.params.ks=e.params.ks||r,n._multiRequest.add(e)}));var o=Array.from(new Array(s.length),(function(e,t){return t+a}));this._loadersResponseMap.set(e.id,o)}},t.fetchData=function(e){var t=this;return new Promise((function(r,i){t._multiRequest.execute(e).then((function(e){t._multiResponse=e.response,t.prepareData(e.response).success?r(t._loaders):i(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.API_RESPONSE_MISMATCH,{headers:e.headers}))}),(function(e){i(e)}))}))},t.prepareData=function(e){var t=this;return this._loaders.forEach((function(r,n){var i=t._loadersResponseMap.get(n);try{i&&i.length>0&&(r.response=e.results.slice(i[0],i[i.length-1]+1))}catch(e){return{success:!1,error:e}}})),{success:!0,data:this._loaders}},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return c}));var n=r(2),i=r(3),a=r(4),s=r(0);function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),i=0;i0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));r(1);var n=function(){this.items=[]}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var n=function(e){this.url=e.url,this.clickThroughUrl=e.clickThroughUrl}},function(e,t,r){"use strict";r.r(t),r.d(t,"Provider",(function(){return ye})),r.d(t,"ProviderParser",(function(){return B})),r.d(t,"NAME",(function(){return ve})),r.d(t,"VERSION",(function(){return _e})),r.d(t,"RequestBuilder",(function(){return K.a})),r.d(t,"ResponseTypes",(function(){return n}));var n={};r.r(n),r.d(n,"KalturaBaseEntryListResponse",(function(){return X})),r.d(n,"KalturaMediaEntry",(function(){return C})),r.d(n,"KalturaAccessControlModifyRequestHostRegexAction",(function(){return g})),r.d(n,"KalturaBumper",(function(){return v})),r.d(n,"KalturaFlavorAsset",(function(){return m})),r.d(n,"KalturaMediaEntries",(function(){return ae})),r.d(n,"KalturaMetadata",(function(){return R})),r.d(n,"KalturaMetadataListResponse",(function(){return O})),r.d(n,"KalturaPlaybackContext",(function(){return I})),r.d(n,"KalturaPlaybackSource",(function(){return d})),r.d(n,"KalturaPlaylist",(function(){return ie})),r.d(n,"KalturaRuleAction",(function(){return y})),r.d(n,"KalturaUIConfResponse",(function(){return me})),r.d(n,"KalturaDrmPlaybackPluginData",(function(){return l.a})),r.d(n,"KalturaAccessControlMessage",(function(){return c.a})),r.d(n,"BaseServiceResult",(function(){return u.a}));var i=r(3),a=r(14),s={serviceUrl:"https://cdnapisec.kaltura.com/api_v3",cdnUrl:"https://cdnapisec.kaltura.com",serviceParams:{apiVersion:"3.3.0",format:1},useApiCaptions:!0},o=function(){function e(){}return e.set=function(e){e&&Object.assign(s,e)},e.get=function(){return Object(a.a)(s)},e}(),u=r(4),c=r(7),l=r(6);var d=function(){function e(e){var t,r,n,i=this;n=[],(r="drm")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,this.format=e.format,this.deliveryProfileId=e.deliveryProfileId,this.url=e.url,this.protocols=e.protocols,this.flavorIds=e.flavorIds,e.drm&&e.drm.map((function(e){return i.drm.push(new l.a(e))}))}var t=e.prototype;return t.hasDrmData=function(){return this.drm&&this.drm.length>0},t.hasFlavorIds=function(){return!!this.flavorIds&&this.flavorIds.length>0},t.getProtocol=function(e){var t="";if(this.protocols&&this.protocols.length>0)this.protocols.split(",").forEach((function(r){r===e&&(t=r)}));else if("http"===e)return e;return t},e}();var f,p,h,y=function(e){this.type=e.type};h={DRM_POLICY:"drm.DRM_POLICY",BLOCK:1,PREVIEW:2,LIMIT_FLAVORS:3,ADD_TO_STORAGE:4,LIMIT_DELIVERY_PROFILES:5,SERVE_FROM_REMOTE_SERVER:6,REQUEST_HOST_REGEX:7,LIMIT_THUMBNAIL_CAPTURE:8},(p="Type")in(f=y)?Object.defineProperty(f,p,{value:h,enumerable:!0,configurable:!0,writable:!0}):f[p]=h;var g=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).pattern=t.pattern,r.replacement=t.replacement,r.replacmenServerNodeId=t.replacmenServerNodeId,r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(y);var m=function(e){this.id=e.id,this.flavorParamsId=e.flavorParamsId,this.fileExt=e.fileExt,this.bitrate=e.bitrate,this.width=e.width,this.height=e.height,this.id=e.id,this.frameRate=e.frameRate,this.isOriginal=e.isOriginal,this.isWeb=e.isWeb,this.containerFormat=e.containerFormat,this.videoCodecId=e.videoCodecId,this.status=e.status,this.language=e.language,this.label=e.label};!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(m,"Status",{ERROR:-1,QUEUED:0,CONVERTING:1,READY:2,DELETED:3,NOT_APPLICABLE:4,TEMP:5,WAIT_FOR_CONVERT:6,IMPORTING:7,VALIDATING:8,EXPORTING:9});var v=function(e){this.entryId=e.entryId,this.clickThroughUrl=e.url,this.sources=e.sources?e.sources.map((function(e){return new d(e)})):[]};function _(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function E(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var I=function(e){var t,r;function n(t){var r;if(E(_(r=e.call(this,t)||this),"sources",[]),E(_(r),"actions",[]),E(_(r),"messages",[]),E(_(r),"flavorAssets",[]),E(_(r),"bumperData",[]),!r.hasError){var n=t.messages;n&&n.map((function(e){return r.messages.push(new c.a(e))}));var i=t.actions;i&&i.map((function(e){e.type===y.Type.REQUEST_HOST_REGEX?r.actions.push(new g(e)):r.actions.push(new y(e))}));var a=t.sources;a&&a.map((function(e){return r.sources.push(new d(e))}));var s=t.flavorAssets;s&&s.map((function(e){return r.flavorAssets.push(new m(e))}));var o=t.bumperData;o&&o.map((function(e){return r.bumperData.push(new v(e))}))}return r}r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r;var i=n.prototype;return i.hasBlockAction=function(){return void 0!==this.getBlockAction()},i.getBlockAction=function(){return this.actions.find((function(e){return e.type===y.Type.BLOCK}))},i.getErrorMessages=function(){return this.messages},i.getRequestHostRegexAction=function(){var e=this.actions.find((function(e){return e.type===y.Type.REQUEST_HOST_REGEX}));if(e instanceof g)return e},n}(u.a);function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var R=function(e){this.id=e.id,this.metadataProfileId=e.metadataProfileId,this.metadataProfileVersion=e.metadataProfileVersion,this.metadataProfileId=e.metadataProfileId,this.metadataObjectType=e.metadataObjectType,this.objectId=e.objectId,this.version=e.version,this.created=new Date(0),this.created.setUTCSeconds(e.createdAt),this.updated=new Date(0),this.updated.setUTCSeconds(e.updatedAt),this.status=e.status,this.xml=e.xml};b(R,"ObjectType",{AD_CUE_POINT:"adCuePointMetadata.AdCuePoint",ANNOTATION:"annotationMetadata.Annotation",CODE_CUE_POINT:"codeCuePointMetadata.CodeCuePoint",THUMB_CUE_POINT:"thumbCuePointMetadata.thumbCuePoint",ENTRY:1,CATEGORY:2,USER:3,PARTNER:4,DYNAMIC_OBJECT:5}),b(R,"Status",{VALID:1,INVALID:2,DELETED:3});var O=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).hasError||(r.totalCount=t.totalCount,r.totalCount>0&&(r.metas=[],t.objects.map((function(e){return r.metas.push(new R(e))})))),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a);function T(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(e){this.id=e.id,this.referenceId=e.referenceId,this.externalSourceType=e.externalSourceType,this.name=e.name,this.description=e.description,this.dataUrl=e.dataUrl,this.type=e.type,this.entryType=e.mediaType,this.flavorParamsIds=e.flavorParamsIds,this.duration=e.duration,this.poster=e.thumbnailUrl,this.status=e.status,this.dvrStatus=e.dvrStatus,this.tags=e.tags};T(C,"EntryType",{AUTOMATIC:{value:-1},EXTERNAL_MEDIA:{value:"externalMedia.externalMedia"},MEDIA_CLIP:{value:1},MIX:{value:2},PLAYLIST:{value:5},DATA:{value:6},LIVE_STREAM:{value:7},LIVE_CHANNEL:{value:8},DOCUMENT:{value:10}}),T(C,"MediaType",{VIDEO:{value:1},IMAGE:{value:2},AUDIO:{value:5},LIVE_STREAM_FLASH:{value:201},LIVE_STREAM_WINDOWS_MEDIA:{value:202},LIVE_STREAM_REAL_MEDIA:{value:203},LIVE_STREAM_QUICK_TIME:{value:204}}),T(C,"EntryStatus",{ERROR_IMPORTING:-2,ERROR_CONVERTING:-1,SCAN_FAILURE:"virusScan.ScanFailure",IMPORT:0,INFECTED:"virusScan.Infected",PRECONVERT:1,READY:2,DELETED:3,PENDING:4,MODERATE:5,BLOCKED:6,NO_CONTENT:7}),T(C,"EntryModerationStatus",{PENDING_MODERATION:1,APPROVED:2,REJECTED:3,FLAGGED_FOR_REVIEW:4,MODERATE:5,AUTO_APPROVED:6});var A=function(){function e(){}return e.build=function(e){var t=o.get(),r=t.serviceUrl.substr(0,t.serviceUrl.lastIndexOf("/")),n=e.partnerId,i=e.entryId,a=e.ks,s=e.uiConfId,u=e.format,c=e.protocol,l=e.extension,d=e.flavorIds;if(!r||isNaN(Number.parseInt(n))||!i||!u||!c)return"";var f=r;return r.endsWith("/")||(f+="/"),f+="p/"+n+"/sp/"+n+"00/playManifest/entryId/"+i+"/protocol/"+c+"/format/"+u,d?f+="/flavorIds/"+d:s&&(f+="/uiConfId/"+s),""!==a&&(f+="/ks/"+a),""!==l&&(f+="/a."+l),s&&""!==d&&(f+="?uiConfId="+s),f},e}(),P=function(){function e(){}return e.xmlToJson=function(e){var t={};if(1===e.nodeType){if(e.attributes.length>0){t["@attributes"]={};for(var r=0;r0&&(t.filter((function(e){return!Object(k.c)(e.format)})).forEach(l),o=t.find((function(t){return Object(k.c)(t.format)&&""!==t.getProtocol(e._getBaseProtocol())})),c.progressive=e._parseProgressiveSources(o,s,r,n,i,a.id)),c},e._parseAdaptiveSource=function(t,r,n,i,a,s){var o=new D.a;if(t){var u="",c=k.b.get(t.format),d=t.getProtocol(e._getBaseProtocol()),f=t.deliveryProfileId,p=t.format,h="";if(c&&(h=c.pathExt,o.mimetype=c.mimeType),t.hasFlavorIds()?(!h&&r.flavorAssets&&r.flavorAssets.length>0&&(h=r.flavorAssets[0].fileExt),u=A.build({entryId:s,flavorIds:t.flavorIds,format:p,ks:n,partnerId:i,uiConfId:a,extension:h,protocol:d})):u=e.addKsToUrl(t.url,n),!u){var y="failed to create play url from source, discarding source: ("+s+"_"+f+"), "+p;return e._logger.warn(y),null}if(o.url=e._applyRegexAction(r,u),o.id=s+"_"+f+","+p,t.hasDrmData()){var g=[];t.drm.forEach((function(e){g.push(new S.a(e.licenseURL,l.a.Scheme[e.scheme],e.certificate))})),o.drmData=g}}return o},e._parseProgressiveSources=function(t,r,n,i,a,s){var o=[],u=[];if(t){var c=t.getProtocol(e._getBaseProtocol()),l=t.format,d=t.deliveryProfileId,f=d+","+l;r.flavorAssets.map((function(t){var p=new D.a;p.id=t.id+f,p.mimetype="mp3"===t.fileExt?"audio/mp3":"video/mp4",p.height=t.height,p.width=t.width,p.bandwidth=1024*t.bitrate,p.label=t.label||t.language;var h=A.build({entryId:s,flavorIds:t.id,format:l,ks:n,partnerId:i,uiConfId:a,extension:t.fileExt,protocol:c});if(""===h)return e._logger.warn("failed to create play url from source, discarding source: ("+s+"_"+d+"), "+l+"."),null;p.url=e._applyRegexAction(r,h),t.height&&t.width?o.push(p):u.push(p)}))}return u.length&&!o.length?u:o},e._parseMetadata=function(e){var t={};return e&&e.metas&&e.metas.length>0&&e.metas.forEach((function(e){if(e.xml){var r,n=new DOMParser;e.xml=e.xml.replace(/\r?\n|\r/g,""),e.xml=e.xml.replace(/>\s*/g,">"),e.xml=e.xml.replace(/>\s*/g,">"),r=n.parseFromString(e.xml,"text/xml");var i=P.xmlToJson(r);Object.keys(i.metadata).forEach((function(e){t[e]=i.metadata[e]["#text"]}))}})),t},e._getBaseProtocol=function(){var e=o.get(),t=/^https?:/.exec(e.cdnUrl),r=t?t[0]:document.location.protocol;return"string"==typeof r?r.slice(0,-1):"https"},e.hasBlockAction=function(e){return e.playBackContextResult.hasBlockAction()},e.getBlockAction=function(e){return e.playBackContextResult.getBlockAction()},e.getErrorMessages=function(e){return e.playBackContextResult.getErrorMessages()},e._applyRegexAction=function(e,t){var r=e.getRequestHostRegexAction();if(r){var n=new RegExp(r.pattern,"i");if(t.match(n))return t.replace(n,r.replacement+"/")}return t},e}();!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(F,"_logger",Object(i.b)("OVPProviderParser"));var q=F.addKsToUrl,B=F,K=r(2),H=r(11),W=function(){function e(){}return e.getMultiRequest=function(e,t,r){var n=o.get(),i=n.serviceParams;Object.assign(i,{ks:t,clientTag:"html5:v"+e}),r&&Object.assign(i,{partnerId:r});var a=new Map;a.set("Content-Type","application/json");var s=new H.a(a);return s.method="POST",s.service="multirequest",s.url=s.getUrl(n.serviceUrl),s.params=i,s},e}();var G=function e(t){void 0===t&&(t={}),this.type=t.type||e.Type.INCLUDE_FIELDS,this.fields=t.fields||"id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status"};!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(G,"Type",{INCLUDE_FIELDS:1,EXCLUDE_FIELDS:2});var Y=function(e){var t,r;function n(){return e.apply(this,arguments)||this}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.getPlaybackContext=function(e,t,r){var n=new Map;n.set("Content-Type","application/json");var i=new K.a(n);i.service="baseEntry",i.action="getPlaybackContext",i.method="POST",i.url=i.getUrl(e),i.tag="baseEntry-getPlaybackContext";return i.params={entryId:r,ks:t,contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},i},n.list=function(e,t,r,i,a){var s=new Map;s.set("Content-Type","application/json");var o=new K.a(s);return o.service="baseEntry",o.action="list",o.method="POST",o.url=o.getUrl(e),o.tag="list",o.params=n.getEntryListReqParams(r,t,i,a),o},n.getEntryListReqParams=function(e,t,r,n){var i={};return e?i=r?{redirectFromEntryId:e}:{idEqual:e}:n&&(i={objectType:"KalturaBaseEntryFilter",referenceIdEqual:n}),{ks:t,filter:i,responseProfile:new G}},n}(W);var J=function(e){var t,r;function n(){return e.apply(this,arguments)||this}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.list=function(e,t,r){var n=new Map;n.set("Content-Type","application/json");var i=new K.a(n);i.service="metadata_metadata",i.action="list",i.method="POST",i.url=i.getUrl(e),i.tag="metadata_metadata-list";var a={objectType:"KalturaMetadataFilter",objectIdEqual:r,metadataObjectTypeEqual:"1"};return i.params={filter:a,ks:t},i},n}(W);var X=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).hasError||(r.totalCount=t.totalCount,r.totalCount>0&&(r.entries=[],t.objects.map((function(e){return r.entries.push(new C(e))})))),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a);function Q(e,t){for(var r=0;r-1&&(t.vr={}),Object.assign(t.metadata,e.metadata),t},a=n,(s=[{key:"env",get:function(){return o.get()}}])&&he(a.prototype,s),u&&he(a,u),n}(ce.a);function ge(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var me=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).hasError||(r.name=t.name,r.description=t.description,r.objTypeAsString=t.objTypeAsString,r.width=t.width,r.height=t.height,r.htmlParams=t.htmlParams,r.swfUrl=t.swfUrl,r.confFilePath=t.confFilePath,r.confFile=t.confFile,r.confFileFeatures=t.confFileFeatures,r.config=t.config,r.confVars=t.confVars,r.useCdn=t.useCdn,r.tags=t.tags,r.swfUrlVersion=t.swfUrlVersion,r.created=new Date(0),r.created.setUTCSeconds(t.createdAt),r.updated=new Date(0),r.updated.setUTCSeconds(t.updatedAt),r.html5Url=t.description,r.version=t.description,r.partnerTags=t.description,r.objType=t.description,r.creationMode=t.description),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a);ge(me,"Type",{PLAYER:1,CONTRIBUTION_WIZARD:2,SIMPLE_EDITOR:3,ADVANCED_EDITOR:4,PLAYLIST:5,APP_STUDIO:6,KRECORD:7,PLAYER_V3:8,KMC_ACCOUNT:9,KMC_ANALYTICS:10,KMC_CONTENT:11,KMC_DASHBOARD:12,KMC_LOGIN:13,PLAYER_SL:14,CLIENTSIDE_ENCODER:15,KMC_GENERAL:16,KMC_ROLES_AND_PERMISSIONS:17,CLIPPER:18,KSR:19,KUPLOAD:20,WEBCASTING:21}),ge(me,"CreationMode",{WIZARD:2,ADVANCED:3});var ve="playkit-js-providers-ovp",_e="2.34.0"}])})); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ovp=t():(e.playkit=e.playkit||{},e.playkit.providers=e.playkit.providers||{},e.playkit.providers.ovp=t())}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=17)}([function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(3);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function e(t,r,n,i){void 0===i&&(i={}),this.severity=t,this.category=r,this.code=n,this.data=i,e._logger.error("Category:"+r+" | Code:"+n+" |",i)};i(a,"Severity",{RECOVERABLE:1,CRITICAL:2}),i(a,"Category",{NETWORK:1,SERVICE:2,PROVIDER:3}),i(a,"Code",{UNSUPPORTED_SCHEME:1e3,BAD_HTTP_STATUS:1001,HTTP_ERROR:1002,TIMEOUT:1003,MALFORMED_DATA_URI:1004,BAD_SERVER_RESPONSE:1005,MULTIREQUEST_API_ERROR:1006,API_RESPONSE_MISMATCH:1007,ERROR:2e3,BLOCK_ACTION:2001,MEDIA_STATUS_NOT_READY:2002,MISSING_MANDATORY_PARAMS:3e3,MISSING_PLAY_SOURCE:3001,METHOD_NOT_IMPLEMENTED:3002}),i(a,"_logger",Object(n.b)("Error"))},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(8);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(){this.metadata=new Map,this.sources=new n.a,this.type=e.Type.UNKNOWN}return e.prototype.toJSON=function(){return{id:this.id,name:this.name,sources:this.sources.toJSON(),duration:this.duration,dvrStatus:this.dvrStatus,status:this.status,metadata:this.metadata,type:this.type,poster:this.poster,assetReferenceType:this.assetReferenceType}},e}();i(a,"Type",{VOD:"Vod",LIVE:"Live",IMAGE:"Image",AUDIO:"Audio",UNKNOWN:"Unknown"}),i(a,"DvrStatus",{ON:1,OFF:0})},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var n=r(0);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(e){void 0===e&&(e=new Map),i(this,"retryConfig",{async:!0,timeout:0,maxAttempts:4}),i(this,"_attemptCounter",1),this.headers=e}var t=e.prototype;return t.getUrl=function(e){return e+"/service/"+this.service+(this.action?"/action/"+this.action:"")},t.doHttpRequest=function(){var e=this,t=new Promise((function(t,r){e._requestPromise={resolve:t,reject:r}}));return this.url||this._requestPromise.reject(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.MALFORMED_DATA_URI,{url:this.url})),this._createXHR(),t},t._createXHR=function(){var e=this,t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status)try{var r=JSON.parse(t.responseText);return e.responseHeaders=e._getResponseHeaders(t),e._requestPromise.resolve(r)}catch(r){e._requestPromise.reject(e._createError(t,n.a.Code.BAD_SERVER_RESPONSE,{text:t.responseText}))}},t.open(this.method,this.url,this.retryConfig.async),this.retryConfig.async&&this.retryConfig.timeout&&(t.timeout=this.retryConfig.timeout);var r=performance.now();t.ontimeout=function(){e._handleError(t,n.a.Code.TIMEOUT,{timeout:(performance.now()-r)/1e3,statusText:t.statusText})},t.onerror=t.onabort=function(){e._handleError(t,n.a.Code.HTTP_ERROR,{text:t.responseText,statusText:t.statusText})},this.headers.forEach((function(e,r){t.setRequestHeader(r,e)})),t.send(this.params)},t._getResponseHeaders=function(e){return e.getAllResponseHeaders().split("\n").filter((function(e){return 0===e.toLowerCase().indexOf("x-")}))},t._handleError=function(e,t,r){var n=this._createError(e,t,r);if(e.onreadystatechange=function(){},e.onerror=function(){},e.ontimeout=function(){},e.onabort=function(){},!(this.retryConfig.maxAttempts&&this._attemptCounter0&&(e.drmData=[],this.drmData.forEach((function(t){Array.isArray(e.drmData)&&e.drmData.push(t.toJSON())}))),e},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));r(11);var n=r(0);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var a=function(){function e(e){i(this,"_loadersResponseMap",new Map),i(this,"_loaders",new Map),this._networkRetryConfig=e}var t=e.prototype;return t.add=function(e,t,r){var n=this,i=new e(t);if(i.isValid()){this._loaders.set(e.id,i);var a=this._multiRequest.requests.length,s=i.requests;this._multiRequest.retryConfig=this._networkRetryConfig,s.forEach((function(e){e.params=e.params||{},e.params.ks=e.params.ks||r,n._multiRequest.add(e)}));var o=Array.from(new Array(s.length),(function(e,t){return t+a}));this._loadersResponseMap.set(e.id,o)}},t.fetchData=function(e){var t=this;return new Promise((function(r,i){t._multiRequest.execute(e).then((function(e){t._multiResponse=e.response,t.prepareData(e.response).success?r(t._loaders):i(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.API_RESPONSE_MISMATCH,{headers:e.headers}))}),(function(e){i(e)}))}))},t.prepareData=function(e){var t=this;return this._loaders.forEach((function(r,n){var i=t._loadersResponseMap.get(n);try{i&&i.length>0&&(r.response=e.results.slice(i[0],i[i.length-1]+1))}catch(e){return{success:!1,error:e}}})),{success:!0,data:this._loaders}},e}()},function(e,t,r){"use strict";r.d(t,"a",(function(){return c}));var n=r(2),i=r(3),a=r(4),s=r(0);function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),i=0;i0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));r(1);var n=function(){this.items=[]}},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var n=function(e){this.url=e.url,this.clickThroughUrl=e.clickThroughUrl}},function(e,t,r){"use strict";r.r(t),r.d(t,"Provider",(function(){return ye})),r.d(t,"ProviderParser",(function(){return B})),r.d(t,"NAME",(function(){return ve})),r.d(t,"VERSION",(function(){return _e})),r.d(t,"RequestBuilder",(function(){return K.a})),r.d(t,"ResponseTypes",(function(){return n}));var n={};r.r(n),r.d(n,"KalturaBaseEntryListResponse",(function(){return X})),r.d(n,"KalturaMediaEntry",(function(){return C})),r.d(n,"KalturaAccessControlModifyRequestHostRegexAction",(function(){return g})),r.d(n,"KalturaBumper",(function(){return v})),r.d(n,"KalturaFlavorAsset",(function(){return m})),r.d(n,"KalturaMediaEntries",(function(){return ae})),r.d(n,"KalturaMetadata",(function(){return R})),r.d(n,"KalturaMetadataListResponse",(function(){return O})),r.d(n,"KalturaPlaybackContext",(function(){return I})),r.d(n,"KalturaPlaybackSource",(function(){return d})),r.d(n,"KalturaPlaylist",(function(){return ie})),r.d(n,"KalturaRuleAction",(function(){return y})),r.d(n,"KalturaUIConfResponse",(function(){return me})),r.d(n,"KalturaDrmPlaybackPluginData",(function(){return l.a})),r.d(n,"KalturaAccessControlMessage",(function(){return c.a})),r.d(n,"BaseServiceResult",(function(){return u.a}));var i=r(3),a=r(14),s={serviceUrl:"https://cdnapisec.kaltura.com/api_v3",cdnUrl:"https://cdnapisec.kaltura.com",serviceParams:{apiVersion:"3.3.0",format:1},useApiCaptions:!0},o=function(){function e(){}return e.set=function(e){e&&Object.assign(s,e)},e.get=function(){return Object(a.a)(s)},e}(),u=r(4),c=r(7),l=r(6);var d=function(){function e(e){var t,r,n,i=this;n=[],(r="drm")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,this.format=e.format,this.deliveryProfileId=e.deliveryProfileId,this.url=e.url,this.protocols=e.protocols,this.flavorIds=e.flavorIds,e.drm&&e.drm.map((function(e){return i.drm.push(new l.a(e))}))}var t=e.prototype;return t.hasDrmData=function(){return this.drm&&this.drm.length>0},t.hasFlavorIds=function(){return!!this.flavorIds&&this.flavorIds.length>0},t.getProtocol=function(e){var t="";if(this.protocols&&this.protocols.length>0)this.protocols.split(",").forEach((function(r){r===e&&(t=r)}));else if("http"===e)return e;return t},e}();var f,p,h,y=function(e){this.type=e.type};h={DRM_POLICY:"drm.DRM_POLICY",BLOCK:1,PREVIEW:2,LIMIT_FLAVORS:3,ADD_TO_STORAGE:4,LIMIT_DELIVERY_PROFILES:5,SERVE_FROM_REMOTE_SERVER:6,REQUEST_HOST_REGEX:7,LIMIT_THUMBNAIL_CAPTURE:8},(p="Type")in(f=y)?Object.defineProperty(f,p,{value:h,enumerable:!0,configurable:!0,writable:!0}):f[p]=h;var g=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).pattern=t.pattern,r.replacement=t.replacement,r.replacmenServerNodeId=t.replacmenServerNodeId,r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(y);var m=function(e){this.id=e.id,this.flavorParamsId=e.flavorParamsId,this.fileExt=e.fileExt,this.bitrate=e.bitrate,this.width=e.width,this.height=e.height,this.id=e.id,this.frameRate=e.frameRate,this.isOriginal=e.isOriginal,this.isWeb=e.isWeb,this.containerFormat=e.containerFormat,this.videoCodecId=e.videoCodecId,this.status=e.status,this.language=e.language,this.label=e.label};!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(m,"Status",{ERROR:-1,QUEUED:0,CONVERTING:1,READY:2,DELETED:3,NOT_APPLICABLE:4,TEMP:5,WAIT_FOR_CONVERT:6,IMPORTING:7,VALIDATING:8,EXPORTING:9});var v=function(e){this.entryId=e.entryId,this.clickThroughUrl=e.url,this.sources=e.sources?e.sources.map((function(e){return new d(e)})):[]};function _(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function E(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var I=function(e){var t,r;function n(t){var r;if(E(_(r=e.call(this,t)||this),"sources",[]),E(_(r),"actions",[]),E(_(r),"messages",[]),E(_(r),"flavorAssets",[]),E(_(r),"bumperData",[]),!r.hasError){var n=t.messages;n&&n.map((function(e){return r.messages.push(new c.a(e))}));var i=t.actions;i&&i.map((function(e){e.type===y.Type.REQUEST_HOST_REGEX?r.actions.push(new g(e)):r.actions.push(new y(e))}));var a=t.sources;a&&a.map((function(e){return r.sources.push(new d(e))}));var s=t.flavorAssets;s&&s.map((function(e){return r.flavorAssets.push(new m(e))}));var o=t.bumperData;o&&o.map((function(e){return r.bumperData.push(new v(e))}))}return r}r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r;var i=n.prototype;return i.hasBlockAction=function(){return void 0!==this.getBlockAction()},i.getBlockAction=function(){return this.actions.find((function(e){return e.type===y.Type.BLOCK}))},i.getErrorMessages=function(){return this.messages},i.getRequestHostRegexAction=function(){var e=this.actions.find((function(e){return e.type===y.Type.REQUEST_HOST_REGEX}));if(e instanceof g)return e},n}(u.a);function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var R=function(e){this.id=e.id,this.metadataProfileId=e.metadataProfileId,this.metadataProfileVersion=e.metadataProfileVersion,this.metadataProfileId=e.metadataProfileId,this.metadataObjectType=e.metadataObjectType,this.objectId=e.objectId,this.version=e.version,this.created=new Date(0),this.created.setUTCSeconds(e.createdAt),this.updated=new Date(0),this.updated.setUTCSeconds(e.updatedAt),this.status=e.status,this.xml=e.xml};b(R,"ObjectType",{AD_CUE_POINT:"adCuePointMetadata.AdCuePoint",ANNOTATION:"annotationMetadata.Annotation",CODE_CUE_POINT:"codeCuePointMetadata.CodeCuePoint",THUMB_CUE_POINT:"thumbCuePointMetadata.thumbCuePoint",ENTRY:1,CATEGORY:2,USER:3,PARTNER:4,DYNAMIC_OBJECT:5}),b(R,"Status",{VALID:1,INVALID:2,DELETED:3});var O=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).hasError||(r.totalCount=t.totalCount,r.totalCount>0&&(r.metas=[],t.objects.map((function(e){return r.metas.push(new R(e))})))),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a);function T(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C=function(e){this.id=e.id,this.referenceId=e.referenceId,this.externalSourceType=e.externalSourceType,this.name=e.name,this.description=e.description,this.dataUrl=e.dataUrl,this.type=e.type,this.entryType=e.mediaType,this.flavorParamsIds=e.flavorParamsIds,this.duration=e.duration,this.poster=e.thumbnailUrl,this.status=e.status,this.dvrStatus=e.dvrStatus,this.tags=e.tags};T(C,"EntryType",{AUTOMATIC:{value:-1},EXTERNAL_MEDIA:{value:"externalMedia.externalMedia"},MEDIA_CLIP:{value:1},MIX:{value:2},PLAYLIST:{value:5},DATA:{value:6},LIVE_STREAM:{value:7},LIVE_CHANNEL:{value:8},DOCUMENT:{value:10}}),T(C,"MediaType",{VIDEO:{value:1},IMAGE:{value:2},AUDIO:{value:5},LIVE_STREAM_FLASH:{value:201},LIVE_STREAM_WINDOWS_MEDIA:{value:202},LIVE_STREAM_REAL_MEDIA:{value:203},LIVE_STREAM_QUICK_TIME:{value:204}}),T(C,"EntryStatus",{ERROR_IMPORTING:-2,ERROR_CONVERTING:-1,SCAN_FAILURE:"virusScan.ScanFailure",IMPORT:0,INFECTED:"virusScan.Infected",PRECONVERT:1,READY:2,DELETED:3,PENDING:4,MODERATE:5,BLOCKED:6,NO_CONTENT:7}),T(C,"EntryModerationStatus",{PENDING_MODERATION:1,APPROVED:2,REJECTED:3,FLAGGED_FOR_REVIEW:4,MODERATE:5,AUTO_APPROVED:6});var A=function(){function e(){}return e.build=function(e){var t=o.get(),r=t.serviceUrl.substr(0,t.serviceUrl.lastIndexOf("/")),n=e.partnerId,i=e.entryId,a=e.ks,s=e.uiConfId,u=e.format,c=e.protocol,l=e.extension,d=e.flavorIds;if(!r||isNaN(Number.parseInt(n))||!i||!u||!c)return"";var f=r;return r.endsWith("/")||(f+="/"),f+="p/"+n+"/sp/"+n+"00/playManifest/entryId/"+i+"/protocol/"+c+"/format/"+u,d?f+="/flavorIds/"+d:s&&(f+="/uiConfId/"+s),""!==a&&(f+="/ks/"+a),""!==l&&(f+="/a."+l),s&&""!==d&&(f+="?uiConfId="+s),f},e}(),P=function(){function e(){}return e.xmlToJson=function(e){var t={};if(1===e.nodeType){if(e.attributes.length>0){t["@attributes"]={};for(var r=0;r0&&(t.filter((function(e){return!Object(k.c)(e.format)})).forEach(l),o=t.find((function(t){return Object(k.c)(t.format)&&""!==t.getProtocol(e._getBaseProtocol())})),c.progressive=e._parseProgressiveSources(o,s,r,n,i,a.id)),c},e._parseAdaptiveSource=function(t,r,n,i,a,s){var o=new D.a;if(t){var u="",c=k.b.get(t.format),d=t.getProtocol(e._getBaseProtocol()),f=t.deliveryProfileId,p=t.format,h="";if(c&&(h=c.pathExt,o.mimetype=c.mimeType),t.hasFlavorIds()?(!h&&r.flavorAssets&&r.flavorAssets.length>0&&(h=r.flavorAssets[0].fileExt),u=A.build({entryId:s,flavorIds:t.flavorIds,format:p,ks:n,partnerId:i,uiConfId:a,extension:h,protocol:d})):u=e.addKsToUrl(t.url,n),!u){var y="failed to create play url from source, discarding source: ("+s+"_"+f+"), "+p;return e._logger.warn(y),null}if(o.url=e._applyRegexAction(r,u),o.id=s+"_"+f+","+p,t.hasDrmData()){var g=[];t.drm.forEach((function(e){g.push(new S.a(e.licenseURL,l.a.Scheme[e.scheme],e.certificate))})),o.drmData=g}}return o},e._parseProgressiveSources=function(t,r,n,i,a,s){var o=[],u=[];if(t){var c=t.getProtocol(e._getBaseProtocol()),l=t.format,d=t.deliveryProfileId,f=d+","+l;r.flavorAssets.map((function(t){var p=new D.a;p.id=t.id+f,p.mimetype="mp3"===t.fileExt?"audio/mp3":"video/mp4",p.height=t.height,p.width=t.width,p.bandwidth=1024*t.bitrate,p.label=t.label||t.language;var h=A.build({entryId:s,flavorIds:t.id,format:l,ks:n,partnerId:i,uiConfId:a,extension:t.fileExt,protocol:c});if(""===h)return e._logger.warn("failed to create play url from source, discarding source: ("+s+"_"+d+"), "+l+"."),null;p.url=e._applyRegexAction(r,h),t.height&&t.width?o.push(p):u.push(p)}))}return u.length&&!o.length?u:o},e._parseMetadata=function(e){var t={};return e&&e.metas&&e.metas.length>0&&e.metas.forEach((function(e){if(e.xml){var r,n=new DOMParser;e.xml=e.xml.replace(/\r?\n|\r/g,""),e.xml=e.xml.replace(/>\s*/g,">"),e.xml=e.xml.replace(/>\s*/g,">"),r=n.parseFromString(e.xml,"text/xml");var i=P.xmlToJson(r);Object.keys(i.metadata).forEach((function(e){t[e]=i.metadata[e]["#text"]}))}})),t},e._getBaseProtocol=function(){var e=o.get(),t=/^https?:/.exec(e.cdnUrl),r=t?t[0]:document.location.protocol;return"string"==typeof r?r.slice(0,-1):"https"},e.hasBlockAction=function(e){return e.playBackContextResult.hasBlockAction()},e.getBlockAction=function(e){return e.playBackContextResult.getBlockAction()},e.getErrorMessages=function(e){return e.playBackContextResult.getErrorMessages()},e._applyRegexAction=function(e,t){var r=e.getRequestHostRegexAction();if(r){var n=new RegExp(r.pattern,"i");if(t.match(n))return t.replace(n,r.replacement+"/")}return t},e}();!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(F,"_logger",Object(i.b)("OVPProviderParser"));var q=F.addKsToUrl,B=F,K=r(2),H=r(11),W=function(){function e(){}return e.getMultiRequest=function(e,t,r){var n=o.get(),i=n.serviceParams;Object.assign(i,{ks:t,clientTag:"html5:v"+e}),r&&Object.assign(i,{partnerId:r});var a=new Map;a.set("Content-Type","application/json");var s=new H.a(a);return s.method="POST",s.service="multirequest",s.url=s.getUrl(n.serviceUrl),s.params=i,s},e}();var G=function e(t){void 0===t&&(t={}),this.type=t.type||e.Type.INCLUDE_FIELDS,this.fields=t.fields||"id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status"};!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(G,"Type",{INCLUDE_FIELDS:1,EXCLUDE_FIELDS:2});var Y=function(e){var t,r;function n(){return e.apply(this,arguments)||this}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.getPlaybackContext=function(e,t,r){var n=new Map;n.set("Content-Type","application/json");var i=new K.a(n);i.service="baseEntry",i.action="getPlaybackContext",i.method="POST",i.url=i.getUrl(e),i.tag="baseEntry-getPlaybackContext";return i.params={entryId:r,ks:t,contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},i},n.list=function(e,t,r,i,a){var s=new Map;s.set("Content-Type","application/json");var o=new K.a(s);return o.service="baseEntry",o.action="list",o.method="POST",o.url=o.getUrl(e),o.tag="list",o.params=n.getEntryListReqParams(r,t,i,a),o},n.getEntryListReqParams=function(e,t,r,n){var i={};return e?i=r?{redirectFromEntryId:e}:{idEqual:e}:n&&(i={objectType:"KalturaBaseEntryFilter",referenceIdEqual:n}),{ks:t,filter:i,responseProfile:new G}},n}(W);var J=function(e){var t,r;function n(){return e.apply(this,arguments)||this}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n.list=function(e,t,r){var n=new Map;n.set("Content-Type","application/json");var i=new K.a(n);i.service="metadata_metadata",i.action="list",i.method="POST",i.url=i.getUrl(e),i.tag="metadata_metadata-list";var a={objectType:"KalturaMetadataFilter",objectIdEqual:r,metadataObjectTypeEqual:"1"};return i.params={filter:a,ks:t},i},n}(W);var X=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).hasError||(r.totalCount=t.totalCount,r.totalCount>0&&(r.entries=[],t.objects.map((function(e){return r.entries.push(new C(e))})))),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a);function Q(e,t){for(var r=0;r-1&&(t.vr={}),Object.assign(t.metadata,e.metadata),t},a=n,(s=[{key:"env",get:function(){return o.get()}}])&&he(a.prototype,s),u&&he(a,u),n}(ce.a);function ge(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var me=function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).hasError||(r.name=t.name,r.description=t.description,r.objTypeAsString=t.objTypeAsString,r.width=t.width,r.height=t.height,r.htmlParams=t.htmlParams,r.swfUrl=t.swfUrl,r.confFilePath=t.confFilePath,r.confFile=t.confFile,r.confFileFeatures=t.confFileFeatures,r.config=t.config,r.confVars=t.confVars,r.useCdn=t.useCdn,r.tags=t.tags,r.swfUrlVersion=t.swfUrlVersion,r.created=new Date(0),r.created.setUTCSeconds(t.createdAt),r.updated=new Date(0),r.updated.setUTCSeconds(t.updatedAt),r.html5Url=t.description,r.version=t.description,r.partnerTags=t.description,r.objType=t.description,r.creationMode=t.description),r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,n}(u.a);ge(me,"Type",{PLAYER:1,CONTRIBUTION_WIZARD:2,SIMPLE_EDITOR:3,ADVANCED_EDITOR:4,PLAYLIST:5,APP_STUDIO:6,KRECORD:7,PLAYER_V3:8,KMC_ACCOUNT:9,KMC_ANALYTICS:10,KMC_CONTENT:11,KMC_DASHBOARD:12,KMC_LOGIN:13,PLAYER_SL:14,CLIENTSIDE_ENCODER:15,KMC_GENERAL:16,KMC_ROLES_AND_PERMISSIONS:17,CLIPPER:18,KSR:19,KUPLOAD:20,WEBCASTING:21}),ge(me,"CreationMode",{WIZARD:2,ADVANCED:3});var ve="playkit-js-providers-ovp",_e="2.34.0"}])})); //# sourceMappingURL=playkit-ovp-provider.js.map \ No newline at end of file diff --git a/dist/playkit-ovp-provider.js.map b/dist/playkit-ovp-provider.js.map index 35f1fe41..1cbfdc43 100644 --- a/dist/playkit-ovp-provider.js.map +++ b/dist/playkit-ovp-provider.js.map @@ -1 +1 @@ -{"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./entities/media-entry.js","./providers/./util/request-builder.js","./providers/./util/logger.js","./providers/./k-provider/common/base-service-result.js","./providers/./entities/media-format.js","./providers/./k-provider/common/response-types/kaltura-drm-playback-plugin-data.js","./providers/./k-provider/common/response-types/kaltura-access-control-message.js","./providers/./entities/media-sources.js","./providers/./entities/media-source.js","./providers/./k-provider/common/data-loader-manager.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./entities/drm.js","./providers/./k-provider/common/base-provider.js","./providers/./util/clone.js","./providers/./entities/entry-list.js","./providers/./entities/bumper.js","./providers/./k-provider/ovp/config.js","./providers/./k-provider/ovp/response-types/kaltura-playback-source.js","./providers/./k-provider/ovp/response-types/kaltura-rule-action.js","./providers/./k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.js","./providers/./k-provider/ovp/response-types/kaltura-flavor-asset.js","./providers/./k-provider/ovp/response-types/kaltura-bumper.js","./providers/./k-provider/ovp/response-types/kaltura-playback-context.js","./providers/./k-provider/ovp/response-types/kaltura-metadata.js","./providers/./k-provider/ovp/response-types/kaltura-metadata-list-response.js","./providers/./k-provider/ovp/response-types/kaltura-media-entry.js","./providers/./k-provider/ovp/play-source-url-builder.js","./providers/./util/xml-parser.js","./providers/./entities/playlist.js","./providers/./k-provider/ovp/external-captions-builder.js","./providers/./k-provider/ovp/provider-parser.js","./providers/./k-provider/ovp/services/ovp-service.js","./providers/./k-provider/ovp/request-params/base-entry-response-profile.js","./providers/./k-provider/ovp/services/base-entry-service.js","./providers/./k-provider/ovp/services/meta-data-service.js","./providers/./k-provider/ovp/response-types/kaltura-base-entry-list-response.js","./providers/./k-provider/ovp/loaders/media-entry-loader.js","./providers/./k-provider/ovp/services/session-service.js","./providers/./k-provider/ovp/loaders/session-loader.js","./providers/./k-provider/ovp/loaders/data-loader-manager.js","./providers/./k-provider/ovp/services/playlist-service.js","./providers/./k-provider/ovp/response-types/kaltura-playlist.js","./providers/./k-provider/ovp/response-types/kaltura-media-entries.js","./providers/./k-provider/ovp/loaders/playlist-loader.js","./providers/./k-provider/ovp/loaders/entry-list-loader.js","./providers/./k-provider/ovp/provider.js","./providers/./k-provider/ovp/response-types/kaltura-ui-conf-response.js","./providers/./k-provider/ovp/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","MediaEntry","metadata","Map","sources","MediaSources","type","Type","UNKNOWN","toJSON","id","duration","dvrStatus","status","poster","assetReferenceType","VOD","LIVE","IMAGE","AUDIO","ON","OFF","RequestBuilder","headers","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","JsLogger","VERSION","DEBUG","INFO","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","LogLevel","setLogger","logger","getLogLevel","setLogLevel","level","ServiceResult","objectType","hasError","ServiceError","message","MediaFormat","DASH","mimeType","pathExt","HLS","WVM","MP4","MP3","SupportedStreamFormat","isProgressiveSource","formatName","sourceFormat","KalturaDrmPlaybackPluginData","drm","scheme","licenseURL","certificate","WIDEVINE_CENC","PLAYREADY_CENC","FAIRPLAY","KalturaAccessControlMessage","progressive","dash","hls","map","source","mediaFormat","push","h","MediaSource","mimetype","bandwidth","width","height","label","drmData","length","Array","isArray","DataLoaderManager","networkRetryConfig","_networkRetryConfig","add","loader","ks","execution_loader","isValid","_loaders","set","startIndex","_multiRequest","requests","executionLoaderResponseMap","from","val","index","_loadersResponseMap","fetchData","requestsMustSucceed","execute","then","_multiResponse","prepareData","success","err","loaderDataIndexes","results","slice","MultiRequestBuilder","requestParams","serviceDef","stringify","FAILED_PARSING_REQUEST","multiRequestResult","MultiRequestResult","result","errorResults","serviceResult","Drm","licenseUrl","BaseProvider","options","playerVersion","_partnerId","partnerId","_widgetId","widgetId","_uiConfId","uiConfId","_isAnonymous","_ks","_playerVersion","defaultWidgetId","getMediaConfig","mediaInfo","getPlaylistConfig","playlistInfo","getEntryListConfig","entryListInfo","_verifyHasSources","concat","messages","clone","node","e","keys","EntryList","items","Bumper","clickThroughUrl","defaultConfig","cdnUrl","serviceParams","apiVersion","format","useApiCaptions","OVPConfiguration","clientConfig","KalturaPlaybackSource","deliveryProfileId","protocols","flavorIds","hasDrmData","hasFlavorIds","getProtocol","protocol","returnValue","KalturaRuleAction","DRM_POLICY","BLOCK","PREVIEW","LIMIT_FLAVORS","ADD_TO_STORAGE","LIMIT_DELIVERY_PROFILES","SERVE_FROM_REMOTE_SERVER","REQUEST_HOST_REGEX","LIMIT_THUMBNAIL_CAPTURE","KalturaAccessControlModifyRequestHostRegexAction","pattern","replacement","replacmenServerNodeId","KalturaFlavorAsset","flavorParamsId","fileExt","bitrate","frameRate","isOriginal","isWeb","containerFormat","videoCodecId","language","QUEUED","CONVERTING","READY","DELETED","NOT_APPLICABLE","TEMP","WAIT_FOR_CONVERT","IMPORTING","VALIDATING","EXPORTING","KalturaBumper","entryId","KalturaPlaybackContext","actions","flavorAssets","flavor","bumperData","bumper","hasBlockAction","undefined","getBlockAction","find","getErrorMessages","getRequestHostRegexAction","KalturaMetadata","metadataProfileId","metadataProfileVersion","metadataObjectType","objectId","version","created","Date","setUTCSeconds","createdAt","updated","updatedAt","xml","AD_CUE_POINT","ANNOTATION","CODE_CUE_POINT","THUMB_CUE_POINT","ENTRY","CATEGORY","USER","PARTNER","DYNAMIC_OBJECT","VALID","INVALID","KalturaMetadataListResponse","responseObj","totalCount","metas","objects","meta","KalturaMediaEntry","entry","referenceId","externalSourceType","description","dataUrl","entryType","mediaType","flavorParamsIds","thumbnailUrl","tags","AUTOMATIC","EXTERNAL_MEDIA","MEDIA_CLIP","MIX","PLAYLIST","DATA","LIVE_STREAM","LIVE_CHANNEL","DOCUMENT","VIDEO","LIVE_STREAM_FLASH","LIVE_STREAM_WINDOWS_MEDIA","LIVE_STREAM_REAL_MEDIA","LIVE_STREAM_QUICK_TIME","ERROR_IMPORTING","ERROR_CONVERTING","SCAN_FAILURE","IMPORT","INFECTED","PRECONVERT","PENDING","MODERATE","BLOCKED","NO_CONTENT","PENDING_MODERATION","APPROVED","REJECTED","FLAGGED_FOR_REVIEW","AUTO_APPROVED","PlaySourceUrlBuilder","build","urlParams","config","serviceUrlOrigin","substr","lastIndexOf","extension","isNaN","Number","parseInt","playUrl","endsWith","XmlParser","xmlToJson","obj","nodeType","attributes","j","attribute","item","nodeName","nodeValue","hasChildNodes","childNodes","old","Playlist","KalturaCaptionType","SRT","DFXP","WEBVTT","CAP","CaptionsFormatsMap","ExternalCaptionsBuilder","createConfig","captions","caption","includes","webVttUrl","addKsToUrl","default","isDefault","languageCode","OVPProviderParser","getMediaEntry","mediaEntryResponse","mediaEntry","playbackContext","playBackContextResult","metadataList","metadataListResult","kalturaSources","_getParsedSources","playbackCaptions","_fillBaseData","ksParam","replace","getPlaylist","playlistResponse","playlist","playlistData","playlistItems","entries","getEntryList","entryList","getBumper","assetResponse","progressiveBumper","parsedSources","_parseProgressiveSources","_parseMetadata","_getEntryType","entryTypeEnum","typeEnum","MediaType","EntryType","progressiveSource","mediaSource","addAdaptiveSource","parsedSource","_parseAdaptiveSource","_getBaseProtocol","kalturaSource","_applyRegexAction","drmParams","Scheme","videoSources","audioSources","sourceId","metaXml","domParser","DOMParser","parseFromString","metasObj","exec","document","location","regexAction","regex","RegExp","match","OVPService","getMultiRequest","ovpParams","clientTag","multiReq","BaseEntryResponseProfile","responseProfile","INCLUDE_FIELDS","fields","EXCLUDE_FIELDS","OVPBaseEntryService","getPlaybackContext","serviceEntryId","tag","contextDataParams","flavorTags","list","redirectFromEntryId","getEntryListReqParams","filterParams","idEqual","referenceIdEqual","OVPMetadataService","objectIdEqual","metadataObjectTypeEqual","KalturaBaseEntryListResponse","OVPMediaEntryLoader","buildRequests","_entryId","_referenceId","_requests","_response","OVPSessionService","anonymousSession","OVPSessionLoader","OVPDataLoaderManager","OVPPlaylistService","playlistId","SERVICE_NAME","KalturaPlaylist","KalturaMediaEntries","OVPPlaylistLoader","_playlistId","OVPEntryListLoader","_entries","OVPProvider","env","_setFilterOptionsConfig","filterOptions","networkRetryParameters","_dataLoader","_getEntryRedirectFilter","_parseDataFromResponse","doRequest","loaders","theKs","dataLoader","loaderRequest","_filterOptionsConfig","mediaConfig","session","isAnonymous","_getDefaultSourcesObject","plugins","has","sessionLoader","mediaLoader","_getSourcesObject","_verifyMediaStatus","EntryStatus","_parsePlaylistDataFromResponse","playlistConfig","_getPlaylistObject","playlistLoader","_parseEntryListDataFromResponse","dvr","vr","sourcesObject","mediaSources","KalturaUIConfResponse","objTypeAsString","htmlParams","swfUrl","confFilePath","confFile","confFileFeatures","confVars","useCdn","swfUrlVersion","html5Url","partnerTags","objType","creationMode","PLAYER","CONTRIBUTION_WIZARD","SIMPLE_EDITOR","ADVANCED_EDITOR","APP_STUDIO","KRECORD","PLAYER_V3","KMC_ACCOUNT","KMC_ANALYTICS","KMC_CONTENT","KMC_DASHBOARD","KMC_LOGIN","PLAYER_SL","CLIENTSIDE_ENCODER","KMC_GENERAL","KMC_ROLES_AND_PERMISSIONS","CLIPPER","KSR","KUPLOAD","WEBCASTING","WIZARD","ADVANCED","NAME","__NAME__","__VERSION__"],"mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAa,IAAID,KAEjBD,EAAc,QAAIA,EAAc,SAAK,GAAIA,EAAc,QAAa,UAAIA,EAAc,QAAa,WAAK,GAAIA,EAAc,QAAa,UAAO,IAAIC,KARpJ,CASGK,QAAQ,WACX,O,YCTE,IAAIC,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUP,QAGnC,IAAIC,EAASI,EAAiBE,GAAY,CACzCC,EAAGD,EACHE,GAAG,EACHT,QAAS,IAUV,OANAU,EAAQH,GAAUI,KAAKV,EAAOD,QAASC,EAAQA,EAAOD,QAASM,GAG/DL,EAAOQ,GAAI,EAGJR,EAAOD,QA0Df,OArDAM,EAAoBM,EAAIF,EAGxBJ,EAAoBO,EAAIR,EAGxBC,EAAoBQ,EAAI,SAASd,EAASe,EAAMC,GAC3CV,EAAoBW,EAAEjB,EAASe,IAClCG,OAAOC,eAAenB,EAASe,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEV,EAAoBgB,EAAI,SAAStB,GACX,oBAAXuB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAenB,EAASuB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAenB,EAAS,aAAc,CAAEyB,OAAO,KAQvDnB,EAAoBoB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQnB,EAAoBmB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFAxB,EAAoBgB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOnB,EAAoBQ,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRvB,EAAoB2B,EAAI,SAAShC,GAChC,IAAIe,EAASf,GAAUA,EAAO2B,WAC7B,WAAwB,OAAO3B,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAK,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG7B,EAAoBgC,EAAI,GAIjBhC,EAAoBA,EAAoBiC,EAAI,I,oMCzErD,IAKqBC,EA0BnB,WAAYC,EAAkBC,EAAkBC,EAAcC,QAAgB,IAAhBA,MAAY,IACxEC,KAAKJ,SAAWA,EAChBI,KAAKH,SAAWA,EAChBG,KAAKF,KAAOA,EACZE,KAAKD,KAAOA,EACZJ,EAAMM,QAAQC,MAAd,YAAgCL,EAAhC,WAAmDC,EAAnD,KAA6DC,I,EA/B5CJ,E,WCVU,CAQ7BQ,YAAa,EAMbC,SAAU,I,EDJST,E,WEXU,CAE7BU,QAAS,EACTC,QAAS,EACTC,SAAU,I,EFOSZ,E,OGVE,CAIrBa,mBAAoB,IAKpBC,gBAAiB,KAKjBC,WAAY,KAKZC,QAAS,KAKTC,mBAAoB,KAKpBC,oBAAqB,KAKrBC,uBAAwB,KAKxBC,sBAAuB,KAKvBC,MAAO,IAKPC,aAAc,KAKdC,uBAAwB,KAMxBC,yBAA0B,IAK1BC,oBAAqB,KAKrBC,uBAAwB,O,EH5DL1B,E,UAiBG2B,YAtBG,W,sMINNC,E,WAoEnB,aACEvB,KAAKwB,SAAW,IAAIC,IACpBzB,KAAK0B,QAAU,IAAIC,IACnB3B,KAAK4B,KAAOL,EAAWM,KAAKC,Q,mBAO9BC,OAAA,WACE,MAAO,CACLC,GAAIhC,KAAKgC,GACT9D,KAAM8B,KAAK9B,KACXwD,QAAS1B,KAAK0B,QAAQK,SACtBE,SAAUjC,KAAKiC,SACfC,UAAWlC,KAAKkC,UAChBC,OAAQnC,KAAKmC,OACbX,SAAUxB,KAAKwB,SACfI,KAAM5B,KAAK4B,KACXQ,OAAQpC,KAAKoC,OACbC,mBAAoBrC,KAAKqC,qB,OAzFVd,E,OACqB,CACtCe,IAAK,MACLC,KAAM,OACNC,MAAO,QACPC,MAAO,QACPX,QAAS,Y,EANQP,E,YAQ0B,CAC3CmB,GAAI,EACJC,IAAK,K,kMCVT,IAEqBC,E,WAwEnB,WAAYC,QAA0C,IAA1CA,MAA+B,IAAIpB,KAAO,qBA1BR,CAC5CqB,OAAO,EACPC,QAAS,EACTC,YAAa,IAuBuC,yBAd5B,GAexBhD,KAAK6C,QAAUA,E,2BASjBI,OAAA,SAAOC,GACL,OAAOA,EAAa,YAAclD,KAAKmD,SAAWnD,KAAKoD,OAAS,WAAapD,KAAKoD,OAAS,K,EAQ7FC,cAAA,WAA8B,WACtBC,EAAU,IAAIC,SAAQ,SAACC,EAASC,GACpC,EAAKC,gBAAkB,CACrBF,UACAC,aAWJ,OARKzD,KAAK2D,KACR3D,KAAK0D,gBAAgBD,OACnB,IAAI9D,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAASxD,QAASV,IAAMmE,KAAKlD,mBAAoB,CACxF+C,IAAK3D,KAAK2D,OAIhB3D,KAAK+D,aACET,G,EAGTS,WAAA,WAAmB,WACbC,EAAU,IAAIC,eAClBD,EAAQE,mBAAqB,WAC3B,GAA2B,IAAvBF,EAAQG,YACa,MAAnBH,EAAQ7B,OACV,IACE,IAAMiC,EAAWC,KAAKC,MAAMN,EAAQO,cAGpC,OAFA,EAAKC,gBAAkB,EAAKC,oBAAoBT,GAEzC,EAAKN,gBAAgBF,QAAQY,GACpC,MAAOlE,GACP,EAAKwD,gBAAgBD,OACnB,EAAKiB,aAAaV,EAASrE,IAAMmE,KAAKjD,oBAAqB,CACzD8D,KAAMX,EAAQO,kBAO1BP,EAAQY,KAAK5E,KAAK6E,OAAQ7E,KAAK2D,IAAK3D,KAAK8E,YAAYhC,OACjD9C,KAAK8E,YAAYhC,OAAS9C,KAAK8E,YAAY/B,UAC7CiB,EAAQjB,QAAU/C,KAAK8E,YAAY/B,SAErC,IAAMgC,EAAcC,YAAYC,MAChCjB,EAAQkB,UAAY,WAClB,EAAKC,aAAanB,EAASrE,IAAMmE,KAAKnD,QAAS,CAC7CoC,SAAUiC,YAAYC,MAAQF,GAAe,IAC7CK,WAAYpB,EAAQoB,cAGxBpB,EAAQqB,QAAUrB,EAAQsB,QAAU,WAClC,EAAKH,aAAanB,EAASrE,IAAMmE,KAAKpD,WAAY,CAChDiE,KAAMX,EAAQO,aACda,WAAYpB,EAAQoB,cAGxBpF,KAAK6C,QAAQ0C,SAAQ,SAAC3G,EAAOM,GAC3B8E,EAAQwB,iBAAiBtG,EAAKN,MAEhCoF,EAAQyB,KAAKzF,KAAK0F,S,EAGpBjB,oBAAA,SAAoBT,GAClB,OAAOA,EACJ2B,wBACAC,MAAM,MACNC,QAAO,SAAAC,GAAM,OAA4D,IAAxDA,EAAOC,cAAcC,QA9JP,U,EAiKpCb,aAAA,SAAanB,EAAyBlE,EAAcC,GAClD,IAAMG,EAAQF,KAAK0E,aAAaV,EAASlE,EAAMC,GAK/C,GAJAiE,EAAQE,mBAAqB,aAC7BF,EAAQqB,QAAU,aAClBrB,EAAQkB,UAAY,aACpBlB,EAAQsB,QAAU,eACdtF,KAAK8E,YAAY9B,aAAehD,KAAKiG,gBAAkBjG,KAAK8E,YAAY9B,aAI1E,OAAOhD,KAAK0D,gBAAgBD,OAAOvD,GAHnCF,KAAKiG,kBACLjG,KAAK+D,c,EAMTW,aAAA,SAAaV,EAAyBlE,EAAcC,GAMlD,OALA1B,OAAO6H,OAAOnG,EAAM,CAClB4D,IAAK3D,KAAK2D,IACVd,QAAS7C,KAAKyE,oBAAoBT,GAClCmC,QAASnG,KAAKiG,kBAET,IAAItG,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAASxD,QAASP,EAAMC,I,mCCtJ5E,4IAAIqG,EAAW,CACb5H,IAAK,iBAAO,CACV6H,QAAS,GACTC,MAAO,CAAC1H,MAAO,GAAIV,KAAM,IACzB8C,MAAO,CAACpC,MAAO,GAAIV,KAAM,IACzBqI,KAAM,CAAC3H,MAAO,GAAIV,KAAM,IACxByE,IAAK,CAAC/D,MAAO,GAAIV,KAAM,IACvBsI,KAAM,CAAC5H,MAAO,GAAIV,KAAM,IACxBuI,MAAO,CAAC7H,MAAO,GAAIV,KAAM,IACzBwI,KAAM,CAAC9H,MAAO,GAAIV,KAAM,IACxByI,qBAAsB,aACtBC,MAAO,aACPC,WAAY,aACZ3G,MAAO,aACP1B,IAAK,aACLsI,SAAU,aACVC,KAAM,aACNC,IAAK,aACLC,WAAY,aACZC,SAAU,aACVC,KAAM,aACNC,QAAS,aACTC,MAAO,aACPC,YAAa,aACbC,KAAM,gBAINC,EAAyB,GAM7B,SAASC,EAAUC,GACbA,GAAsC,mBAArBA,EAAOpG,YAC1B8E,EAAS5H,IAAMkJ,EAAOpG,WAEpBoG,GAAUA,EAAOF,WACnBA,EAAWE,EAAOF,UAStB,SAASlG,EAAUpD,GAEjB,OAAOkI,EAAS5H,IAAIN,GAQtB,SAASyJ,EAAYzJ,GACnB,OAAOoD,EAAUpD,GAAM4I,WASzB,SAASc,EAAYC,EAAuB3J,GAC1CoD,EAAUpD,GAAMgJ,SAASW,GAGZvG,O,mECzGMwG,EAqBnB,SAAY1D,G,aAhBQ,G,EAgBU,c,EAAA,M,sFACA,wBAAxBA,EAAS2D,YACX/H,KAAKgI,UAAW,EAChBhI,KAAKE,MAAQ,IAAI+H,EAAa7D,EAAStE,KAAMsE,EAAS8D,UAC7C9D,EAASlE,OAAuC,wBAA9BkE,EAASlE,MAAM6H,YAC1C/H,KAAKgI,UAAW,EAChBhI,KAAKE,MAAQ,IAAI+H,EAAa7D,EAASlE,MAAMJ,KAAMsE,EAASlE,MAAMgI,UAElElI,KAAKD,KAAOqE,GAKZ6D,EAiBJ,SAAYnI,EAAcoI,GACxBlI,KAAKF,KAAOA,EACZE,KAAKkI,QAAUA,I,6BCrDnB,sGAAO,IAAMC,EAAyD,CACpEC,KAAM,CACJlK,KAAM,OACNmK,SAAU,uBACVC,QAAS,OAEXC,IAAK,CACHrK,KAAM,MACNmK,SAAU,wBACVC,QAAS,QAEXE,IAAK,CACHtK,KAAM,MACNmK,SAAU,YACVC,QAAS,OAEXG,IAAK,CACHvK,KAAM,MACNmK,SAAU,YACVC,QAAS,OAEXI,IAAK,CACHxK,KAAM,MACNmK,SAAU,aACVC,QAAS,QAIAK,EAA8D,IAAIlH,IAAI,CACjF,CAAC,WAAY0G,EAAYC,MACzB,CAAC,YAAaD,EAAYI,KAC1B,CAAC,MAAOJ,EAAYM,OAQtB,SAASG,EAAoBC,GAC3B,IAAMC,EAAeH,EAAsBnK,IAAIqK,GAC/C,QAASC,GAAgBA,EAAa5K,OAASiK,EAAYM,IAAIvK,O,+DCzC1D,I,MAAM6K,EAgCX,SAAYC,GACVhJ,KAAKiJ,OAASD,EAAIC,OAClBjJ,KAAKkJ,WAAaF,EAAIE,WACtBlJ,KAAKmJ,YAAcH,EAAIG,a,EAlCmB,CAC1C,qBAAsB,0BACtB,oBAAqB,qBACrB,oBAAqB,qBACrBC,cAAe,qBACfC,eAAgB,0BAChBC,SAAU,uB,gBAPDP,G,oHCAb,kCAAO,IAAMQ,EAgBX,SAAYxJ,GACVC,KAAKkI,QAAUnI,EAAKmI,QACpBlI,KAAKF,KAAOC,EAAKD,O,6BClBrB,kDAGqB6B,E,WAwBnB,aACE3B,KAAKwJ,YAAc,GACnBxJ,KAAKyJ,KAAO,GACZzJ,KAAK0J,IAAM,G,2BASbC,IAAA,SAAIC,EAAqBC,GACvB,GAAIA,EACF,OAAQA,EAAY3L,MAClB,KAAKiK,IAAYM,IAAIvK,KACnB8B,KAAKwJ,YAAYM,KAAKF,GACtB,MACF,KAAKzB,IAAYC,KAAKlK,KACpB8B,KAAKyJ,KAAKK,KAAKF,GACf,MACF,KAAKzB,IAAYI,IAAIrK,KACnB8B,KAAK0J,IAAII,KAAKF,K,EAYtB7H,OAAA,WACE,IAAMqC,EAAuC,CAC3CoF,YAAa,GACbC,KAAM,GACNC,IAAK,IAKP,OAHA1J,KAAKwJ,YAAYjE,SAAQ,SAAA9F,GAAC,OAAI2E,EAASoF,YAAYM,KAAKrK,EAAEsC,aAC1D/B,KAAK0J,IAAInE,SAAQ,SAAAwE,GAAC,OAAI3F,EAASsF,IAAII,KAAKC,EAAEhI,aAC1C/B,KAAKyJ,KAAKlE,SAAQ,SAAAtH,GAAC,OAAImG,EAASqF,KAAKK,KAAK7L,EAAE8D,aACrCqC,G,mCCtEX,4CAEqB4F,E,4CA8CnBjI,OAAA,WACE,IAAMqC,EAAsC,CAC1CpC,GAAIhC,KAAKgC,GACT2B,IAAK3D,KAAK2D,IACVsG,SAAUjK,KAAKiK,UAcjB,OAZIjK,KAAKkK,YAAW9F,EAAS8F,UAAYlK,KAAKkK,WAC1ClK,KAAKmK,QAAO/F,EAAS+F,MAAQnK,KAAKmK,OAClCnK,KAAKoK,SAAQhG,EAASgG,OAASpK,KAAKoK,QACpCpK,KAAKqK,QAAOjG,EAASiG,MAAQrK,KAAKqK,OAClCrK,KAAKsK,SAAWtK,KAAKsK,QAAQC,OAAS,IACxCnG,EAASkG,QAAU,GACnBtK,KAAKsK,QAAQ/E,SAAQ,SAAAtH,GACfuM,MAAMC,QAAQrG,EAASkG,UACzBlG,EAASkG,QAAQR,KAAK7L,EAAE8D,cAIvBqC,G,kNC/DUsG,E,WA4BnB,WAAYC,GAAoD,6BAtBd,IAAIlJ,KAsBU,kBAJ/B,IAAIA,KAKnCzB,KAAK4K,oBAAsBD,E,2BAW7BE,IAAA,SAAIC,EAAkBpF,EAAgBqF,GAAmB,WACnDC,EAAmB,IAAIF,EAAOpF,GAClC,GAAIsF,EAAiBC,UAAW,CAC9BjL,KAAKkL,SAASC,IAAIL,EAAO9I,GAAIgJ,GAE7B,IAAII,EAAapL,KAAKqL,cAAcC,SAASf,OAEzCe,EAAWN,EAAiBM,SAChCtL,KAAKqL,cAAcvG,YAAc9E,KAAK4K,oBAEtCU,EAAS/F,SAAQ,SAAAvB,GACfA,EAAQ0B,OAAS1B,EAAQ0B,QAAU,GACnC1B,EAAQ0B,OAAOqF,GAAK/G,EAAQ0B,OAAOqF,IAAMA,EACzC,EAAKM,cAAcR,IAAI7G,MAGzB,IAAIuH,EAA6Bf,MAAMgB,KAAK,IAAIhB,MAAMc,EAASf,SAAS,SAACkB,EAAKC,GAAN,OAAgBA,EAAQN,KAEhGpL,KAAK2L,oBAAoBR,IAAIL,EAAO9I,GAAIuJ,K,EAU5CK,UAAA,SAAUC,GAA6C,WACrD,OAAO,IAAItI,SAAQ,SAACC,EAASC,GAC3B,EAAK4H,cAAcS,QAAQD,GAAqBE,MAC9C,SAAAhM,GACE,EAAKiM,eAAiBjM,EAAKqE,SACA,EAAK6H,YAAYlM,EAAKqE,UAChC8H,QACf1I,EAAQ,EAAK0H,UAEbzH,EACE,IAAI9D,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAASxD,QAASV,IAAMmE,KAAK/C,sBAAuB,CAC3F8B,QAAS9C,EAAK8C,cAKtB,SAAAsJ,GACE1I,EAAO0I,U,EAYfF,YAAA,SAAY7H,GAAsC,WAWhD,OAVApE,KAAKkL,SAAS3F,SAAQ,SAACuF,EAAQ5M,GAC7B,IAAIkO,EAAoB,EAAKT,oBAAoBnN,IAAIN,GACrD,IACMkO,GAAqBA,EAAkB7B,OAAS,IAClDO,EAAO1G,SAAWA,EAASiI,QAAQC,MAAMF,EAAkB,GAAIA,EAAkBA,EAAkB7B,OAAS,GAAK,IAEnH,MAAO4B,GACP,MAAO,CAACD,SAAS,EAAOhM,MAAOiM,OAG5B,CAACD,SAAS,EAAMnM,KAAMC,KAAKkL,W,4VC1GjBqB,E,2KAMe,I,oHAOlC1B,IAAA,SAAI7G,GAA8C,MAChDhE,KAAKsL,SAASxB,KAAK9F,GACnB,IAAMwI,EAAgB,GAChBC,EAAqB,CAACtJ,QAASa,EAAQb,QAASC,OAAQY,EAAQZ,QAItE,OAHA/E,OAAO6H,OAAOsG,IAAd,MAA+BxM,KAAKsL,SAASf,QAASlM,OAAO6H,OAAOuG,EAAYzI,EAAQ0B,QAAxF,IACArH,OAAO6H,OAAOsG,EAAexM,KAAK0F,QAClC1F,KAAK0F,OAAS8G,EACPxM,M,EAST8L,QAAA,SAAQD,GAAgD,WACtD,OAAO,IAAItI,SAAQ,SAACC,EAASC,GAC3B,IACE,EAAKiC,OAASrB,KAAKqI,UAAU,EAAKhH,QAClC,MAAOyG,GACPI,EAAoBtM,QAAQC,MAA5B,GAAqCiM,EAAIjE,SACzCzE,EACE,IAAI9D,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAAStD,SAAUZ,IAAMmE,KAAK6I,uBAAwB,CAC7FzM,MAAOiM,EACPzG,OAAQ,EAAKA,UAInB,EAAKrC,gBAAgB0I,MACnB,SAAAhM,GACE,IAAM6M,EAAqB,IAAIC,EAAmB9M,EAAM8L,GACpDe,EAAmBV,QACrB1I,EAAQ,CACNX,QAAS,EAAK2B,gBACdJ,SAAUwI,IAGZnJ,EACE,IAAI9D,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAASxD,QAASV,IAAMmE,KAAKhD,uBAAwB,CAC5F6C,IAAK,EAAKA,IACVd,QAAS,EAAK2B,gBACd6H,QAASO,EAAmBP,cAKpC,SAAAF,GACE1I,EAAO0I,U,GA7DgCvJ,K,EAA5B2J,E,UACFjL,YAAU,wBAmEtB,IAAMuL,EAiBX,WAAYzI,EAAkByH,QAAsC,IAAtCA,OAAgC,GAAM,iBANpC,IAO9B,IAAMiB,EAAS1I,EAAS0I,OAAS1I,EAAS0I,OAAS1I,EAE7CiI,GADc7B,MAAMC,QAAQqC,GAAUA,EAAS,CAACA,IAC1BnD,KAAI,SAAAmD,GAAM,OAAI,IAAIhF,IAAcgF,MACtDC,EAAe/M,KAAKqM,QAAQxG,QAAO,SAAAmH,GAAa,OAAIA,EAAchF,YAExE+E,EAAaxH,SAAQ,SAAAyH,GACnBH,EAAmB5M,QAAQC,MAA3B,8CACgD8M,EAAc9M,MAAMJ,KADpE,iBACyFkN,EAAc9M,MAAMgI,QAD7G,QAKG2D,GAAuBkB,EAAaxC,QAAWwC,EAAaxC,SAAWvK,KAAKqM,QAAQ9B,QACvFvK,KAAKqM,QAAUA,EACfrM,KAAKkM,SAAU,IAEflM,KAAKqM,QAAUrM,KAAKqM,QAAQxG,QAAO,SAAAmH,GAAa,OAAKA,EAAchF,YACnEhI,KAAKkM,SAAU,I,EAlCRW,E,UACMvL,YAAU,wB,mEC1ER2L,E,WAwBnB,WAAYC,EAAoBjE,EAAgBE,GAC9CnJ,KAAKkN,WAAaA,EAClBlN,KAAKiJ,OAASA,EACVE,IACFnJ,KAAKmJ,YAAcA,G,mBAQvBpH,OAAA,WACE,IAAMqC,EAAkC,CACtC8I,WAAYlN,KAAKkN,WACjBjE,OAAQjJ,KAAKiJ,QAGf,OADIjJ,KAAKmJ,cAAa/E,EAAS+E,YAAcnJ,KAAKmJ,aAC3C/E,G,kUCtCU+I,E,WA+CnB,WAAYC,EAAgCC,G,YAtCU,CACpDvK,OAAO,EACPC,QAAS,EACTC,YAAa,I,EAmCoD,yB,EAAA,M,sFACjEyE,YAAU2F,EAAQ1F,QAClB1H,KAAKsN,WAAaF,EAAQG,UAC1BvN,KAAKwN,UAAYJ,EAAQK,SACzBzN,KAAK0N,UAAYN,EAAQO,SACzB3N,KAAK4N,cAAgBR,EAAQrC,GAC7B/K,KAAK6N,IAAMT,EAAQrC,IAAM,GACzB/K,KAAK8N,eAAiBT,E,qCAtCtB,OAAOrN,KAAKsN,a,+BAIZ,OAAOtN,KAAKwN,WAAaxN,KAAK+N,kB,sCAI9B,MAAO,IAAM/N,KAAKsN,a,+BAIlB,OAAOtN,KAAK0N,Y,yBAIZ,OAAO1N,KAAK6N,K,aAGPjP,GACLoB,KAAK6N,IAAMjP,I,oCAIX,OAAOoB,KAAK8N,iB,kCAIZ,OAAO9N,KAAK4N,iB,2BAcdI,eAAA,SAAeC,GACb,OAAO1K,QAAQE,OACb,IAAI9D,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAAStD,SAAUZ,IAAMmE,KAAKzC,uBAAwB,CAC7F6G,QAAS,mE,EAMfgG,kBAAA,SAAkBC,GAChB,OAAO5K,QAAQE,OACb,IAAI9D,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAAStD,SAAUZ,IAAMmE,KAAKzC,uBAAwB,CAC7F6G,QAAS,2D,EAMfkG,mBAAA,SAAmBC,GACjB,OAAO9K,QAAQE,OACb,IAAI9D,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAAStD,SAAUZ,IAAMmE,KAAKzC,uBAAwB,CAC7F6G,QAAS,uD,EAKfoG,kBAAA,SAAkB5M,GAChB,GAAqE,IAAjEA,EAAQgI,IAAI6E,OAAO7M,EAAQ+H,KAAM/H,EAAQ8H,aAAae,OACxD,MAAM,IAAI5K,IAAMA,IAAMiE,SAASxD,SAAUT,IAAMkE,SAASvD,QAASX,IAAMmE,KAAK1C,oBAAqB,CAC/FgC,OAAQ,GACRoL,SAAU,gCAAgC9M,EAAQM,M,EASxD2F,YAAA,SAAYzJ,GACV,OAAOyJ,YAAYzJ,I,EAGrB0J,YAAA,SAAYC,EAAe3J,GACzB0J,YAAYC,EAAO3J,I,oCARnB,OAAOsJ,Q,mCCnGX,sCAAMiH,EAAQ,SAARA,EAAQ1O,GACZ,IAAI2O,EAkBJ,OAjBIlE,MAAMC,QAAQ1K,IAChB2O,EAAO3O,EAAKwK,OAAS,EAAIxK,EAAKuM,MAAM,GAAK,IACpC/G,SAAQ,SAACoJ,EAAGhR,IACG,iBAANgR,GAAkBA,IAAM,IAAQnE,MAAMC,QAAQkE,IAAMA,EAAEpE,OAAS,KACzEmE,EAAK/Q,GAAK8Q,EAAME,OAGK,iBAAT5O,GAChB2O,EAAOrQ,OAAO6H,OAAO,GAAInG,GACzB1B,OAAOuQ,KAAKF,GAAMnJ,SAAQ,SAAArG,IACE,iBAAdwP,EAAKxP,IAAqBwP,EAAKxP,KAAS,IAAQsL,MAAMC,QAAQiE,EAAKxP,KAASwP,EAAKxP,GAAKqL,OAAS,KACzGmE,EAAKxP,GAAOuP,EAAMC,EAAKxP,SAI3BwP,EAAO3O,EAEF2O,I,6BCjBT,2CAEqBG,EAOnB,WACE7O,KAAK8O,MAAQ,K,mECVIC,EAgBnB,SAAYhP,GACVC,KAAK2D,IAAM5D,EAAK4D,IAChB3D,KAAKgP,gBAAkBjP,EAAKiP,kB,wsCCjB1BC,EAAwB,CAC5B/L,WAAY,uCACZgM,OAAQ,gCACRC,cAAe,CACbC,WAAY,QACZC,OAAQ,GAEVC,gBAAgB,GAGGC,E,kCACZpE,IAAP,SAAWqE,GACLA,GACFnR,OAAO6H,OAAO+I,EAAeO,I,EAI1BhR,IAAP,WACE,OAAOiQ,YAAMQ,I,0BChBV,IAAMQ,EAAb,WAoCE,WAAY7F,GAAgB,I,MAAA,O,EANe,I,EAMf,S,EAAA,M,sFAC1B5J,KAAKqP,OAASzF,EAAOyF,OACrBrP,KAAK0P,kBAAoB9F,EAAO8F,kBAChC1P,KAAK2D,IAAMiG,EAAOjG,IAClB3D,KAAK2P,UAAY/F,EAAO+F,UACxB3P,KAAK4P,UAAYhG,EAAOgG,UACpBhG,EAAOZ,KACTY,EAAOZ,IAAIW,KAAI,SAAAX,GAAG,OAAI,EAAKA,IAAIc,KAAK,IAAIf,IAA6BC,OA3C3E,2BAoDE6G,WAAA,WACE,OAAO7P,KAAKgJ,KAAOhJ,KAAKgJ,IAAIuB,OAAS,GArDzC,EA6DEuF,aAAA,WACE,QAAS9P,KAAK4P,WAAa5P,KAAK4P,UAAUrF,OAAS,GA9DvD,EAsEEwF,YAAA,SAAYC,GACV,IAAIC,EAAsB,GAC1B,GAAIjQ,KAAK2P,WAAa3P,KAAK2P,UAAUpF,OAAS,EACVvK,KAAK2P,UAAU/J,MAAM,KAC1CL,SAAQ,SAAA9F,GACfA,IAAMuQ,IACRC,EAAcxQ,WAGb,GAAiB,SAAbuQ,EACT,OAAOA,EAET,OAAOC,GAlFX,KCJO,I,MAAMC,EAuBX,SAAYnQ,GACVC,KAAK4B,KAAO7B,EAAK6B,M,EAvB8B,CAC/CuO,WAAY,iBACZC,MAAO,EACPC,QAAS,EACTC,cAAe,EACfC,eAAgB,EAChBC,wBAAyB,EACzBC,yBAA0B,EAC1BC,mBAAoB,EACpBC,wBAAyB,I,cAVhBT,G,sFCEN,IAAMU,EAAb,Y,QAqBE,WAAY7Q,GAAc,aACxB,cAAMA,IAAN,MACK8Q,QAAU9Q,EAAK8Q,QACpB,EAAKC,YAAc/Q,EAAK+Q,YACxB,EAAKC,sBAAwBhR,EAAKgR,sBAJV,EArB5B,O,EAAA,G,EAAA,G,6EAAA,GAAsEb,GCF/D,IAAMc,EA0FX,SAAYjR,GACVC,KAAKgC,GAAKjC,EAAKiC,GACfhC,KAAKiR,eAAiBlR,EAAKkR,eAC3BjR,KAAKkR,QAAUnR,EAAKmR,QACpBlR,KAAKmR,QAAUpR,EAAKoR,QACpBnR,KAAKmK,MAAQpK,EAAKoK,MAClBnK,KAAKoK,OAASrK,EAAKqK,OACnBpK,KAAKgC,GAAKjC,EAAKiC,GACfhC,KAAKoR,UAAYrR,EAAKqR,UACtBpR,KAAKqR,WAAatR,EAAKsR,WACvBrR,KAAKsR,MAAQvR,EAAKuR,MAClBtR,KAAKuR,gBAAkBxR,EAAKwR,gBAC5BvR,KAAKwR,aAAezR,EAAKyR,aACzBxR,KAAKmC,OAASpC,EAAKoC,OACnBnC,KAAKyR,SAAW1R,EAAK0R,SACrBzR,KAAKqK,MAAQtK,EAAKsK,Q,8GAzGT2G,E,SACiC,CAC1ChQ,OAAQ,EACR0Q,OAAQ,EACRC,WAAY,EACZC,MAAO,EACPC,QAAS,EACTC,eAAgB,EAChBC,KAAM,EACNC,iBAAkB,EAClBC,UAAW,EACXC,WAAY,EACZC,UAAW,ICVR,IAAMC,EAiBX,SAAYrS,GACVC,KAAKqS,QAAUtS,EAAKsS,QACpBrS,KAAKgP,gBAAkBjP,EAAK4D,IAC5B3D,KAAK0B,QAAU3B,EAAK2B,QAAU3B,EAAK2B,QAAQiI,KAAI,SAAAC,GAAM,OAAI,IAAI6F,EAAsB7F,MAAW,I,mPCd3F,IAAM0I,EAAb,Y,QA+BE,WAAYlO,GAAkB,MAE5B,GAF4B,IAC5B,cAAMA,IAAN,MAD4B,UA1BU,IA0BV,iBArBM,IAqBN,kBAhBiB,IAgBjB,sBAXY,IAWZ,oBANK,KAQ5B,EAAK4D,SAAU,CAClB,IAAMwG,EAAWpK,EAASoK,SACtBA,GACFA,EAAS7E,KAAI,SAAAzB,GAAO,OAAI,EAAKsG,SAAS1E,KAAK,IAAIP,IAA4BrB,OAE7E,IAAMqK,EAAUnO,EAASmO,QACrBA,GACFA,EAAQ5I,KAAI,SAAAvG,GACNA,EAAOxB,OAASsO,EAAkBrO,KAAK6O,mBACzC,EAAK6B,QAAQzI,KAAK,IAAI8G,EAAiDxN,IAEvE,EAAKmP,QAAQzI,KAAK,IAAIoG,EAAkB9M,OAI9C,IAAM1B,EAAU0C,EAAS1C,QACrBA,GACFA,EAAQiI,KAAI,SAAAC,GAAM,OAAI,EAAKlI,QAAQoI,KAAK,IAAI2F,EAAsB7F,OAEpE,IAAM4I,EAAepO,EAASoO,aAC1BA,GACFA,EAAa7I,KAAI,SAAA8I,GAAM,OAAI,EAAKD,aAAa1I,KAAK,IAAIkH,EAAmByB,OAE3E,IAAMC,EAAatO,EAASsO,WACxBA,GACFA,EAAW/I,KAAI,SAAAgJ,GAAM,OAAI,EAAKD,WAAW5I,KAAK,IAAIsI,EAAcO,OA3BxC,S,EA/BhC,G,EAAA,G,6EAAA,2BA+DEC,eAAA,WACE,YAAiCC,IAA1B7S,KAAK8S,kBAhEhB,EAmEEA,eAAA,WACE,OAAO9S,KAAKuS,QAAQQ,MAAK,SAAA3P,GAAM,OAAIA,EAAOxB,OAASsO,EAAkBrO,KAAKuO,UApE9E,EAuEE4C,iBAAA,WACE,OAAOhT,KAAKwO,UAxEhB,EAgFEyE,0BAAA,WACE,IAAM7P,EAASpD,KAAKuS,QAAQQ,MAAK,SAAA3P,GAAM,OAAIA,EAAOxB,OAASsO,EAAkBrO,KAAK6O,sBAClF,GAAItN,aAAkBwN,EACpB,OAAOxN,GAnFb,GAA4C0E,K,wHCRrC,IAAMoL,EAkCX,SAAYnT,GACVC,KAAKgC,GAAKjC,EAAKiC,GACfhC,KAAKmT,kBAAoBpT,EAAKoT,kBAC9BnT,KAAKoT,uBAAyBrT,EAAKqT,uBACnCpT,KAAKmT,kBAAoBpT,EAAKoT,kBAC9BnT,KAAKqT,mBAAqBtT,EAAKsT,mBAC/BrT,KAAKsT,SAAWvT,EAAKuT,SACrBtT,KAAKuT,QAAUxT,EAAKwT,QACpBvT,KAAKwT,QAAU,IAAIC,KAAK,GACxBzT,KAAKwT,QAAQE,cAAc3T,EAAK4T,WAChC3T,KAAK4T,QAAU,IAAIH,KAAK,GACxBzT,KAAK4T,QAAQF,cAAc3T,EAAK8T,WAChC7T,KAAKmC,OAASpC,EAAKoC,OACnBnC,KAAK8T,IAAM/T,EAAK+T,K,EA/CPZ,E,aAC4C,CACrDa,aAAc,gCACdC,WAAY,gCACZC,eAAgB,oCAChBC,gBAAiB,sCACjBC,MAAO,EACPC,SAAU,EACVC,KAAM,EACNC,QAAS,EACTC,eAAgB,I,EAVPrB,E,SAaiC,CAC1CsB,MAAO,EACPC,QAAS,EACT5C,QAAS,ICbN,IAAM6C,EAAb,Y,QAQE,WAAYC,GAAqB,aAC/B,cAAMA,IAAN,MACU3M,WACR,EAAK4M,WAAaD,EAAYC,WAC1B,EAAKA,WAAa,IACpB,EAAKC,MAAQ,GACbF,EAAYG,QAAQnL,KAAI,SAAAoL,GAAI,OAAI,EAAKF,MAAM/K,KAAK,IAAIoJ,EAAgB6B,SANzC,EARnC,O,EAAA,G,EAAA,G,6EAAA,GAAiDjN,K,wHCH1C,IAAMkN,EA2HX,SAAYC,GACVjV,KAAKgC,GAAKiT,EAAMjT,GAChBhC,KAAKkV,YAAcD,EAAMC,YACzBlV,KAAKmV,mBAAqBF,EAAME,mBAChCnV,KAAK9B,KAAO+W,EAAM/W,KAClB8B,KAAKoV,YAAcH,EAAMG,YACzBpV,KAAKqV,QAAUJ,EAAMI,QACrBrV,KAAK4B,KAAOqT,EAAMrT,KAClB5B,KAAKsV,UAAYL,EAAMM,UACvBvV,KAAKwV,gBAAkBP,EAAMO,gBAC7BxV,KAAKiC,SAAWgT,EAAMhT,SACtBjC,KAAKoC,OAAS6S,EAAMQ,aACpBzV,KAAKmC,OAAS8S,EAAM9S,OACpBnC,KAAKkC,UAAY+S,EAAM/S,UACvBlC,KAAK0V,KAAOT,EAAMS,M,EAzITV,E,YACyD,CAClEW,UAAW,CAAC/W,OAAQ,GACpBgX,eAAgB,CAAChX,MAAO,+BACxBiX,WAAY,CAACjX,MAAO,GACpBkX,IAAK,CAAClX,MAAO,GACbmX,SAAU,CAACnX,MAAO,GAClBoX,KAAM,CAACpX,MAAO,GACdqX,YAAa,CAACrX,MAAO,GACrBsX,aAAc,CAACtX,MAAO,GACtBuX,SAAU,CAACvX,MAAO,M,EAVToW,E,YAagD,CACzDoB,MAAO,CAACxX,MAAO,GACf4D,MAAO,CAAC5D,MAAO,GACf6D,MAAO,CAAC7D,MAAO,GACfyX,kBAAmB,CAACzX,MAAO,KAC3B0X,0BAA2B,CAAC1X,MAAO,KACnC2X,uBAAwB,CAAC3X,MAAO,KAChC4X,uBAAwB,CAAC5X,MAAO,O,EApBvBoW,E,cAuB+C,CACxDyB,iBAAkB,EAClBC,kBAAmB,EACnBC,aAAc,wBACdC,OAAQ,EACRC,SAAU,qBACVC,WAAY,EACZlF,MAAO,EACPC,QAAS,EACTkF,QAAS,EACTC,SAAU,EACVC,QAAS,EACTC,WAAY,I,EAnCHlC,E,wBAsCgD,CACzDmC,mBAAoB,EACpBC,SAAU,EACVC,SAAU,EACVC,mBAAoB,EACpBN,SAAU,EACVO,cAAe,I,IC/BEC,E,kCAQZC,MAAP,SAAaC,GACX,IAAMC,EAASpI,EAAiB/Q,MAC1BoZ,EAA2BD,EAAOzU,WAAW2U,OAAO,EAAGF,EAAOzU,WAAW4U,YAAY,MACpFvK,EAA4EmK,EAA5EnK,UAAW8E,EAAiEqF,EAAjErF,QAAStH,EAAwD2M,EAAxD3M,GAAI4C,EAAoD+J,EAApD/J,SAAU0B,EAA0CqI,EAA1CrI,OAAQW,EAAkC0H,EAAlC1H,SAAU+H,EAAwBL,EAAxBK,UAAWnI,EAAa8H,EAAb9H,UAItE,IAAKgI,GAAoBI,MAAMC,OAAOC,SAAS3K,MAAgB8E,IAAYhD,IAAWW,EACpF,MAAO,GAGT,IAAImI,EAAUP,EAwBd,OAvBKA,EAAiBQ,SAAS,OAC7BD,GAAW,KAEbA,GAAW,KAAO5K,EAAY,OAASA,EAA5B,2BAA0E8E,EAAU,aAAerC,EAAW,WAAaX,EAElIO,EACFuI,GAAW,cAAgBvI,EAClBjC,IACTwK,GAAW,aAAexK,GAGjB,KAAP5C,IACFoN,GAAW,OAASpN,GAGJ,KAAdgN,IACFI,GAAW,MAAQJ,GAGjBpK,GAA0B,KAAdiC,IACduI,GAAW,aAAexK,GAGrBwK,G,KCxDUE,E,kCAOZC,UAAP,SAAiBxE,GACf,IAAIyE,EAAM,GACV,GAAqB,IAAjBzE,EAAI0E,UACN,GAAI1E,EAAI2E,WAAWlO,OAAS,EAAG,CAC7BgO,EAAI,eAAiB,GACrB,IAAK,IAAIG,EAAI,EAAGA,EAAI5E,EAAI2E,WAAWlO,OAAQmO,IAAK,CAC9C,IAAIC,EAAY7E,EAAI2E,WAAWG,KAAKF,GACpCH,EAAI,eAAeI,EAAUE,UAAYF,EAAUG,iBAG7B,IAAjBhF,EAAI0E,WACbD,EAAMzE,EAAIgF,WAEZ,GAAIhF,EAAIiF,gBACN,IAAK,IAAIpb,EAAI,EAAGA,EAAImW,EAAIkF,WAAWzO,OAAQ5M,IAAK,CAC9C,IAAIib,EAAO9E,EAAIkF,WAAWJ,KAAKjb,GAC3Bkb,EAAWD,EAAKC,SACpB,QAA6B,IAAlBN,EAAIM,GACbN,EAAIM,GAAY7Y,KAAKsY,UAAUM,OAC1B,CACL,QAAkC,IAAvBL,EAAIM,GAAU/O,KAAsB,CAC7C,IAAImP,EAAMV,EAAIM,GACdN,EAAIM,GAAY,GAChBN,EAAIM,GAAU/O,KAAKmP,GAErBV,EAAIM,GAAU/O,KAAK9J,KAAKsY,UAAUM,KAIxC,OAAOL,G,yCCjCUW,EA6BnB,WACElZ,KAAK8O,MAAQ,I,gBC9BXqK,EAAkC,CACtCC,IAAK,IACLC,KAAM,IACNC,OAAQ,IACRC,IAAK,KAGDC,EAAiD,CACrD,EAAK,MACL,EAAK,OAGDC,E,kCACGC,aAAP,SAAoBC,EAAyB5O,GAC3C,OAAO4O,EAAShQ,KAAI,SAAAiQ,GAClB,IAAIjW,EAAMiW,EAAQjW,IACd/B,EAAO4X,EAAmBI,EAAQvK,QAMtC,MALI,CAAC8J,EAAmBE,KAAMF,EAAmBI,KAAKM,SAASD,EAAQvK,UACrE1L,EAAMiW,EAAQE,UACdlY,EAAO4X,EAAmBL,EAAmBG,SAE/C3V,EAAMoW,EAAWpW,EAAKoH,GACf,CACLiP,UAAWJ,EAAQK,UACnBrY,KAAMA,EACN6P,SAAUmI,EAAQM,aAClB7P,MAAOuP,EAAQvP,MACf1G,IAAKA,O,SCPPwW,E,kCAcGC,cAAP,SAAqBrP,EAAYwC,EAAmBI,EAAmB0M,GACrE,IAAMC,EAAa,IAAI/Y,IACjB0T,EAAQoF,EAAmBpF,MAC3BsF,EAAkBF,EAAmBG,sBACrCC,EAAeJ,EAAmBK,mBAClCC,EAAiBJ,EAAgB7Y,QAOvC,OALA4Y,EAAW5Y,QAAUyY,EAAkBS,kBAAkBD,EAAgB5P,EAAIwC,EAAWI,EAAUsH,EAAOsF,GACrGhL,EAAiB/Q,MAAM8Q,gBAAkBiL,EAAgBxa,KAAK8a,mBAChEP,EAAW5Y,QAAQiY,SAAWF,EAAwBC,aAAaa,EAAgBxa,KAAK8a,iBAAkB9P,IAE5GoP,EAAkBW,cAAcR,EAAYrF,EAAOwF,GAC5CH,G,EAYFP,WAAP,SAAkBpW,EAAaoH,GAC7B,IAKIgQ,EACJ,OAAIhQ,GAEAgQ,GAL0C,IAIxBpX,EANUiC,MAAM,KAAK,GACGoV,QAAQ,WAAY,IACtChV,QAAQ,MAKA,IAAtBrC,EAAIqC,QAAQ,KAAc,OAAS,OAEnC,OAELrC,EAAMoX,EAAUhQ,GAElBpH,G,EAWFsX,YAAP,SAAmBC,GACjB,IAAMC,EAAW,IAAIjC,EACfkC,EAAeF,EAAiBE,aAChCC,EAAgBH,EAAiBG,cAAcC,QAUrD,OATAH,EAASnZ,GAAKoZ,EAAapZ,GAC3BmZ,EAASjd,KAAOkd,EAAald,KAC7Bid,EAAS/F,YAAcgG,EAAahG,YACpC+F,EAAS/Y,OAASgZ,EAAahZ,OAC/BiZ,EAAc9V,SAAQ,SAAC0P,GACrB,IAAMqF,EAAa,IAAI/Y,IACvB4Y,EAAkBW,cAAcR,EAAYrF,GAC5CkG,EAASrM,MAAMhF,KAAKwQ,MAEfa,G,EAWFI,aAAP,SAAoBL,GAClB,IAAMM,EAAY,IAAI3M,IAOtB,OANsBqM,EAAiBG,cAAcC,QACvC/V,SAAQ,SAAA0P,GACpB,IAAMqF,EAAa,IAAI/Y,IACvB4Y,EAAkBW,cAAcR,EAAYrF,GAC5CuG,EAAU1M,MAAMhF,KAAKwQ,MAEhBkB,G,EAaFC,UAAP,SAAiBC,EAAoB3Q,EAAYwC,GAC/C,IAAMgN,EAAkBmB,EAAclB,sBAChC9H,EAA4B6H,EAAgB7H,WAAW,GAC7D,GAAIA,EAAY,CACd,IACMiJ,GADgBjJ,GAAcA,EAAWhR,SACPqR,MAAK,SAAAJ,GAAM,OAAI/J,YAAoB+J,EAAOtD,WAClF,GAAIsM,EAAmB,CACrB,IAAMC,EAAgBzB,EAAkB0B,yBAAyBF,EAAmBpB,EAAiBxP,EAAIwC,EAAW,EAAGmF,EAAWL,SAClI,GAAIuJ,EAAc,GAChB,OAAO,IAAI7M,IAAO,CAACpL,IAAKiY,EAAc,GAAGjY,IAAKqL,gBAAiB0D,EAAW1D,qB,EAM3E8L,cAAP,SAAqBR,EAAwBrF,EAA0BwF,GAerE,OAdAH,EAAWlY,OAAS6S,EAAM7S,OAC1BkY,EAAWtY,GAAKiT,EAAMjT,GACtBsY,EAAWrY,SAAWgT,EAAMhT,SAC5BqY,EAAW9Y,SAAW2Y,EAAkB2B,eAAerB,GACvDH,EAAW9Y,SAAS4T,YAAcH,EAAMG,aAAe,GACvDkF,EAAW9Y,SAAStD,KAAO+W,EAAM/W,MAAQ,GACzCoc,EAAW9Y,SAASkU,KAAOT,EAAMS,MAAQ,GACzC4E,EAAWnY,OAAS8S,EAAM9S,OAE1BmY,EAAW1Y,KAAOuY,EAAkB4B,cAAc9G,EAAMK,UAAWL,EAAMrT,MACrE0Y,EAAW1Y,OAASL,IAAWM,KAAKU,OACtC+X,EAAWpY,UAAY+S,EAAM/S,WAGxBoY,G,EAGFyB,cAAP,SAAqBC,EAAuBC,GAC1C,IAAIra,EAAOL,IAAWM,KAAKC,QAC3B,OAAQka,GACN,KAAKhH,EAAkBkH,UAAU1Z,MAAM5D,MACrCgD,EAAOL,IAAWM,KAAKW,MACvB,MACF,KAAKwS,EAAkBkH,UAAUzZ,MAAM7D,MACrCgD,EAAOL,IAAWM,KAAKY,MACvB,MACF,QACE,OAAQwZ,GACN,KAAKjH,EAAkBmH,UAAUtG,WAAWjX,MAC1CgD,EAAOL,IAAWM,KAAKS,IACvB,MACF,KAAK0S,EAAkBmH,UAAUlG,YAAYrX,MAC7C,KAAKoW,EAAkBmH,UAAUjG,aAAatX,MAC5CgD,EAAOL,IAAWM,KAAKU,KACvB,MACF,QACEX,EAAOL,IAAWM,KAAKC,SAG/B,OAAOF,G,EAgBFgZ,kBAAP,SACED,EACA5P,EACAwC,EACAI,EACAsH,EACAsF,GAEA,IAYQ6B,EAQAC,EApBF3a,EAAU,IAAIC,IACd2a,EAAoB,SAAC1S,GACzB,IAAM2S,EAAepC,EAAkBqC,qBAAqB5S,EAAQ2Q,EAAiBxP,EAAIwC,EAAWI,EAAUsH,EAAMjT,IACpH,GAAIua,EAAc,CAChB,IAAMzT,EAAeH,IAAsBnK,IAAIoL,EAAOyF,QACtD3N,EAAQiI,IAAI4S,EAAczT,KA4B9B,OANImM,EAAMrT,OAASoT,EAAkBmH,UAAUvG,eAAehX,QAPtDyd,EAAc,IAAIrS,KACZC,SAAW,gBACvBoS,EAAY1Y,IAAMsR,EAAMC,YACxBmH,EAAYra,GAAKiT,EAAMjT,GAAK,WAC5BN,EAAQ8H,YAAYM,KAAKuS,IAKhB1B,GAAkBA,EAAepQ,OAAS,IApBnDoQ,EAAe9U,QAAO,SAAA+D,GAAM,OAAKhB,YAAoBgB,EAAOyF,WAAS9J,QAAQ+W,GAGvEF,EAAoBzB,EAAe5H,MAAK,SAAAnJ,GAE5C,OAAOhB,YAAoBgB,EAAOyF,SAAwE,KAA7DzF,EAAOmG,YAAYoK,EAAkBsC,uBAEpF/a,EAAQ8H,YAAc2Q,EAAkB0B,yBAAyBO,EAAmB7B,EAAiBxP,EAAIwC,EAAWI,EAAUsH,EAAMjT,KAiB/HN,G,EAgBF8a,qBAAP,SACEE,EACAnC,EACAxP,EACAwC,EACAI,EACA0E,GAEA,IAAMgK,EAA2B,IAAIrS,IACrC,GAAI0S,EAAe,CACjB,IAAIvE,EAAkB,GAChBtO,EAAclB,IAAsBnK,IAAIke,EAAcrN,QACtDW,EAAW0M,EAAc3M,YAAYoK,EAAkBsC,oBACvD/M,EAAoBgN,EAAchN,kBAClCL,EAASqN,EAAcrN,OACzB0I,EAAoB,GAuBxB,GAtBIlO,IACFkO,EAAYlO,EAAYvB,QACxB+T,EAAYpS,SAAWJ,EAAYxB,UAGjCqU,EAAc5M,iBACXiI,GAAawC,EAAgB/H,cAAgB+H,EAAgB/H,aAAajI,OAAS,IACtFwN,EAAYwC,EAAgB/H,aAAa,GAAGtB,SAE9CiH,EAAUX,EAAqBC,MAAM,CACnCpF,UACAzC,UAAW8M,EAAc9M,UACzBP,SACAtE,KACAwC,YACAI,WACAoK,YACA/H,cAGFmI,EAAUgC,EAAkBJ,WAAW2C,EAAc/Y,IAAKoH,IAEvDoN,EAAS,CACZ,IAAMjQ,EAAU,8DAA8DmK,EAAjE,IAA4E3C,EAA5E,MAAmGL,EAEhH,OADA8K,EAAkBla,QAAQsH,KAAKW,GACxB,KAIT,GAFAmU,EAAY1Y,IAAMwW,EAAkBwC,kBAAkBpC,EAAiBpC,GACvEkE,EAAYra,GAAKqQ,EAAU,IAAM3C,EAAoB,IAAML,EACvDqN,EAAc7M,aAAc,CAC9B,IAAM+M,EAAwB,GAC9BF,EAAc1T,IAAIzD,SAAQ,SAAAyD,GACxB4T,EAAU9S,KAAK,IAAImD,IAAIjE,EAAIE,WAAYH,IAA6B8T,OAAO7T,EAAIC,QAASD,EAAIG,iBAE9FkT,EAAY/R,QAAUsS,GAG1B,OAAOP,G,EAgBFR,yBAAP,SACEa,EACAnC,EACAxP,EACAwC,EACAI,EACA0E,GAEA,IAAMyK,EAAmC,GACnCC,EAAmC,GACzC,GAAIL,EAAe,CACjB,IAAM1M,EAAW0M,EAAc3M,YAAYoK,EAAkBsC,oBACvDpN,EAASqN,EAAcrN,OACvBK,EAAoBgN,EAAchN,kBAClCsN,EAAWtN,EAAoB,IAAML,EAC3CkL,EAAgB/H,aAAa7I,KAAI,SAAA8I,GAC/B,IAAM4J,EAA2B,IAAIrS,IACrCqS,EAAYra,GAAKyQ,EAAOzQ,GAAKgb,EAC7BX,EAAYpS,SAA8B,QAAnBwI,EAAOvB,QAAoB,YAAc,YAChEmL,EAAYjS,OAASqI,EAAOrI,OAC5BiS,EAAYlS,MAAQsI,EAAOtI,MAC3BkS,EAAYnS,UAA6B,KAAjBuI,EAAOtB,QAC/BkL,EAAYhS,MAAQoI,EAAOpI,OAASoI,EAAOhB,SAC3C,IAAM0G,EAAUX,EAAqBC,MAAM,CACzCpF,UACAzC,UAAW6C,EAAOzQ,GAClBqN,SACAtE,KACAwC,UAAWA,EACXI,SAAUA,EACVoK,UAAWtF,EAAOvB,QAClBlB,aAEF,GAAgB,KAAZmI,EAEF,OADAgC,EAAkBla,QAAQsH,KAA1B,8DAA6F8K,EAA7F,IAAwG3C,EAAxG,MAA+HL,EAA/H,KACO,KAEPgN,EAAY1Y,IAAMwW,EAAkBwC,kBAAkBpC,EAAiBpC,GACnE1F,EAAOrI,QAAUqI,EAAOtI,MAC1B2S,EAAahT,KAAKuS,GAElBU,EAAajT,KAAKuS,MAM1B,OAAOU,EAAaxS,SAAWuS,EAAavS,OAASwS,EAAeD,G,EAW/DhB,eAAP,SAAsBrB,GACpB,IAAMjZ,EAAW,GAkBjB,OAjBIiZ,GAAgBA,EAAa5F,OAAS4F,EAAa5F,MAAMtK,OAAS,GACpEkQ,EAAa5F,MAAMtP,SAAQ,SAAAwP,GACzB,GAAIA,EAAKjB,IAAK,CACZ,IAAImJ,EACEC,EAAuB,IAAIC,UACjCpI,EAAKjB,IAAMiB,EAAKjB,IAAIkH,QAAQ,YAAa,IACzCjG,EAAKjB,IAAMiB,EAAKjB,IAAIkH,QAAQ,QAAS,KACrCjG,EAAKjB,IAAMiB,EAAKjB,IAAIkH,QAAQ,QAAS,KACrCiC,EAAUC,EAAUE,gBAAgBrI,EAAKjB,IAAK,YAC9C,IAAMuJ,EAAmBhF,EAAUC,UAAU2E,GAC5B5e,OAAOuQ,KAAKyO,EAAS7b,UAC7B+D,SAAQ,SAAArG,GACfsC,EAAStC,GAAOme,EAAS7b,SAAStC,GAAK,gBAKxCsC,G,EAUFib,iBAAP,WACE,IAAM9E,EAASpI,EAAiB/Q,MAE1BsO,EADgB,WACOwQ,KAAK3F,EAAOzI,QACnCc,EAAWlD,EAASA,EAAO,GAAKyQ,SAASC,SAASxN,SACxD,MAAwB,iBAAbA,EACFA,EAAS1D,MAAM,GAAI,GAErB,S,EAGFsG,eAAP,SAAsBxO,GACpB,OAAOA,EAASoW,sBAAsB5H,kB,EAGjCE,eAAP,SAAsB1O,GACpB,OAAOA,EAASoW,sBAAsB1H,kB,EAGjCE,iBAAP,SAAwB5O,GACtB,OAAOA,EAASoW,sBAAsBxH,oB,EAYjC2J,kBAAP,SAAyBpC,EAAyCpC,GAChE,IAAMsF,EAAclD,EAAgBtH,4BACpC,GAAIwK,EAAa,CACf,IAAMC,EAAQ,IAAIC,OAAOF,EAAY5M,QAAS,KAC9C,GAAIsH,EAAQyF,MAAMF,GAChB,OAAOvF,EAAQ6C,QAAQ0C,EAAOD,EAAY3M,YAAc,KAG5D,OAAOqH,G,oHAjbLgC,E,UACa7Y,YAAU,sBAobtB,IAAMyY,EAAaI,EAAkBJ,WAC7BI,I,eCxcM0D,E,kCAUZC,gBAAP,SAAuBzQ,EAAuBtC,EAAYwC,GACxD,IAAMoK,EAASpI,EAAiB/Q,MAC1Buf,EAAYpG,EAAOxI,cACzB9Q,OAAO6H,OAAO6X,EAAW,CAAChT,GAAIA,EAAIiT,UAAW,UAAY3Q,IACrDE,GACFlP,OAAO6H,OAAO6X,EAAW,CAACxQ,UAAWA,IAEvC,IAAM1K,EAA+B,IAAIpB,IACzCoB,EAAQsI,IAAI,eAAgB,oBAC5B,IAAM8S,EAAW,IAAI1R,IAAoB1J,GAKzC,OAJAob,EAASpZ,OAAS,OAClBoZ,EAAS9a,QAvBgB,eAwBzB8a,EAASta,IAAMsa,EAAShb,OAAO0U,EAAOzU,YACtC+a,EAASvY,OAASqY,EACXE,G,KC7BX,IAMaC,EAiBX,WAAYC,QAA8B,IAA9BA,MAA0B,IACpCne,KAAK4B,KAAOuc,EAAgBvc,MAAQsc,EAAyBrc,KAAKuc,eAClEpe,KAAKqe,OAASF,EAAgBE,QAxBhC,qJ,8GAKWH,E,OAJiB,CAC5BE,eAAgB,EAChBE,eAAgB,ICAlB,IAEqBC,E,sKAUZC,mBAAP,SAA0Btb,EAAoB6H,EAAY0T,GACxD,IAAM5b,EAA+B,IAAIpB,IACzCoB,EAAQsI,IAAI,eAAgB,oBAC5B,IAAMnH,EAAU,IAAIpB,IAAeC,GACnCmB,EAAQb,QAhBiB,YAiBzBa,EAAQZ,OAAS,qBACjBY,EAAQa,OAAS,OACjBb,EAAQL,IAAMK,EAAQf,OAAOC,GAC7Bc,EAAQ0a,IAAM,+BAGd,OADA1a,EAAQ0B,OAAS,CAAC2M,QAASoM,EAAgB1T,GAAIA,EAAI4T,kBADzB,CAAC5W,WAAY,2BAA4B6W,WAAY,QAExE5a,G,EAcF6a,KAAP,SAAY3b,EAAoB6H,EAAYsH,EAAiByM,EAA8B5J,GACzF,IAAMrS,EAA+B,IAAIpB,IACzCoB,EAAQsI,IAAI,eAAgB,oBAC5B,IAAMnH,EAAU,IAAIpB,IAAeC,GAOnC,OANAmB,EAAQb,QAzCiB,YA0CzBa,EAAQZ,OAAS,OACjBY,EAAQa,OAAS,OACjBb,EAAQL,IAAMK,EAAQf,OAAOC,GAC7Bc,EAAQ0a,IAAM,OACd1a,EAAQ0B,OAAS6Y,EAAoBQ,sBAAsB1M,EAAStH,EAAI+T,EAAqB5J,GACtFlR,G,EAaF+a,sBAAP,SAA6B1M,EAAiBtH,EAAY+T,EAA8B5J,GACtF,IAAI8J,EAAe,GAOnB,OANI3M,EACF2M,EAAeF,EAAsB,CAACA,oBAAqBzM,GAAW,CAAC4M,QAAS5M,GACvE6C,IACT8J,EAAe,CAACjX,WAAY,yBAA0BmX,iBAAkBhK,IAGnE,CAACnK,GAAIA,EAAIlF,OAAQmZ,EAAcb,gBAAiB,IAAID,I,GAlEdL,GCHjD,IAEqBsB,E,sKAUZN,KAAP,SAAY3b,EAAoB6H,EAAYsH,GAC1C,IAAMxP,EAA+B,IAAIpB,IACzCoB,EAAQsI,IAAI,eAAgB,oBAC5B,IAAMnH,EAAU,IAAIpB,IAAeC,GACnCmB,EAAQb,QAhBiB,oBAiBzBa,EAAQZ,OAAS,OACjBY,EAAQa,OAAS,OACjBb,EAAQL,IAAMK,EAAQf,OAAOC,GAC7Bc,EAAQ0a,IAAM,yBACd,IAAM7Y,EAAS,CAACkC,WAAY,wBAAyBqX,cAAe/M,EAASgN,wBAAyB,KAEtG,OADArb,EAAQ0B,OAAS,CAACG,OAAQA,EAAQkF,GAAIA,GAC/B/G,G,GArBqC6Z,GCFzC,IAAMyB,EAAb,Y,QAgBE,WAAY3K,GAAqB,aAC/B,cAAMA,IAAN,MACU3M,WACR,EAAK4M,WAAaD,EAAYC,WAC1B,EAAKA,WAAa,IACpB,EAAK0G,QAAU,GACf3G,EAAYG,QAAQnL,KAAI,SAAAsL,GAAK,OAAI,EAAKqG,QAAQxR,KAAK,IAAIkL,EAAkBC,SAN9C,EAhBnC,O,EAAA,G,EAAA,G,6EAAA,GAAkDnN,K,mOCa7ByX,E,WAenB,WAAY7Z,I,6GAAgB,kBAXX,IAYf1F,KAAKsL,SAAWtL,KAAKwf,cAAc9Z,GACnC1F,KAAKyf,SAAW/Z,EAAO2M,QACvBrS,KAAK0f,aAAeha,EAAOwP,Y,mCAX3B,MAAO,Y,2BAwCTsK,cAAA,SAAc9Z,GACZ,IAAMiS,EAASpI,EAAiB/Q,MAC1B8M,EAAkC,GACxCA,EAASxB,KAAKyU,EAAoBM,KAAKlH,EAAOzU,WAAYwC,EAAOqF,GAAIrF,EAAO2M,QAAS3M,EAAOoZ,oBAAqBpZ,EAAOwP,cAExH,IAAMuJ,EAA+B,kBAAd/Y,EAAOqF,GAAyB,0BAA4B,0BAGnF,OAFAO,EAASxB,KAAKyU,EAAoBC,mBAAmB7G,EAAOzU,WAAYwC,EAAOqF,GAAI0T,IACnFnT,EAASxB,KAAKqV,EAAmBN,KAAKlH,EAAOzU,WAAYwC,EAAOqF,GAAI0T,IAC7DnT,G,EAQTL,QAAA,WACE,SAAUjL,KAAKyf,WAAYzf,KAAK0f,e,kCA3CrBpU,GACXtL,KAAK2f,UAAYrU,G,eAIjB,OAAOtL,KAAK2f,Y,6BAGDvb,GACX,IAAIiW,EAAmD,IAAIiF,EAA6Blb,EAAS,GAAGrE,MACpGC,KAAK4f,UAAU3K,MAAQoF,EAAmBiB,QAAQ,GAClDtb,KAAK4f,UAAUpF,sBAAwB,IAAIlI,EAAuBlO,EAAS,GAAGrE,MAC9EC,KAAK4f,UAAUlF,mBAAqB,IAAIhG,EAA4BtQ,EAAS,GAAGrE,O,eAIhF,OAAOC,KAAK4f,c,KClDhB,IAEqBC,E,sKASZC,iBAAP,SAAwB5c,EAAoBuK,GAC1C,IAAM5K,EAA+B,IAAIpB,IACzCoB,EAAQsI,IAAI,eAAgB,oBAC5B,IAAMnH,EAAU,IAAIpB,IAAeC,GAOnC,OANAmB,EAAQb,QAfiB,UAgBzBa,EAAQZ,OAAS,qBACjBY,EAAQa,OAAS,OACjBb,EAAQL,IAAMK,EAAQf,OAAOC,GAC7Bc,EAAQ0a,IAAM,sBACd1a,EAAQ0B,OAAS,CAAC+H,YACXzJ,G,GAnBoC6Z,G,2KCD1BkC,G,qBA6BnB,WAAYra,I,6GAAgB,kBA1BX,IA2Bf1F,KAAKsL,SAAWtL,KAAKwf,cAAc9Z,GACnC1F,KAAKwN,UAAY9H,EAAO+H,S,gCAzBxB,MAAO,c,gCAGInC,GACXtL,KAAK2f,UAAYrU,G,eAIjB,OAAOtL,KAAK2f,Y,6BAGDvb,GACXpE,KAAK4f,UAAU7U,GAAK3G,EAAS,GAAGrE,KAAKgL,I,eAIrC,OAAO/K,KAAK4f,UAAU7U,Q,wDAmBxByU,cAAA,SAAc9Z,GACZ,IAAMiS,EAASpI,EAAiB/Q,MAC1B8M,EAAkC,GAExC,OADAA,EAASxB,KAAK+V,EAAkBC,iBAAiBnI,EAAOzU,WAAYwC,EAAO+H,WACpEnC,G,EAQTL,QAAA,WACE,QAASjL,KAAKwN,W,SChDGwS,G,oBACnB,WAAY3S,EAAuBE,EAAmBxC,EAAiBJ,GAAoD,sBAArEI,MAAa,KACjE,cAAMJ,IAAN,MACKU,cAAgBwS,EAAWC,gBAAgBzQ,EAAetC,EAAIwC,GAFsD,E,uGAD3E7C,GCNlD,IAEqBuV,G,sKAUZnU,QAAP,SAAe5I,EAAoB6H,EAAYmV,GAC7C,IAAMrd,EAA+B,IAAIpB,IACzCoB,EAAQsI,IAAI,eAAgB,oBAC5B,IAAMnH,EAAU,IAAIpB,IAAeC,GAWnC,OAVAmB,EAAQb,QAhBiB,WAiBzBa,EAAQZ,OAAS,UACjBY,EAAQa,OAAS,OACjBb,EAAQL,IAAMK,EAAQf,OAAOC,GAC7Bc,EAAQ0a,IAASyB,mBACjBnc,EAAQ0B,OAAS,CACfqF,GAAIA,EACJ/I,GAAIke,EACJ/B,gBAAiB,IAAID,GAEhBla,G,EAYFxF,IAAP,SAAW0E,EAAoB6H,EAAYmV,GACzC,IAAMrd,EAA+B,IAAIpB,IACzCoB,EAAQsI,IAAI,eAAgB,oBAC5B,IAAMnH,EAAU,IAAIpB,IAAeC,GAcnC,OAbAmB,EAAQb,QA1CiB,WA2CzBa,EAAQZ,OAAS,MACjBY,EAAQa,OAAS,OACjBb,EAAQL,IAAMK,EAAQf,OAAOC,GAC7Bc,EAAQ0a,IAASyB,eACjBnc,EAAQ0B,OAAS,CACfqF,GAAIA,EACJ/I,GAAIke,EACJ/B,gBAAiB,CACfE,OAAQ,mCACRzc,KAAM,IAGHoC,G,GArDqC6Z,GCLnCuC,GA0BX,SAAYjF,GACVnb,KAAKgC,GAAKmZ,EAASnZ,GACnBhC,KAAK9B,KAAOid,EAASjd,KACrB8B,KAAKoV,YAAc+F,EAAS/F,YAC5BpV,KAAKoC,OAAS+Y,EAAS1F,cC5BpB,IAAM4K,GAAb,Y,QAWE,WAAY1L,GAAqB,aAC/B,cAAMA,IAAN,MACU3M,WACR,EAAKsT,QAAU,GACf3G,EAAYhL,KAAI,SAAAsL,GAAK,OAAI,EAAKqG,QAAQxR,KAAK,IAAIkL,EAAkBC,QAJpC,EAXnC,O,EAAA,G,EAAA,G,6EAAA,GAAyCnN,K,uOCGpBwY,G,WAanB,WAAY5a,I,6GAAgB,kBAVX,IAWf1F,KAAKsL,SAAWtL,KAAKwf,cAAc9Z,GACnC1F,KAAKugB,YAAc7a,EAAOwa,W,oCAT1B,MAAO,e,2BAoCTV,cAAA,SAAc9Z,GACZ,IAAMiS,EAASpI,EAAiB/Q,MAC1B8M,EAAkC,GAGxC,OAFAA,EAASxB,KAAKmW,GAAmBzhB,IAAImZ,EAAOzU,WAAYwC,EAAOqF,GAAIrF,EAAOwa,aAC1E5U,EAASxB,KAAKmW,GAAmBnU,QAAQ6L,EAAOzU,WAAYwC,EAAOqF,GAAIrF,EAAOwa,aACvE5U,G,EAQTL,QAAA,WACE,QAASjL,KAAKugB,a,mCAtCHjV,GACXtL,KAAK2f,UAAYrU,G,eAIjB,OAAOtL,KAAK2f,Y,6BAGDvb,GACXpE,KAAK4f,UAAUxE,aAAe,IAAIgF,GAAgBhc,EAAS,GAAGrE,MAC9DC,KAAK4f,UAAUvE,cAAgB,IAAIgF,GAAoBjc,EAAS,GAAGrE,O,eAInE,OAAOC,KAAK4f,c,qPCjCKY,G,WAanB,WAAY9a,I,6GAAgB,kBAVX,CAAC2V,cAAe,CAACC,QAAS,MAWzCtb,KAAKsL,SAAWtL,KAAKwf,cAAc9Z,GACnC1F,KAAKygB,SAAW/a,EAAO4V,Q,oCATvB,MAAO,iB,2BAuCTkE,cAAA,SAAc9Z,GACZ,IAAMiS,EAASpI,EAAiB/Q,MAC1B8M,EAAkC,GAIxC,OAHA5F,EAAO4V,QAAQ/V,SAAQ,SAAA0P,GACrB3J,EAASxB,KAAKyU,EAAoBM,KAAKlH,EAAOzU,WAAYwC,EAAOqF,GAAIkK,EAAM5C,SAAW4C,EAAOvP,EAAOoZ,oBAAqB7J,EAAMC,iBAE1H5J,G,EAQTL,QAAA,WACE,SAAUjL,KAAKygB,WAAYzgB,KAAKygB,SAASlW,S,mCA1C9Be,GACXtL,KAAK2f,UAAYrU,G,eAIjB,OAAOtL,KAAK2f,Y,6BAGDvb,GAAe,IACtBiW,EADsB,OAE1BjW,EAASmB,SAAQ,SAAAqT,GACfyB,EAAqB,IAAIiF,EAA6B1G,EAAK7Y,MAC3D,EAAK6f,UAAUvE,cAAcC,QAAQxR,KAAKuQ,EAAmBiB,QAAQ,Q,eAKvE,OAAOtb,KAAK4f,c,wLC3BKc,G,oBAOnB,WAAYtT,EAAgCC,GAAuB,a,6GAAA,C,yHAAA,CACjE,cAAMD,EAASC,IAAf,MADiE,uBANf,CAACyR,qBAAqB,IAQxE,EAAK7e,QAAUqB,YAAU,eACzBiO,EAAiBpE,IAAIiC,EAAQuT,KAC7B,EAAKC,wBAAwBxT,EAAQyT,eACrC,EAAKjW,oBAAsBvM,OAAO6H,OAAO,EAAK0E,oBAAqBwC,EAAQ0T,wBALV,E,wHAiBnE9S,eAAA,SAAeC,GAA2E,WASxF,OARIA,EAAUlD,KACZ/K,KAAK+K,GAAKkD,EAAUlD,GACpB/K,KAAK4N,cAAe,GAElB5N,KAAKyN,WAAazN,KAAK+N,kBACzB/N,KAAK4N,cAAe,GAEtB5N,KAAK+gB,YAAc,IAAIf,GAAqBhgB,KAAKqN,cAAerN,KAAKuN,UAAWvN,KAAK+K,GAAI/K,KAAK4K,qBACvF,IAAIrH,SAAQ,SAACC,EAASC,GAC3B,IAAM4O,EAAUpE,EAAUoE,QACpB6C,EAAcjH,EAAUiH,YAC9B,GAAI7C,GAAW6C,EAAa,CAC1B,IAAInK,EAAa,EAAKA,GACjBA,IACHA,EAAK,gBACL,EAAKgW,YAAYlW,IAAIkV,GAAkB,CAACtS,SAAU,EAAKA,YAEzD,IAAMqR,EAAsB,EAAKkC,wBAAwB/S,GAEzD,OADA,EAAK8S,YAAYlW,IAAI0U,EAAqB,CAAClN,UAAStH,KAAI+T,sBAAqB5J,gBACtE,EAAK6L,YAAYnV,YAAYG,MAClC,SAAA3H,GACE,IACEZ,EAAQ,EAAKyd,uBAAuB7c,IACpC,MAAO+H,GACP1I,EAAO0I,OAGX,SAAAA,GACE1I,EAAO0I,MAIX1I,EAAO,IAAI9D,KAAMA,KAAMiE,SAASxD,SAAUT,KAAMkE,SAAStD,SAAUZ,KAAMmE,KAAK3C,yBAA0B,CAAC+G,QAAS,0B,EAKxHgZ,UAAA,SAAUC,EAA+BpW,GAA2B,WAC9DqW,EAAgBrW,GAAM/K,KAAK+K,GACzBsW,EAAa,IAAIrB,GAAqBhgB,KAAKqN,cAAerN,KAAKuN,UAAW6T,EAAOphB,KAAK4K,qBAE5F,OAAO,IAAIrH,SAAQ,SAACC,EAASC,GAO3B,OANK2d,GACHC,EAAWxW,IAAIkV,GAAkB,CAACtS,SAAU,EAAKA,WAEnD0T,EAAQ5b,SAAQ,SAAC+b,GACfD,EAAWxW,IAAIyW,EAAcxW,OAAQwW,EAAc5b,OAAQ0b,GAAS,oBAE/DC,EAAWzV,YAAYG,MAC5B,SAAA3H,GACE,IACEZ,EAAQY,GACR,MAAO+H,GACP1I,EAAO0I,OAGX,SAAAA,GACE1I,EAAO0I,U,EAMf6U,wBAAA,SAAwB/S,GACtB,MAAgD,kBAAlCA,EAAU6Q,oBACpB7Q,EAAU6Q,oBAC+C,kBAAlD9e,KAAKuhB,qBAAqBzC,qBACjC9e,KAAKuhB,qBAAqBzC,qB,EAIhC8B,wBAAA,SAAwBxT,GAClBA,GAAiD,kBAA/BA,EAAQ0R,sBAC5B9e,KAAKuhB,qBAAqBzC,oBAAsB1R,EAAQ0R,sB,EAI5DmC,uBAAA,SAAuBlhB,GACrBC,KAAKC,QAAQ2G,MAAM,wBACnB,IAAM4a,EAAyC,CAC7CC,QAAS,CACPC,YAAa1hB,KAAK4N,aAClBL,UAAWvN,KAAKuN,WAElB7L,QAAS1B,KAAK2hB,2BACdC,QAAS,IAOX,GAJI5hB,KAAK2N,WACP6T,EAAYC,QAAQ9T,SAAW3N,KAAK2N,UAGlC5N,EAAM,CACR,GAAIA,EAAK8hB,IAAI9B,GAAiB/d,IAAK,CACjC,IAAM8f,EAAgB/hB,EAAKvB,IAAIuhB,GAAiB/d,IAC5C8f,GAAiBA,EAAc1d,WACjCod,EAAYC,QAAQ1W,GAAK+W,EAAc1d,SACnCpE,KAAKyN,WAAazN,KAAK+N,kBACzB/N,KAAK+K,GAAKyW,EAAYC,QAAQ1W,UAIlCyW,EAAYC,QAAQ1W,GAAK/K,KAAK+K,GAEhC,GAAIhL,EAAK8hB,IAAItC,EAAoBvd,IAAK,CACpC,IAAM+f,EAAchiB,EAAKvB,IAAI+gB,EAAoBvd,IACjD,GAAI+f,GAAeA,EAAY3d,SAAU,CACvC,IAAMA,EAAY2d,EAAkC3d,SACpD,GAAI+V,EAAkBvH,eAAexO,GACnC,MAAM,IAAIzE,KAAMA,KAAMiE,SAASxD,SAAUT,KAAMkE,SAASvD,QAASX,KAAMmE,KAAK7C,aAAc,CACxFmC,OAAQ+W,EAAkBrH,eAAe1O,GACzCoK,SAAU2L,EAAkBnH,iBAAiB5O,KAGjD,IAAMkW,EAAaH,EAAkBC,cAAcpa,KAAK0hB,YAAc,GAAK1hB,KAAK+K,GAAI/K,KAAKuN,UAAWvN,KAAK2N,SAAUvJ,GACnH/F,OAAO6H,OAAOsb,EAAY9f,QAAS1B,KAAKgiB,kBAAkB1H,IAC1Dta,KAAKiiB,mBAAmB3H,GACxBta,KAAKsO,kBAAkBkT,EAAY9f,SACnC,IAAMiR,EAASwH,EAAkBsB,UAAUrX,EAAUpE,KAAK0hB,YAAc,GAAK1hB,KAAK+K,GAAI/K,KAAKuN,WACvFoF,GACFtU,OAAO6H,OAAOsb,EAAYI,QAAS,CAACjP,aAM5C,OADA3S,KAAKC,QAAQ2G,MAAM,wBAAyB4a,GACrCA,G,EAQTS,mBAAA,SAAmB3H,GACjB,GAAI,CAACtF,EAAkBkN,YAAYtL,OAAQ5B,EAAkBkN,YAAYpL,YAAY+C,SAASS,EAAWnY,QACvG,MAAM,IAAIxC,KAAMA,KAAMiE,SAASxD,SAAUT,KAAMkE,SAASvD,QAASX,KAAMmE,KAAK5C,uBAAwB,CAClGsN,SAAU,sBAAsB8L,EAAWtY,GAAnC,OAA4CsY,EAAWnY,OAAvD,4CACRpC,KAAM,CAACoC,kB,EASb+L,kBAAA,SAAkBC,GAA2E,WAS3F,OARIA,EAAapD,KACf/K,KAAK+K,GAAKoD,EAAapD,GACvB/K,KAAK4N,cAAe,GAElB5N,KAAKyN,WAAazN,KAAK+N,kBACzB/N,KAAK4N,cAAe,GAEtB5N,KAAK+gB,YAAc,IAAIf,GAAqBhgB,KAAKqN,cAAerN,KAAKuN,UAAWvN,KAAK+K,GAAI/K,KAAK4K,qBACvF,IAAIrH,SAAQ,SAACC,EAASC,GAC3B,IAAMyc,EAAa/R,EAAa+R,WAChC,GAAIA,EAAY,CACd,IAAInV,EAAa,EAAKA,GACjBA,IACHA,EAAK,gBACL,EAAKgW,YAAYlW,IAAIkV,GAAkB,CAACtS,SAAU,EAAKA,YAEzD,EAAKsT,YAAYlW,IAAIyV,GAAmB,CAACJ,aAAYnV,OACrD,EAAKgW,YAAYnV,YAAYG,MAC3B,SAAA3H,GACEZ,EAAQ,EAAK2e,+BAA+B/d,OAE9C,SAAA+H,GACE1I,EAAO0I,WAIX1I,EAAO,CAACyI,SAAS,EAAOnM,KAAM,oC,EAKpCoiB,+BAAA,SAA+BpiB,GAAqD,WAClFC,KAAKC,QAAQ2G,MAAM,wBACnB,IAAMwb,EAAyCpiB,KAAKqiB,qBACpD,GAAItiB,GAAQA,EAAK8hB,IAAIvB,GAAkBte,IAAK,CAC1C,IAAMsgB,EAAiBviB,EAAKvB,IAAI8hB,GAAkBte,IAClD,GAAIsgB,GAAkBA,EAAele,SAAU,CAC7C,IAAM+W,EAAWhB,EAAkBc,YAAYqH,EAAele,UAC9Dge,EAAepgB,GAAKmZ,EAASnZ,GAC7BogB,EAAehgB,OAAS+Y,EAAS/Y,OACjCggB,EAAe5gB,SAAStD,KAAOid,EAASjd,KACxCkkB,EAAe5gB,SAAS4T,YAAc+F,EAAS/F,YAC/C+F,EAASrM,MAAMvJ,SAAQ,SAAA5H,GAAC,OAAIykB,EAAetT,MAAMhF,KAAK,CAACpI,QAAS,EAAKsgB,kBAAkBrkB,SAI3F,OADAqC,KAAKC,QAAQ2G,MAAM,wBAAyBwb,GACrCA,G,EAQThU,mBAAA,SAAmBC,GAAyE,WAS1F,OARIA,EAActD,KAChB/K,KAAK+K,GAAKsD,EAActD,GACxB/K,KAAK4N,cAAe,GAElB5N,KAAKyN,WAAazN,KAAK+N,kBACzB/N,KAAK4N,cAAe,GAEtB5N,KAAK+gB,YAAc,IAAIf,GAAqBhgB,KAAKqN,cAAerN,KAAKuN,UAAWvN,KAAK+K,GAAI/K,KAAK4K,qBACvF,IAAIrH,SAAQ,SAACC,EAASC,GAC3B,IAAM6X,EAAUjN,EAAciN,QAC9B,GAAIA,GAAWA,EAAQ/Q,OAAQ,CAC7B,IAAIQ,EAAa,EAAKA,GACjBA,IACHA,EAAK,gBACL,EAAKgW,YAAYlW,IAAIkV,GAAkB,CAACtS,SAAU,EAAKA,YAEzD,IAAMqR,EAAsB,EAAKkC,wBAAwB3S,GACzD,EAAK0S,YAAYlW,IAAI2V,GAAoB,CAAClF,UAASvQ,KAAI+T,wBACvD,EAAKiC,YAAYnV,WAAU,GAAOG,MAChC,SAAA3H,GACEZ,EAAQ,EAAK+e,gCAAgCne,OAE/C,SAAA+H,GACE1I,EAAO0I,WAIX1I,EAAO,CAACyI,SAAS,EAAOnM,KAAM,oC,EAKpCwiB,gCAAA,SAAgCxiB,GAAqD,WACnFC,KAAKC,QAAQ2G,MAAM,wBACnB,IAAMwb,EAAyCpiB,KAAKqiB,qBACpD,GAAItiB,GAAQA,EAAK8hB,IAAIrB,GAAmBxe,IAAK,CAC3C,IAAMsgB,EAAiBviB,EAAKvB,IAAIgiB,GAAmBxe,IACnD,GAAIsgB,GAAkBA,EAAele,SACjB+V,EAAkBoB,aAAa+G,EAAele,UACtD0K,MAAMvJ,SAAQ,SAAA5H,GAAC,OAAIykB,EAAetT,MAAMhF,KAAK,CAACpI,QAAS,EAAKsgB,kBAAkBrkB,QAI5F,OADAqC,KAAKC,QAAQ2G,MAAM,wBAAyBwb,GACrCA,G,EAGTC,mBAAA,WACE,MAAO,CACLrgB,GAAI,GACJR,SAAU,CACRtD,KAAM,GACNkX,YAAa,IAEfhT,OAAQ,GACR0M,MAAO,K,EAIX6S,yBAAA,WACE,MAAO,CACLjY,IAAK,GACLD,KAAM,GACND,YAAa,GACbxH,GAAI,GACJC,SAAU,EACVL,KAAML,IAAWM,KAAKC,QACtBM,OAAQ,GACRogB,KAAK,EACLC,GAAI,KACJjhB,SAAU,CACRtD,KAAM,GACNkX,YAAa,GACbM,KAAM,M,EAKZsM,kBAAA,SAAkB1H,GAChB,IAAMoI,EAAkD1iB,KAAK2hB,2BACvDgB,EAAerI,EAAW5Y,QAAQK,SAgBxC,OAfA2gB,EAAchZ,IAAMiZ,EAAajZ,IACjCgZ,EAAcjZ,KAAOkZ,EAAalZ,KAClCiZ,EAAclZ,YAAcmZ,EAAanZ,YACzCkZ,EAAc1gB,GAAKsY,EAAWtY,GAC9B0gB,EAAczgB,SAAWqY,EAAWrY,SACpCygB,EAAc9gB,KAAO0Y,EAAW1Y,KAChC8gB,EAAcF,MAAQlI,EAAWpY,UACjCwgB,EAActgB,OAASkY,EAAWlY,OAC9BkY,EAAW5Y,QAAQiY,WACrB+I,EAAc/I,SAAWW,EAAW5Y,QAAQiY,UAE1CW,EAAW9Y,UAAgD,iBAA7B8Y,EAAW9Y,SAASkU,MAAqB4E,EAAW9Y,SAASkU,KAAK1P,QAAQ,QAAU,IACpH0c,EAAcD,GAAK,IAErBpkB,OAAO6H,OAAOwc,EAAclhB,SAAU8Y,EAAW9Y,UAC1CkhB,G,kCAnTP,OAAOnT,EAAiB/Q,W,gCAhBa2O,M,yHCXlC,IAAMyV,GAAb,Y,QAyDE,WAAY7iB,GAAc,aACxB,cAAMA,IAAN,MACUiI,WACR,EAAK9J,KAAO6B,EAAK7B,KACjB,EAAKkX,YAAcrV,EAAKqV,YACxB,EAAKyN,gBAAkB9iB,EAAK8iB,gBAC5B,EAAK1Y,MAAQpK,EAAKoK,MAClB,EAAKC,OAASrK,EAAKqK,OACnB,EAAK0Y,WAAa/iB,EAAK+iB,WACvB,EAAKC,OAAShjB,EAAKgjB,OACnB,EAAKC,aAAejjB,EAAKijB,aACzB,EAAKC,SAAWljB,EAAKkjB,SACrB,EAAKC,iBAAmBnjB,EAAKmjB,iBAC7B,EAAKvL,OAAS5X,EAAK4X,OACnB,EAAKwL,SAAWpjB,EAAKojB,SACrB,EAAKC,OAASrjB,EAAKqjB,OACnB,EAAK1N,KAAO3V,EAAK2V,KACjB,EAAK2N,cAAgBtjB,EAAKsjB,cAC1B,EAAK7P,QAAU,IAAIC,KAAK,GACxB,EAAKD,QAAQE,cAAc3T,EAAK4T,WAChC,EAAKC,QAAU,IAAIH,KAAK,GACxB,EAAKG,QAAQF,cAAc3T,EAAK8T,WAChC,EAAKyP,SAAWvjB,EAAKqV,YACrB,EAAK7B,QAAUxT,EAAKqV,YACpB,EAAKmO,YAAcxjB,EAAKqV,YACxB,EAAKoO,QAAUzjB,EAAKqV,YACpB,EAAKqO,aAAe1jB,EAAKqV,aA1BH,EAzD5B,O,EAAA,G,EAAA,G,6EAAA,GAA2CtN,K,GAA9B8a,G,OAC6B,CACtCc,OAAQ,EACRC,oBAAqB,EACrBC,cAAe,EACfC,gBAAiB,EACjB9N,SAAU,EACV+N,WAAY,EACZC,QAAS,EACTC,UAAW,EACXC,YAAa,EACbC,cAAe,GACfC,YAAa,GACbC,cAAe,GACfC,UAAW,GACXC,UAAW,GACXC,mBAAoB,GACpBC,YAAa,GACbC,0BAA2B,GAC3BC,QAAS,GACTC,IAAK,GACLC,QAAS,GACTC,WAAY,K,GAtBHjC,G,eAyBqC,CAC9CkC,OAAQ,EACRC,SAAU,ICrBd,IAAMC,GAAOC,2BACP5e,GAAU6e","file":"playkit-ovp-provider.js","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[\"ovp\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"providers\"] = root[\"playkit\"][\"providers\"] || {}, root[\"playkit\"][\"providers\"][\"ovp\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport MediaSources from './media-sources';\n\nexport default class MediaEntry {\n static Type: {[type: string]: string} = {\n VOD: 'Vod',\n LIVE: 'Live',\n IMAGE: 'Image',\n AUDIO: 'Audio',\n UNKNOWN: 'Unknown'\n };\n static DvrStatus: {[type: string]: number} = {\n ON: 1,\n OFF: 0\n };\n\n /**\n * @member - entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - entry name\n * @type {string}\n */\n name: string;\n /**\n * @member - entry sources\n * @type {MediaSources}\n */\n sources: MediaSources;\n /**\n * @member - entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - entry type\n * @type {string}\n */\n type: string;\n /**\n * @member - entry metadata\n * @type {Object}\n */\n metadata: Object;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - media status\n * @type {number}\n */\n status: number;\n /**\n * @member - media poster\n * @type {string | Array}\n */\n poster: string | Array;\n\n /**\n * @member - assetReferenceType\n * @type {string }\n */\n assetReferenceType: string;\n\n /**\n * @constructor\n */\n constructor() {\n this.metadata = new Map();\n this.sources = new MediaSources();\n this.type = MediaEntry.Type.UNKNOWN;\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaEntryObject} - The json class object.\n */\n toJSON(): ProviderMediaEntryObject {\n return {\n id: this.id,\n name: this.name,\n sources: this.sources.toJSON(),\n duration: this.duration,\n dvrStatus: this.dvrStatus,\n status: this.status,\n metadata: this.metadata,\n type: this.type,\n poster: this.poster,\n assetReferenceType: this.assetReferenceType\n };\n }\n}\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nexport const MediaFormat: {[name: string]: ProviderMediaFormatType} = {\n DASH: {\n name: 'dash',\n mimeType: 'application/dash+xml',\n pathExt: 'mpd'\n },\n HLS: {\n name: 'hls',\n mimeType: 'application/x-mpegURL',\n pathExt: 'm3u8'\n },\n WVM: {\n name: 'wvm',\n mimeType: 'video/wvm',\n pathExt: 'wvm'\n },\n MP4: {\n name: 'mp4',\n mimeType: 'video/mp4',\n pathExt: 'mp4'\n },\n MP3: {\n name: 'mp3',\n mimeType: 'audio/mpeg',\n pathExt: 'mp3'\n }\n};\n\nexport const SupportedStreamFormat: Map = new Map([\n ['mpegdash', MediaFormat.DASH],\n ['applehttp', MediaFormat.HLS],\n ['url', MediaFormat.MP4]\n]);\n\n/**\n * returns a boolean whether a source is progressive or not\n * @param {string} formatName - the format name\n * @returns {boolean} - if source is progressive or not\n */\nfunction isProgressiveSource(formatName: string): boolean {\n const sourceFormat = SupportedStreamFormat.get(formatName);\n return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;\n}\n\nexport {isProgressiveSource};\n","//@flow\nexport class KalturaDrmPlaybackPluginData {\n static Scheme: {[scheme: string]: string} = {\n 'drm.PLAYREADY_CENC': 'com.microsoft.playready',\n 'drm.WIDEVINE_CENC': 'com.widevine.alpha',\n 'fairplay.FAIRPLAY': 'com.apple.fairplay',\n WIDEVINE_CENC: 'com.widevine.alpha',\n PLAYREADY_CENC: 'com.microsoft.playready',\n FAIRPLAY: 'com.apple.fairplay'\n };\n\n /**\n * @member - The drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - The license URL\n * @type {string}\n */\n licenseURL: string;\n\n /**\n * @member - The drm certificate\n * @type {?string}\n */\n certificate: ?string;\n\n /**\n * @constructor\n * @param {Object} drm The json response\n */\n constructor(drm: any) {\n this.scheme = drm.scheme;\n this.licenseURL = drm.licenseURL;\n this.certificate = drm.certificate;\n }\n}\n","//@flow\nexport class KalturaAccessControlMessage {\n /**\n * @member - The access control message\n * @type {string}\n */\n message: string;\n /**\n * @member - The access control message code\n * @@type {string}\n */\n code: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n this.message = data.message;\n this.code = data.code;\n }\n}\n","// @flow\nimport MediaSource from './media-source';\nimport {MediaFormat} from './media-format';\n\nexport default class MediaSources {\n /**\n * Progressive download media sources container.\n * @type {Array}\n * @public\n */\n progressive: Array;\n /**\n * Dash media sources container.\n * @type {Array}\n * @public\n */\n dash: Array;\n /**\n * Hls media sources container.\n * @type {Array}\n * @public\n */\n hls: Array;\n captions: Array;\n\n /**\n * @constructor\n */\n constructor() {\n this.progressive = [];\n this.dash = [];\n this.hls = [];\n }\n\n /**\n * Maps the source to one of the containers according to his media format.\n * @param {MediaSource} source - The source to add to one of the containers.\n * @param {MediaFormat} mediaFormat - The media format of the source.\n * @returns {void}\n */\n map(source: MediaSource, mediaFormat: ?ProviderMediaFormatType) {\n if (mediaFormat) {\n switch (mediaFormat.name) {\n case MediaFormat.MP4.name:\n this.progressive.push(source);\n break;\n case MediaFormat.DASH.name:\n this.dash.push(source);\n break;\n case MediaFormat.HLS.name:\n this.hls.push(source);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourcesObject} - The json class object.\n */\n toJSON(): ProviderMediaSourcesObject {\n const response: ProviderMediaSourcesObject = {\n progressive: [],\n dash: [],\n hls: []\n };\n this.progressive.forEach(p => response.progressive.push(p.toJSON()));\n this.hls.forEach(h => response.hls.push(h.toJSON()));\n this.dash.forEach(d => response.dash.push(d.toJSON()));\n return response;\n }\n}\n","//@flow\nimport Drm from './drm';\n\nexport default class MediaSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n /**\n * @member - media source drm data\n * @type {Array}\n */\n drmData: Array;\n /**\n * @member - media source bandwidth\n * @type {number}\n */\n bandwidth: number;\n /**\n * @member - media source width\n * @type {number}\n */\n width: number;\n /**\n * @member - media source height\n * @type {number}\n */\n height: number;\n /**\n * @member - media source label\n * @type {string}\n */\n label: string;\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourceObject} - The json class object.\n */\n toJSON(): ProviderMediaSourceObject {\n const response: ProviderMediaSourceObject = {\n id: this.id,\n url: this.url,\n mimetype: this.mimetype\n };\n if (this.bandwidth) response.bandwidth = this.bandwidth;\n if (this.width) response.width = this.width;\n if (this.height) response.height = this.height;\n if (this.label) response.label = this.label;\n if (this.drmData && this.drmData.length > 0) {\n response.drmData = [];\n this.drmData.forEach(d => {\n if (Array.isArray(response.drmData)) {\n response.drmData.push(d.toJSON());\n }\n });\n }\n return response;\n }\n}\n","// @flow\nimport MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';\nimport Error from '../../util/error/error';\n\nexport default class DataLoaderManager {\n /**\n * @member - Loaders response map index\n * @type {Map>}\n * @private\n */\n _loadersResponseMap: Map> = new Map();\n /**\n * @member - Loaders multi request\n * @type {MultiRequestBuilder}\n * @protected\n */\n _multiRequest: MultiRequestBuilder;\n /**\n * @member - Loaders multi response\n * @type {MultiRequestResult}\n * @private\n */\n _multiResponse: MultiRequestResult;\n /**\n * @member - Loaders to execute\n * @type {Map}\n * @private\n */\n _loaders: Map = new Map();\n\n _networkRetryConfig: ProviderNetworkRetryParameters;\n\n constructor(networkRetryConfig: ProviderNetworkRetryParameters) {\n this._networkRetryConfig = networkRetryConfig;\n }\n\n /**\n * Add loader to execution loaders map\n * @function\n * @param {Function} loader Loader to add\n * @param {Object} params Loader params\n * @param {string} ks ks\n * @returns {void}\n */\n add(loader: Function, params: Object, ks?: string): void {\n let execution_loader = new loader(params);\n if (execution_loader.isValid()) {\n this._loaders.set(loader.id, execution_loader);\n // Get the start index from the multiReqeust before adding current execution_loader requests\n let startIndex = this._multiRequest.requests.length;\n // Get the requests\n let requests = execution_loader.requests;\n this._multiRequest.retryConfig = this._networkRetryConfig;\n // Add requests to multiRequest queue\n requests.forEach(request => {\n request.params = request.params || {};\n request.params.ks = request.params.ks || ks;\n this._multiRequest.add(request);\n });\n // Create range array of current execution_loader requests\n let executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);\n // Add to map\n this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);\n }\n }\n\n /**\n * Get data from all loaders using multi request\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @function\n * @returns {Promise} Promise\n */\n fetchData(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n this._multiRequest.execute(requestsMustSucceed).then(\n data => {\n this._multiResponse = data.response;\n let preparedData: Object = this.prepareData(data.response);\n if (preparedData.success) {\n resolve(this._loaders);\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {\n headers: data.headers\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n /**\n * Prepare fetched data\n * @function\n * @param {MultiRequestResult} response - The multi request result\n * @returns {Object} - The prepared data\n */\n prepareData(response: MultiRequestResult): Object {\n this._loaders.forEach((loader, name) => {\n let loaderDataIndexes = this._loadersResponseMap.get(name);\n try {\n if (loaderDataIndexes && loaderDataIndexes.length > 0) {\n loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);\n }\n } catch (err) {\n return {success: false, error: err};\n }\n });\n return {success: true, data: this._loaders};\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = this.results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.results = results;\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nexport default class Drm {\n /**\n * @member - license url\n * @type {string}\n */\n licenseUrl: string;\n /**\n * @member - drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - drm certificate\n * @type {string}\n */\n certificate: string;\n\n /**\n * @constructor\n * @param {string} licenseUrl - the license url\n * @param {string} scheme - the drm scheme\n * @param {?string} certificate - the drm certificate\n */\n constructor(licenseUrl: string, scheme: string, certificate: ?string) {\n this.licenseUrl = licenseUrl;\n this.scheme = scheme;\n if (certificate) {\n this.certificate = certificate;\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderDrmDataObject} - The json class object.\n */\n toJSON(): ProviderDrmDataObject {\n const response: ProviderDrmDataObject = {\n licenseUrl: this.licenseUrl,\n scheme: this.scheme\n };\n if (this.certificate) response.certificate = this.certificate;\n return response;\n }\n}\n","// @flow\nimport {getLogLevel, setLogLevel, setLogger, type LogLevelType, LogLevel} from '../../util/logger';\nimport DataLoaderManager from './data-loader-manager';\nimport Error from '../../util/error/error';\n\nexport default class BaseProvider {\n _partnerId: number;\n _widgetId: ?string;\n _ks: string;\n _uiConfId: ?number;\n _dataLoader: DataLoaderManager;\n _playerVersion: string;\n _logger: any;\n _isAnonymous: boolean;\n _networkRetryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n get partnerId(): number {\n return this._partnerId;\n }\n\n get widgetId(): string {\n return this._widgetId || this.defaultWidgetId;\n }\n\n get defaultWidgetId(): string {\n return '_' + this._partnerId;\n }\n\n get uiConfId(): ?number {\n return this._uiConfId;\n }\n\n get ks(): string {\n return this._ks;\n }\n\n set ks(value: string): void {\n this._ks = value;\n }\n\n get playerVersion(): string {\n return this._playerVersion;\n }\n\n get isAnonymous(): boolean {\n return this._isAnonymous;\n }\n\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n setLogger(options.logger);\n this._partnerId = options.partnerId;\n this._widgetId = options.widgetId;\n this._uiConfId = options.uiConfId;\n this._isAnonymous = !options.ks;\n this._ks = options.ks || '';\n this._playerVersion = playerVersion;\n }\n\n // eslint-disable-next-line no-unused-vars\n getMediaConfig(mediaInfo: MI): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'getMediaConfig method must be implement by the derived class'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading playlist by id'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading entry list'\n })\n );\n }\n\n _verifyHasSources(sources: ProviderMediaConfigSourcesObject) {\n if (sources.hls.concat(sources.dash, sources.progressive).length === 0) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {\n action: '',\n messages: `No play source for entry id: ${sources.id}`\n });\n }\n }\n\n get LogLevel(): LogLevelType {\n return LogLevel;\n }\n\n getLogLevel(name?: string): Object {\n return getLogLevel(name);\n }\n\n setLogLevel(level: Object, name?: string): void {\n setLogLevel(level, name);\n }\n}\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class EntryList {\n /**\n * @member - entry list items\n * @type {Array}\n */\n items: Array;\n\n constructor() {\n this.items = [];\n }\n}\n","//@flow\n\nexport default class Bumper {\n /**\n * @member - bumper url\n * @type {string}\n */\n url: string;\n /**\n * @member - bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n\n /**\n * @constructor\n * @param {Object} data - The bumper response\n */\n constructor(data: Object) {\n this.url = data.url;\n this.clickThroughUrl = data.clickThroughUrl;\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","//@flow\nimport {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';\n\nexport type OVPKalturaPlaybackSource = KalturaPlaybackSource;\n\nexport class KalturaPlaybackSource {\n /**\n * @member - source format according to delivery profile streamer type (applehttp, mpegdash etc.)\n * @type {string}\n */\n format: string;\n /**\n * @member - delivery profile Id\n * @type {string}\n */\n deliveryProfileId: string;\n /**\n * @member - The source URL\n * @type {string}\n */\n url: string;\n /**\n * @member - comma separated string according to deliveryProfile media protocols ('http,https' etc.)\n * @type {string}\n */\n protocols: string;\n /**\n * @member - comma separated string of flavor ids\n * @type {string}\n */\n flavorIds: string;\n /**\n * @member - drm data object containing relevant license url ,scheme name and certificate\n * @type {Array}\n */\n drm: Array = [];\n\n /**\n * @constructor\n * @param {Object} source The response\n */\n constructor(source: Object) {\n this.format = source.format;\n this.deliveryProfileId = source.deliveryProfileId;\n this.url = source.url;\n this.protocols = source.protocols;\n this.flavorIds = source.flavorIds;\n if (source.drm) {\n source.drm.map(drm => this.drm.push(new KalturaDrmPlaybackPluginData(drm)));\n }\n }\n\n /**\n * Checks if source has DRM data\n * @function hasDrmData\n * @returns {boolean} Is source has DRM\n */\n hasDrmData(): boolean {\n return this.drm && this.drm.length > 0;\n }\n\n /**\n * Checks if source has flavor IDs\n * @function hasFlavorIds\n * @returns {boolean} Is source ha flavor IDs\n */\n hasFlavorIds(): boolean {\n return !!this.flavorIds && this.flavorIds.length > 0;\n }\n\n /**\n * Returns source desired protocol if supported\n * @param {string} protocol - the desired protocol for the source (base play url protocol)\n * @returns {string} - protocol if protocol is in the protocols list - if not empty string returned\n */\n getProtocol(protocol: string): string {\n let returnValue: string = '';\n if (this.protocols && this.protocols.length > 0) {\n let protocolsArr: Array = this.protocols.split(',');\n protocolsArr.forEach(p => {\n if (p === protocol) {\n returnValue = p;\n }\n });\n } else if (protocol === 'http') {\n return protocol;\n }\n return returnValue;\n }\n}\n","//@flow\nexport class KalturaRuleAction {\n static Type: {[type: string]: string | number} = {\n DRM_POLICY: 'drm.DRM_POLICY',\n BLOCK: 1,\n PREVIEW: 2,\n LIMIT_FLAVORS: 3,\n ADD_TO_STORAGE: 4,\n LIMIT_DELIVERY_PROFILES: 5,\n SERVE_FROM_REMOTE_SERVER: 6,\n REQUEST_HOST_REGEX: 7,\n LIMIT_THUMBNAIL_CAPTURE: 8\n };\n\n /**\n * @member - The type of the action\n * @type {string|number}\n */\n type: string | number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.type = data.type;\n }\n}\n","//@flow\nimport {KalturaRuleAction} from './kaltura-rule-action';\n\nexport class KalturaAccessControlModifyRequestHostRegexAction extends KalturaRuleAction {\n /**\n * @member - Request host regex pattern\n * @type {string}\n */\n pattern: string;\n /**\n * @member - Request host regex replacement\n * @type {string}\n */\n replacement: string;\n /**\n * @member - serverNodeId to generate replacment host from\n * @type {number}\n */\n replacmenServerNodeId: number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n super(data);\n this.pattern = data.pattern;\n this.replacement = data.replacement;\n this.replacmenServerNodeId = data.replacmenServerNodeId;\n }\n}\n","//@flow\nexport class KalturaFlavorAsset {\n static Status: {[status: string]: number} = {\n ERROR: -1,\n QUEUED: 0,\n CONVERTING: 1,\n READY: 2,\n DELETED: 3,\n NOT_APPLICABLE: 4,\n TEMP: 5,\n WAIT_FOR_CONVERT: 6,\n IMPORTING: 7,\n VALIDATING: 8,\n EXPORTING: 9\n };\n\n /**\n * @member - The ID of the Flavor Asset\n * @type {string}\n */\n id: string;\n /**\n * @member -The Flavor Params used to create this Flavor Asset\n * @type {string}\n */\n flavorParamsId: string;\n /**\n * @member -The file extension\n * @type {string}\n */\n fileExt: string;\n /**\n * @member - The overall bitrate (in KBits) of the Flavor Asset\n * @type {string}\n */\n bitrate: number;\n /**\n * @member - The width of the Flavor Asset\n * @type {number}\n */\n width: number;\n /**\n * @member - The height of the Flavor Asset\n * @type {number}\n */\n height: number;\n /**\n * @member - The frame rate (in FPS) of the Flavor Asset\n * @type {number}\n */\n frameRate: number;\n /**\n * @member - True if this Flavor Asset is the original source\n * @type {number}\n */\n isOriginal: boolean;\n /**\n * @member - True if this Flavor Asset is playable in KDP\n * @type {boolean}\n */\n isWeb: boolean;\n /**\n * @member - The container format\n * @type {boolean}\n */\n containerFormat: string;\n /**\n *@member - The video codec\n * @type {boolean}\n */\n videoCodecId: string;\n /**\n * @member - The status of the Flavor Asset\n * @type {number}\n */\n status: number;\n /**\n * @member - The language of the flavor asset\n * @type {Status}\n */\n language: string;\n /**\n * @member - The label of the flavor asset\n * @type {string}\n */\n label: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: any) {\n this.id = data.id;\n this.flavorParamsId = data.flavorParamsId;\n this.fileExt = data.fileExt;\n this.bitrate = data.bitrate;\n this.width = data.width;\n this.height = data.height;\n this.id = data.id;\n this.frameRate = data.frameRate;\n this.isOriginal = data.isOriginal;\n this.isWeb = data.isWeb;\n this.containerFormat = data.containerFormat;\n this.videoCodecId = data.videoCodecId;\n this.status = data.status;\n this.language = data.language;\n this.label = data.label;\n }\n}\n","//@flow\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\n\nexport class KalturaBumper {\n /**\n * @member - The bumper entry ID\n * @type {string}\n */\n entryId: string;\n /**\n * @member - The bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n /**\n * @member - The bumper sources\n * @type {Array}\n */\n sources: Array;\n\n constructor(data: any) {\n this.entryId = data.entryId;\n this.clickThroughUrl = data.url;\n this.sources = data.sources ? data.sources.map(source => new KalturaPlaybackSource(source)) : [];\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\nimport {KalturaAccessControlModifyRequestHostRegexAction} from './kaltura-access-control-modify-request-host-regex-action';\nimport {KalturaRuleAction} from './kaltura-rule-action';\nimport {KalturaFlavorAsset} from './kaltura-flavor-asset';\nimport {KalturaBumper} from './kaltura-bumper';\n\nexport class KalturaPlaybackContext extends ServiceResult {\n /**\n * @member - The playback sources\n * @type {Array}\n */\n sources: Array = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array}\n */\n actions: Array = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array}\n */\n messages: Array = [];\n /**\n * @member - The flavor assets\n * @type {Array}\n */\n flavorAssets: Array = [];\n /**\n * @member - The bumper data\n * @type {Array}\n */\n bumperData: Array = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n const messages = response.messages;\n if (messages) {\n messages.map(message => this.messages.push(new KalturaAccessControlMessage(message)));\n }\n const actions = response.actions;\n if (actions) {\n actions.map(action => {\n if (action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX) {\n this.actions.push(new KalturaAccessControlModifyRequestHostRegexAction(action));\n } else {\n this.actions.push(new KalturaRuleAction(action));\n }\n });\n }\n const sources = response.sources;\n if (sources) {\n sources.map(source => this.sources.push(new KalturaPlaybackSource(source)));\n }\n const flavorAssets = response.flavorAssets;\n if (flavorAssets) {\n flavorAssets.map(flavor => this.flavorAssets.push(new KalturaFlavorAsset(flavor)));\n }\n const bumperData = response.bumperData;\n if (bumperData) {\n bumperData.map(bumper => this.bumperData.push(new KalturaBumper(bumper)));\n }\n }\n }\n\n hasBlockAction(): boolean {\n return this.getBlockAction() !== undefined;\n }\n\n getBlockAction(): ?KalturaRuleAction {\n return this.actions.find(action => action.type === KalturaRuleAction.Type.BLOCK);\n }\n\n getErrorMessages(): Array {\n return this.messages;\n }\n\n /**\n * Get the KalturaAccessControlModifyRequestHostRegexAction action\n * @function getRequestHostRegexAction\n * @returns {?KalturaAccessControlModifyRequestHostRegexAction} The action\n * */\n getRequestHostRegexAction(): ?KalturaAccessControlModifyRequestHostRegexAction {\n const action = this.actions.find(action => action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX);\n if (action instanceof KalturaAccessControlModifyRequestHostRegexAction) {\n return action;\n }\n }\n}\n","//@flow\nexport class KalturaMetadata {\n static ObjectType: {[type: string]: string | number} = {\n AD_CUE_POINT: 'adCuePointMetadata.AdCuePoint',\n ANNOTATION: 'annotationMetadata.Annotation',\n CODE_CUE_POINT: 'codeCuePointMetadata.CodeCuePoint',\n THUMB_CUE_POINT: 'thumbCuePointMetadata.thumbCuePoint',\n ENTRY: 1,\n CATEGORY: 2,\n USER: 3,\n PARTNER: 4,\n DYNAMIC_OBJECT: 5\n };\n\n static Status: {[status: string]: number} = {\n VALID: 1,\n INVALID: 2,\n DELETED: 3\n };\n\n id: number;\n metadataProfileId: number;\n metadataProfileVersion: number;\n metadataObjectType: string | number;\n objectId: string;\n version: number;\n created: Date;\n updated: Date;\n status: number;\n xml: string;\n\n /**\n * @constructor\n * @param {Object} data The response\n */\n constructor(data: Object) {\n this.id = data.id;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataProfileVersion = data.metadataProfileVersion;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataObjectType = data.metadataObjectType;\n this.objectId = data.objectId;\n this.version = data.version;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.status = data.status;\n this.xml = data.xml;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMetadata} from './kaltura-metadata';\n\nexport class KalturaMetadataListResponse extends ServiceResult {\n totalCount: number;\n metas: Array;\n\n /**\n * @constructor\n * @param {Object} responseObj The response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.metas = [];\n responseObj.objects.map(meta => this.metas.push(new KalturaMetadata(meta)));\n }\n }\n }\n}\n","//@flow\nexport class KalturaMediaEntry {\n static EntryType: {[entryType: string]: {value: number | string}} = {\n AUTOMATIC: {value: -1},\n EXTERNAL_MEDIA: {value: 'externalMedia.externalMedia'},\n MEDIA_CLIP: {value: 1},\n MIX: {value: 2},\n PLAYLIST: {value: 5},\n DATA: {value: 6},\n LIVE_STREAM: {value: 7},\n LIVE_CHANNEL: {value: 8},\n DOCUMENT: {value: 10}\n };\n\n static MediaType: {[mediaType: string]: {value: number}} = {\n VIDEO: {value: 1},\n IMAGE: {value: 2},\n AUDIO: {value: 5},\n LIVE_STREAM_FLASH: {value: 201},\n LIVE_STREAM_WINDOWS_MEDIA: {value: 202},\n LIVE_STREAM_REAL_MEDIA: {value: 203},\n LIVE_STREAM_QUICK_TIME: {value: 204}\n };\n\n static EntryStatus: {[status: string]: string | number} = {\n ERROR_IMPORTING: -2,\n ERROR_CONVERTING: -1,\n SCAN_FAILURE: 'virusScan.ScanFailure',\n IMPORT: 0,\n INFECTED: 'virusScan.Infected',\n PRECONVERT: 1,\n READY: 2,\n DELETED: 3,\n PENDING: 4,\n MODERATE: 5,\n BLOCKED: 6,\n NO_CONTENT: 7\n };\n\n static EntryModerationStatus: {[status: string]: number} = {\n PENDING_MODERATION: 1,\n APPROVED: 2,\n REJECTED: 3,\n FLAGGED_FOR_REVIEW: 4,\n MODERATE: 5,\n AUTO_APPROVED: 6\n };\n\n /**\n * @member - The entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - The entry referenceId\n * @type {string}\n */\n referenceId: string;\n /**\n * @member - The entry externalSourceType\n * @type {string}\n */\n externalSourceType: string;\n /**\n * @member - Entry name (Min 1 chars)\n * @type {string}\n */\n name: string;\n /**\n * @member - Entry description\n * @type {string}\n */\n description: string;\n /**\n * @member - The URL used for playback. This is not the download URL.\n * @type {string}\n */\n dataUrl: string;\n /**\n * @member - Comma separated flavor params ids that exists for this media entry\n * @type {string}\n */\n flavorParamsIds: string;\n /**\n * @member - The entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object\n * @type {string | number}\n */\n type: string | number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object (Image, Audio etc.)\n * @type {number}\n */\n entryType: number;\n /**\n * @member - Entry poster image\n * @type {string}\n */\n poster: string;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - Entry tags\n * @type {string}\n */\n tags: string;\n\n /**\n * @member - Entry status\n * @type {number}\n */\n status: number;\n\n /**\n * @constructor\n * @param {Object} entry The json response\n */\n constructor(entry: Object) {\n this.id = entry.id;\n this.referenceId = entry.referenceId;\n this.externalSourceType = entry.externalSourceType;\n this.name = entry.name;\n this.description = entry.description;\n this.dataUrl = entry.dataUrl;\n this.type = entry.type;\n this.entryType = entry.mediaType;\n this.flavorParamsIds = entry.flavorParamsIds;\n this.duration = entry.duration;\n this.poster = entry.thumbnailUrl;\n this.status = entry.status;\n this.dvrStatus = entry.dvrStatus;\n this.tags = entry.tags;\n }\n}\n","//@flow\nimport OVPConfiguration from './config';\n\ntype urlParamsType = {\n partnerId: number,\n entryId: string,\n ks: string,\n uiConfId: ?number,\n format: string,\n protocol: string,\n extension: string,\n flavorIds: ?string\n};\n\nexport default class PlaySourceUrlBuilder {\n /**\n * Returns source url by given url params\n * @function build\n * @param {urlParamsType} urlParams The params\n * @returns {string} The URL\n * @static\n */\n static build(urlParams: urlParamsType): string {\n const config = OVPConfiguration.get();\n const serviceUrlOrigin: string = config.serviceUrl.substr(0, config.serviceUrl.lastIndexOf('/'));\n const {partnerId, entryId, ks, uiConfId, format, protocol, extension, flavorIds} = urlParams;\n\n //verify mandatory params\n //$FlowFixMe\n if (!serviceUrlOrigin || isNaN(Number.parseInt(partnerId)) || !entryId || !format || !protocol) {\n return '';\n }\n\n let playUrl = serviceUrlOrigin;\n if (!serviceUrlOrigin.endsWith('/')) {\n playUrl += '/';\n }\n playUrl += 'p/' + partnerId + '/sp/' + partnerId + '00' + '/playManifest/entryId/' + entryId + '/protocol/' + protocol + '/format/' + format;\n\n if (flavorIds) {\n playUrl += '/flavorIds/' + flavorIds;\n } else if (uiConfId) {\n playUrl += '/uiConfId/' + uiConfId;\n }\n\n if (ks !== '') {\n playUrl += '/ks/' + ks;\n }\n\n if (extension !== '') {\n playUrl += '/a.' + extension;\n }\n\n if (uiConfId && flavorIds !== '') {\n playUrl += '?uiConfId=' + uiConfId;\n }\n\n return playUrl;\n }\n}\n","//@flow\nexport default class XmlParser {\n /**\n * Parses xml string to json object\n * @param {string} xml The xml to parse\n * @returns {{}} The parsed xml as Json object\n * @static\n */\n static xmlToJson(xml: Object) {\n let obj = {};\n if (xml.nodeType === 1) {\n if (xml.attributes.length > 0) {\n obj['@attributes'] = {};\n for (let j = 0; j < xml.attributes.length; j++) {\n let attribute = xml.attributes.item(j);\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\n }\n }\n } else if (xml.nodeType === 3) {\n obj = xml.nodeValue;\n }\n if (xml.hasChildNodes()) {\n for (let i = 0; i < xml.childNodes.length; i++) {\n let item = xml.childNodes.item(i);\n let nodeName = item.nodeName;\n if (typeof obj[nodeName] === 'undefined') {\n obj[nodeName] = this.xmlToJson(item);\n } else {\n if (typeof obj[nodeName].push === 'undefined') {\n let old = obj[nodeName];\n obj[nodeName] = [];\n obj[nodeName].push(old);\n }\n obj[nodeName].push(this.xmlToJson(item));\n }\n }\n }\n return obj;\n }\n}\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class Playlist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n\n /**\n * @member - playlist poster\n * @type {string}\n */\n poster: string;\n\n /**\n * @member - playlist items\n * @type {Array}\n */\n items: Array;\n\n constructor() {\n this.items = [];\n }\n}\n","// @flow\n\nimport {addKsToUrl} from './provider-parser';\n\nconst KalturaCaptionType: CaptionType = {\n SRT: '1',\n DFXP: '2',\n WEBVTT: '3',\n CAP: '4'\n};\n\nconst CaptionsFormatsMap: {[format: string]: string} = {\n '3': 'vtt',\n '1': 'srt'\n};\n\nclass ExternalCaptionsBuilder {\n static createConfig(captions: Array, ks: string): Array {\n return captions.map(caption => {\n let url = caption.url;\n let type = CaptionsFormatsMap[caption.format];\n if ([KalturaCaptionType.DFXP, KalturaCaptionType.CAP].includes(caption.format)) {\n url = caption.webVttUrl;\n type = CaptionsFormatsMap[KalturaCaptionType.WEBVTT];\n }\n url = addKsToUrl(url, ks);\n return {\n default: !!caption.isDefault,\n type: type,\n language: caption.languageCode,\n label: caption.label,\n url: url\n };\n });\n }\n}\n\nexport {ExternalCaptionsBuilder};\n","//@flow\nimport {KalturaPlaybackContext} from './response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from './response-types/kaltura-metadata-list-response';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport {KalturaPlaybackSource} from './response-types/kaltura-playback-source';\nimport {KalturaBumper} from './response-types/kaltura-bumper';\nimport {KalturaDrmPlaybackPluginData} from '../common/response-types/kaltura-drm-playback-plugin-data';\nimport PlaySourceUrlBuilder from './play-source-url-builder';\nimport XmlParser from '../../util/xml-parser';\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport MediaEntry from '../../entities/media-entry';\nimport Drm from '../../entities/drm';\nimport MediaSource from '../../entities/media-source';\nimport MediaSources from '../../entities/media-sources';\nimport {SupportedStreamFormat, isProgressiveSource} from '../../entities/media-format';\nimport Playlist from '../../entities/playlist';\nimport EntryList from '../../entities/entry-list';\nimport Bumper from '../../entities/bumper';\nimport {KalturaRuleAction} from './response-types/kaltura-rule-action';\nimport {KalturaAccessControlMessage} from '../common/response-types/kaltura-access-control-message';\nimport type {OVPMediaEntryLoaderResponse} from './loaders/media-entry-loader';\nimport {ExternalCaptionsBuilder} from './external-captions-builder';\n\nclass OVPProviderParser {\n static _logger = getLogger('OVPProviderParser');\n\n /**\n * Returns parsed media entry by given OVP response objects\n * @function getMediaEntry\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {any} mediaEntryResponse - The media entry response\n * @returns {MediaEntry} - The media entry\n * @static\n * @public\n */\n static getMediaEntry(ks: string, partnerId: number, uiConfId: ?number, mediaEntryResponse: any): MediaEntry {\n const mediaEntry = new MediaEntry();\n const entry = mediaEntryResponse.entry;\n const playbackContext = mediaEntryResponse.playBackContextResult;\n const metadataList = mediaEntryResponse.metadataListResult;\n const kalturaSources = playbackContext.sources;\n\n mediaEntry.sources = OVPProviderParser._getParsedSources(kalturaSources, ks, partnerId, uiConfId, entry, playbackContext);\n if (OVPConfiguration.get().useApiCaptions && playbackContext.data.playbackCaptions) {\n mediaEntry.sources.captions = ExternalCaptionsBuilder.createConfig(playbackContext.data.playbackCaptions, ks);\n }\n OVPProviderParser._fillBaseData(mediaEntry, entry, metadataList);\n return mediaEntry;\n }\n\n /**\n * Returns the url with KS\n * @function addKsToUrl\n * @param {String} url - The url to add the KS\n * @param {string} ks - The ks\n * @returns {string} - The url with KS\n * @static\n * @public\n */\n static addKsToUrl(url: string, ks: string): string {\n const hasUrlExtension = path => {\n const pathWithoutQuery = path.split('?')[0];\n const pathAfterLastSlash = pathWithoutQuery.replace(/^.*[\\\\/]/, '');\n return pathAfterLastSlash.indexOf('.') !== -1;\n };\n let ksParam;\n if (ks) {\n if (hasUrlExtension(url)) {\n ksParam = url.indexOf('?') === -1 ? '?ks=' : '&ks=';\n } else {\n ksParam = '/ks/';\n }\n return url + ksParam + ks;\n }\n return url;\n }\n\n /**\n * Returns parsed playlist by given OVP response objects\n * @function getPlaylist\n * @param {any} playlistResponse - The playlist response\n * @returns {Playlist} - The playlist\n * @static\n * @public\n */\n static getPlaylist(playlistResponse: any): Playlist {\n const playlist = new Playlist();\n const playlistData = playlistResponse.playlistData;\n const playlistItems = playlistResponse.playlistItems.entries;\n playlist.id = playlistData.id;\n playlist.name = playlistData.name;\n playlist.description = playlistData.description;\n playlist.poster = playlistData.poster;\n playlistItems.forEach((entry: KalturaMediaEntry) => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n playlist.items.push(mediaEntry);\n });\n return playlist;\n }\n\n /**\n * Returns parsed entry list by given OVP response objects\n * @function getEntryList\n * @param {any} playlistResponse - response\n * @returns {Playlist} - The entry list\n * @static\n * @public\n */\n static getEntryList(playlistResponse: any): EntryList {\n const entryList = new EntryList();\n const playlistItems = playlistResponse.playlistItems.entries;\n playlistItems.forEach(entry => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n entryList.items.push(mediaEntry);\n });\n return entryList;\n }\n\n /**\n * Returns parsed bumper by given OTT response objects.\n * @function getBumper\n * @param {any} assetResponse - The asset response.\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @returns {?Bumper} - The bumper\n * @static\n * @public\n */\n static getBumper(assetResponse: any, ks: string, partnerId: number): ?Bumper {\n const playbackContext = assetResponse.playBackContextResult;\n const bumperData: KalturaBumper = playbackContext.bumperData[0];\n if (bumperData) {\n const bumperSources = bumperData && bumperData.sources;\n const progressiveBumper = bumperSources.find(bumper => isProgressiveSource(bumper.format));\n if (progressiveBumper) {\n const parsedSources = OVPProviderParser._parseProgressiveSources(progressiveBumper, playbackContext, ks, partnerId, 0, bumperData.entryId);\n if (parsedSources[0]) {\n return new Bumper({url: parsedSources[0].url, clickThroughUrl: bumperData.clickThroughUrl});\n }\n }\n }\n }\n\n static _fillBaseData(mediaEntry: MediaEntry, entry: KalturaMediaEntry, metadataList: ?KalturaMetadataListResponse) {\n mediaEntry.poster = entry.poster;\n mediaEntry.id = entry.id;\n mediaEntry.duration = entry.duration;\n mediaEntry.metadata = OVPProviderParser._parseMetadata(metadataList);\n mediaEntry.metadata.description = entry.description || '';\n mediaEntry.metadata.name = entry.name || '';\n mediaEntry.metadata.tags = entry.tags || '';\n mediaEntry.status = entry.status;\n\n mediaEntry.type = OVPProviderParser._getEntryType(entry.entryType, entry.type);\n if (mediaEntry.type === MediaEntry.Type.LIVE) {\n mediaEntry.dvrStatus = entry.dvrStatus;\n }\n\n return mediaEntry;\n }\n\n static _getEntryType(entryTypeEnum: number, typeEnum: number | string): string {\n let type = MediaEntry.Type.UNKNOWN;\n switch (entryTypeEnum) {\n case KalturaMediaEntry.MediaType.IMAGE.value:\n type = MediaEntry.Type.IMAGE;\n break;\n case KalturaMediaEntry.MediaType.AUDIO.value:\n type = MediaEntry.Type.AUDIO;\n break;\n default:\n switch (typeEnum) {\n case KalturaMediaEntry.EntryType.MEDIA_CLIP.value:\n type = MediaEntry.Type.VOD;\n break;\n case KalturaMediaEntry.EntryType.LIVE_STREAM.value:\n case KalturaMediaEntry.EntryType.LIVE_CHANNEL.value:\n type = MediaEntry.Type.LIVE;\n break;\n default:\n type = MediaEntry.Type.UNKNOWN;\n }\n }\n return type;\n }\n\n /**\n * Returns the parsed sources\n * @function _getParsedSources\n * @param {Array} kalturaSources - The kaltura sources\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {Object} entry - The entry\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @return {MediaSources} - A media sources\n * @static\n * @private\n */\n static _getParsedSources(\n kalturaSources: Array,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entry: Object,\n playbackContext: KalturaPlaybackContext\n ): MediaSources {\n const sources = new MediaSources();\n const addAdaptiveSource = (source: KalturaPlaybackSource) => {\n const parsedSource = OVPProviderParser._parseAdaptiveSource(source, playbackContext, ks, partnerId, uiConfId, entry.id);\n if (parsedSource) {\n const sourceFormat = SupportedStreamFormat.get(source.format);\n sources.map(parsedSource, sourceFormat);\n }\n };\n const parseAdaptiveSources = () => {\n kalturaSources.filter(source => !isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n const parseProgressiveSources = () => {\n const progressiveSource = kalturaSources.find(source => {\n //match progressive source with supported protocol(http/s)\n return isProgressiveSource(source.format) && source.getProtocol(OVPProviderParser._getBaseProtocol()) !== '';\n });\n sources.progressive = OVPProviderParser._parseProgressiveSources(progressiveSource, playbackContext, ks, partnerId, uiConfId, entry.id);\n };\n\n const parseExternalMedia = () => {\n const mediaSource = new MediaSource();\n mediaSource.mimetype = 'video/youtube';\n mediaSource.url = entry.referenceId;\n mediaSource.id = entry.id + '_youtube';\n sources.progressive.push(mediaSource);\n };\n\n if (entry.type === KalturaMediaEntry.EntryType.EXTERNAL_MEDIA.value) {\n parseExternalMedia();\n } else if (kalturaSources && kalturaSources.length > 0) {\n parseAdaptiveSources();\n parseProgressiveSources();\n }\n return sources;\n }\n\n /**\n * Returns a parsed adaptive source\n * @function _parseAdaptiveSource\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {?MediaSource} - The parsed adaptive kalturaSource\n * @static\n * @private\n */\n static _parseAdaptiveSource(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): ?MediaSource {\n const mediaSource: MediaSource = new MediaSource();\n if (kalturaSource) {\n let playUrl: string = '';\n const mediaFormat = SupportedStreamFormat.get(kalturaSource.format);\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const format = kalturaSource.format;\n let extension: string = '';\n if (mediaFormat) {\n extension = mediaFormat.pathExt;\n mediaSource.mimetype = mediaFormat.mimeType;\n }\n // in case playbackSource doesn't have flavors we don't need to build the url and we'll use the provided one.\n if (kalturaSource.hasFlavorIds()) {\n if (!extension && playbackContext.flavorAssets && playbackContext.flavorAssets.length > 0) {\n extension = playbackContext.flavorAssets[0].fileExt;\n }\n playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: kalturaSource.flavorIds,\n format,\n ks,\n partnerId,\n uiConfId,\n extension,\n protocol\n });\n } else {\n playUrl = OVPProviderParser.addKsToUrl(kalturaSource.url, ks);\n }\n if (!playUrl) {\n const message = `failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}`;\n OVPProviderParser._logger.warn(message);\n return null;\n }\n mediaSource.url = OVPProviderParser._applyRegexAction(playbackContext, playUrl);\n mediaSource.id = entryId + '_' + deliveryProfileId + ',' + format;\n if (kalturaSource.hasDrmData()) {\n const drmParams: Array = [];\n kalturaSource.drm.forEach(drm => {\n drmParams.push(new Drm(drm.licenseURL, KalturaDrmPlaybackPluginData.Scheme[drm.scheme], drm.certificate));\n });\n mediaSource.drmData = drmParams;\n }\n }\n return mediaSource;\n }\n\n /**\n * Returns parsed progressive sources\n * @function _parseProgressiveSources\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {Array} - The parsed progressive kalturaSources\n * @static\n * @private\n */\n static _parseProgressiveSources(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): Array {\n const videoSources: Array = [];\n const audioSources: Array = [];\n if (kalturaSource) {\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const format = kalturaSource.format;\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const sourceId = deliveryProfileId + ',' + format;\n playbackContext.flavorAssets.map(flavor => {\n const mediaSource: MediaSource = new MediaSource();\n mediaSource.id = flavor.id + sourceId;\n mediaSource.mimetype = flavor.fileExt === 'mp3' ? 'audio/mp3' : 'video/mp4';\n mediaSource.height = flavor.height;\n mediaSource.width = flavor.width;\n mediaSource.bandwidth = flavor.bitrate * 1024;\n mediaSource.label = flavor.label || flavor.language;\n const playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: flavor.id,\n format,\n ks,\n partnerId: partnerId,\n uiConfId: uiConfId,\n extension: flavor.fileExt,\n protocol\n });\n if (playUrl === '') {\n OVPProviderParser._logger.warn(`failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}.`);\n return null;\n } else {\n mediaSource.url = OVPProviderParser._applyRegexAction(playbackContext, playUrl);\n if (flavor.height && flavor.width) {\n videoSources.push(mediaSource);\n } else {\n audioSources.push(mediaSource);\n }\n }\n });\n }\n //If we have only audio flavors return them, otherwise return video flavors\n return audioSources.length && !videoSources.length ? audioSources : videoSources;\n }\n\n /**\n * Ovp metadata parser\n * @function _parseMetaData\n * @param {KalturaMetadataListResponse} metadataList The metadata list\n * @returns {Object} Parsed metadata\n * @static\n * @private\n */\n static _parseMetadata(metadataList: ?KalturaMetadataListResponse): Object {\n const metadata = {};\n if (metadataList && metadataList.metas && metadataList.metas.length > 0) {\n metadataList.metas.forEach(meta => {\n if (meta.xml) {\n let metaXml: Object;\n const domParser: DOMParser = new DOMParser();\n meta.xml = meta.xml.replace(/\\r?\\n|\\r/g, '');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n metaXml = domParser.parseFromString(meta.xml, 'text/xml');\n const metasObj: Object = XmlParser.xmlToJson(metaXml);\n const metaKeys = Object.keys(metasObj.metadata);\n metaKeys.forEach(key => {\n metadata[key] = metasObj.metadata[key]['#text'];\n });\n }\n });\n }\n return metadata;\n }\n\n /**\n * Returns the base protocol\n * @function _getBaseProtocol\n * @returns {string} - The base protocol\n * @static\n * @private\n */\n static _getBaseProtocol(): string {\n const config = OVPConfiguration.get();\n const protocolRegex = /^https?:/;\n const result = protocolRegex.exec(config.cdnUrl);\n const protocol = result ? result[0] : document.location.protocol;\n if (typeof protocol === 'string') {\n return protocol.slice(0, -1); // remove ':' from the end\n }\n return 'https';\n }\n\n static hasBlockAction(response: OVPMediaEntryLoaderResponse): boolean {\n return response.playBackContextResult.hasBlockAction();\n }\n\n static getBlockAction(response: OVPMediaEntryLoaderResponse): ?KalturaRuleAction {\n return response.playBackContextResult.getBlockAction();\n }\n\n static getErrorMessages(response: OVPMediaEntryLoaderResponse): Array {\n return response.playBackContextResult.getErrorMessages();\n }\n\n /**\n * Applies the request host regex on the url\n * @function _applyRegexAction\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} playUrl - The original url\n * @returns {string} - The request host regex applied url\n * @static\n * @private\n */\n static _applyRegexAction(playbackContext: KalturaPlaybackContext, playUrl: string): string {\n const regexAction = playbackContext.getRequestHostRegexAction();\n if (regexAction) {\n const regex = new RegExp(regexAction.pattern, 'i');\n if (playUrl.match(regex)) {\n return playUrl.replace(regex, regexAction.replacement + '/');\n }\n }\n return playUrl;\n }\n}\n\nexport const addKsToUrl = OVPProviderParser.addKsToUrl;\nexport default OVPProviderParser;\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nconst FIELDS =\n 'id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status';\nconst RESPONSE_PROFILE_TYPE = {\n INCLUDE_FIELDS: 1,\n EXCLUDE_FIELDS: 2\n};\nexport class BaseEntryResponseProfile {\n static Type: {[type: string]: number} = RESPONSE_PROFILE_TYPE;\n /**\n * @member - the response profile type\n * @type {number}\n */\n type: number;\n /**\n * @member - Comma separated fields list to be included or excluded\n * @type {string}\n */\n fields: string;\n\n /**\n * @constructor\n * @param {Object} responseProfile -\n */\n constructor(responseProfile: Object = {}) {\n this.type = responseProfile.type || BaseEntryResponseProfile.Type.INCLUDE_FIELDS;\n this.fields = responseProfile.fields || FIELDS;\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'baseEntry';\n\nexport default class OVPBaseEntryService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for baseentry.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {serviceEntryId} serviceEntryId The entry id from the request result (to support loading by referenceId)\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static getPlaybackContext(serviceUrl: string, ks: string, serviceEntryId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'getPlaybackContext';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'baseEntry-getPlaybackContext';\n const contextDataParams = {objectType: 'KalturaContextDataParams', flavorTags: 'all'};\n request.params = {entryId: serviceEntryId, ks: ks, contextDataParams: contextDataParams};\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for baseentry.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string, redirectFromEntryId: boolean, referenceId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'list';\n request.params = OVPBaseEntryService.getEntryListReqParams(entryId, ks, redirectFromEntryId, referenceId);\n return request;\n }\n\n /**\n * Gets baseentry.list service params\n * @function getEntryListReqParams\n * @param {string} entryId The entry ID\n * @param {string} ks The ks\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {{ks: string, filter: {redirectFromEntryId: string}, responseProfile: {fields: string, type: number}}} The service params object\n * @static\n */\n static getEntryListReqParams(entryId: string, ks: string, redirectFromEntryId: boolean, referenceId: string): any {\n let filterParams = {};\n if (entryId) {\n filterParams = redirectFromEntryId ? {redirectFromEntryId: entryId} : {idEqual: entryId};\n } else if (referenceId) {\n filterParams = {objectType: 'KalturaBaseEntryFilter', referenceIdEqual: referenceId};\n }\n\n return {ks: ks, filter: filterParams, responseProfile: new BaseEntryResponseProfile()};\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'metadata_metadata';\n\nexport default class OVPMetadataService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for metadata_metadata.list\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'metadata_metadata-list';\n const filter = {objectType: 'KalturaMetadataFilter', objectIdEqual: entryId, metadataObjectTypeEqual: '1'};\n request.params = {filter: filter, ks: ks};\n return request;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaBaseEntryListResponse extends ServiceResult {\n /**\n * @member - The total count\n * @type {number}\n */\n totalCount: number;\n /**\n * @member - The entries\n * @type {Array}\n */\n entries: Array;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.entries = [];\n responseObj.objects.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport OVPMetadataService from '../services/meta-data-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaybackContext} from '../response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from '../response-types/kaltura-metadata-list-response';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\nimport {KalturaMediaEntry} from '../response-types/kaltura-media-entry';\n\ntype OVPMediaEntryLoaderResponse = {\n entry: KalturaMediaEntry,\n playBackContextResult: KalturaPlaybackContext,\n metadataListResult: KalturaMetadataListResponse\n};\nexport type {OVPMediaEntryLoaderResponse};\n\nexport default class OVPMediaEntryLoader implements ILoader {\n _entryId: string;\n _referenceId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'media';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n * @boolean {boolean} useExternalCaptions - if we should add captions request to the multirequests.\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entryId = params.entryId;\n this._referenceId = params.referenceId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse = new KalturaBaseEntryListResponse(response[0].data);\n this._response.entry = mediaEntryResponse.entries[0];\n this._response.playBackContextResult = new KalturaPlaybackContext(response[1].data);\n this._response.metadataListResult = new KalturaMetadataListResponse(response[2].data);\n }\n\n get response(): OVPMediaEntryLoaderResponse {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, params.entryId, params.redirectFromEntryId, params.referenceId));\n // Use the entry id from the request result to support loading by referenceId\n const serviceEntryId = params.ks === '{1:result:ks}' ? '{2:result:objects:0:id}' : '{1:result:objects:0:id}';\n requests.push(OVPBaseEntryService.getPlaybackContext(config.serviceUrl, params.ks, serviceEntryId));\n requests.push(OVPMetadataService.list(config.serviceUrl, params.ks, serviceEntryId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entryId || this._referenceId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'session';\n\nexport default class OVPSessionService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} widgetId The widget ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static anonymousSession(serviceUrl: string, widgetId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'startWidgetSession';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'session-startWidget';\n request.params = {widgetId};\n return request;\n }\n}\n","//@flow\nimport OVPSessionService from '../services/session-service';\nimport OVPConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\n\nexport default class OVPSessionLoader implements ILoader {\n _widgetId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'session';\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.ks = response[0].data.ks;\n }\n\n get response(): any {\n return this._response.ks;\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._widgetId = params.widgetId;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n requests.push(OVPSessionService.anonymousSession(config.serviceUrl, params.widgetId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._widgetId;\n }\n}\n","// @flow\nimport DataLoaderManager from '../../common/data-loader-manager';\nimport OVPService from '../services/ovp-service';\n\n/**\n * OTTDataLoaderManager is a class that handles the OVP data loading\n * @param {string} playerVersion - player version\n * @param {string} partnerId - partner id\n * @param {string} ks - ks\n * @param {ProviderNetworkRetryParameters} [networkRetryConfig] - network retry configuration\n */\nexport default class OVPDataLoaderManager extends DataLoaderManager {\n constructor(playerVersion: string, partnerId: number, ks: string = '', networkRetryConfig: ProviderNetworkRetryParameters) {\n super(networkRetryConfig);\n this._multiRequest = OVPService.getMultiRequest(playerVersion, ks, partnerId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'playlist';\n\nexport default class OVPPlaylistService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for playlist.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static execute(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'execute';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-execute`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: new BaseEntryResponseProfile()\n };\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for playlist.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static get(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'get';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-get`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: {\n fields: 'id,name,description,thumbnailUrl',\n type: 1\n }\n };\n return request;\n }\n}\n","//@flow\n\nexport class KalturaPlaylist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n /**\n * @member - playlist poster image\n * @type {string}\n */\n poster: string;\n\n /**\n * @constructor\n * @param {Object} playlist - The json response\n */\n constructor(playlist: Object) {\n this.id = playlist.id;\n this.name = playlist.name;\n this.description = playlist.description;\n this.poster = playlist.thumbnailUrl;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaMediaEntries extends ServiceResult {\n /**\n * @member - The entries\n * @type {Array}\n */\n entries: Array;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.entries = [];\n responseObj.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPPlaylistService from '../services/playlist-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaylist} from '../response-types/kaltura-playlist';\nimport {KalturaMediaEntries} from '../response-types/kaltura-media-entries';\n\nexport default class OVPPlaylistLoader implements ILoader {\n _playlistId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'playlist';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._playlistId = params.playlistId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.playlistData = new KalturaPlaylist(response[0].data);\n this._response.playlistItems = new KalturaMediaEntries(response[1].data);\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n requests.push(OVPPlaylistService.get(config.serviceUrl, params.ks, params.playlistId));\n requests.push(OVPPlaylistService.execute(config.serviceUrl, params.ks, params.playlistId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._playlistId;\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPConfiguration from '../config';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\n\nexport default class OVPEntryListLoader implements ILoader {\n _entries: Array;\n _requests: Array;\n _response: any = {playlistItems: {entries: []}};\n\n static get id(): string {\n return 'entry_list';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entries = params.entries;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse;\n response.forEach(item => {\n mediaEntryResponse = new KalturaBaseEntryListResponse(item.data);\n this._response.playlistItems.entries.push(mediaEntryResponse.entries[0]);\n });\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n params.entries.forEach(entry => {\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, entry.entryId || entry, params.redirectFromEntryId, entry.referenceId));\n });\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entries && this._entries.length);\n }\n}\n","//@flow\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport OVPProviderParser from './provider-parser';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport OVPMediaEntryLoader from './loaders/media-entry-loader';\nimport OVPSessionLoader from './loaders/session-loader';\nimport OVPDataLoaderManager from './loaders/data-loader-manager';\nimport OVPPlaylistLoader from './loaders/playlist-loader';\nimport BaseProvider from '../common/base-provider';\nimport MediaEntry from '../../entities/media-entry';\nimport OVPEntryListLoader from './loaders/entry-list-loader';\nimport Error from '../../util/error/error';\n\nexport default class OVPProvider extends BaseProvider {\n _filterOptionsConfig: ProviderFilterOptionsObject = {redirectFromEntryId: true};\n /**\n * @constructor\n * @param {ProviderOptionsObject} options - provider options\n * @param {string} playerVersion - player version\n */\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n super(options, playerVersion);\n this._logger = getLogger('OVPProvider');\n OVPConfiguration.set(options.env);\n this._setFilterOptionsConfig(options.filterOptions);\n this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);\n }\n\n get env() {\n return OVPConfiguration.get();\n }\n\n /**\n * Gets the backend media config.\n * @param {OVPProviderMediaInfoObject} mediaInfo - ovp media info\n * @returns {Promise} - The provider media config\n */\n getMediaConfig(mediaInfo: OVPProviderMediaInfoObject): Promise {\n if (mediaInfo.ks) {\n this.ks = mediaInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entryId = mediaInfo.entryId;\n const referenceId = mediaInfo.referenceId;\n if (entryId || referenceId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(mediaInfo);\n this._dataLoader.add(OVPMediaEntryLoader, {entryId, ks, redirectFromEntryId, referenceId});\n return this._dataLoader.fetchData().then(\n response => {\n try {\n resolve(this._parseDataFromResponse(response));\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));\n }\n });\n }\n\n doRequest(loaders: Array, ks?: string): Promise {\n let theKs: string = ks || this.ks;\n const dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, theKs, this._networkRetryConfig);\n\n return new Promise((resolve, reject) => {\n if (!theKs) {\n dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n loaders.forEach((loaderRequest: RequestLoader) => {\n dataLoader.add(loaderRequest.loader, loaderRequest.params, theKs || '{1:result:ks}');\n });\n return dataLoader.fetchData().then(\n response => {\n try {\n resolve(response);\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n _getEntryRedirectFilter(mediaInfo: Object): boolean {\n return typeof mediaInfo.redirectFromEntryId === 'boolean'\n ? mediaInfo.redirectFromEntryId\n : typeof this._filterOptionsConfig.redirectFromEntryId === 'boolean'\n ? this._filterOptionsConfig.redirectFromEntryId\n : true;\n }\n\n _setFilterOptionsConfig(options?: ProviderFilterOptionsObject): void {\n if (options && typeof options.redirectFromEntryId == 'boolean') {\n this._filterOptionsConfig.redirectFromEntryId = options.redirectFromEntryId;\n }\n }\n\n _parseDataFromResponse(data: Map): ProviderMediaConfigObject {\n this._logger.debug('Data parsing started');\n const mediaConfig: ProviderMediaConfigObject = {\n session: {\n isAnonymous: this._isAnonymous,\n partnerId: this.partnerId\n },\n sources: this._getDefaultSourcesObject(),\n plugins: {}\n };\n\n if (this.uiConfId) {\n mediaConfig.session.uiConfId = this.uiConfId;\n }\n\n if (data) {\n if (data.has(OVPSessionLoader.id)) {\n const sessionLoader = data.get(OVPSessionLoader.id);\n if (sessionLoader && sessionLoader.response) {\n mediaConfig.session.ks = sessionLoader.response;\n if (this.widgetId !== this.defaultWidgetId) {\n this.ks = mediaConfig.session.ks;\n }\n }\n } else {\n mediaConfig.session.ks = this.ks;\n }\n if (data.has(OVPMediaEntryLoader.id)) {\n const mediaLoader = data.get(OVPMediaEntryLoader.id);\n if (mediaLoader && mediaLoader.response) {\n const response = (mediaLoader: OVPMediaEntryLoader).response;\n if (OVPProviderParser.hasBlockAction(response)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {\n action: OVPProviderParser.getBlockAction(response),\n messages: OVPProviderParser.getErrorMessages(response)\n });\n }\n const mediaEntry = OVPProviderParser.getMediaEntry(this.isAnonymous ? '' : this.ks, this.partnerId, this.uiConfId, response);\n Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));\n this._verifyMediaStatus(mediaEntry);\n this._verifyHasSources(mediaConfig.sources);\n const bumper = OVPProviderParser.getBumper(response, this.isAnonymous ? '' : this.ks, this.partnerId);\n if (bumper) {\n Object.assign(mediaConfig.plugins, {bumper});\n }\n }\n }\n }\n this._logger.debug('Data parsing finished', mediaConfig);\n return mediaConfig;\n }\n\n /**\n * Checks media is ready for playback (not being imported or converted)\n * @param {MediaEntry} mediaEntry - the media entry info\n * @returns {void}\n */\n _verifyMediaStatus(mediaEntry: MediaEntry) {\n if ([KalturaMediaEntry.EntryStatus.IMPORT, KalturaMediaEntry.EntryStatus.PRECONVERT].includes(mediaEntry.status)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MEDIA_STATUS_NOT_READY, {\n messages: `Status of entry id ${mediaEntry.id} is ${mediaEntry.status} and is still being imported or converted`,\n data: {status}\n });\n }\n }\n /**\n * Gets the backend playlist config.\n * @param {ProviderPlaylistInfoObject} playlistInfo - ovp playlist info\n * @returns {Promise} - The provider playlist config\n */\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise {\n if (playlistInfo.ks) {\n this.ks = playlistInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const playlistId = playlistInfo.playlistId;\n if (playlistId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n this._dataLoader.add(OVPPlaylistLoader, {playlistId, ks});\n this._dataLoader.fetchData().then(\n response => {\n resolve(this._parsePlaylistDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parsePlaylistDataFromResponse(data: Map): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPPlaylistLoader.id)) {\n const playlistLoader = data.get(OVPPlaylistLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const playlist = OVPProviderParser.getPlaylist(playlistLoader.response);\n playlistConfig.id = playlist.id;\n playlistConfig.poster = playlist.poster;\n playlistConfig.metadata.name = playlist.name;\n playlistConfig.metadata.description = playlist.description;\n playlist.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n /**\n * Gets playlist config from entry list.\n * @param {ProviderEntryListObject} entryListInfo - ovp entry list info\n * @returns {Promise} - The provider playlist config\n */\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n if (entryListInfo.ks) {\n this.ks = entryListInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entries = entryListInfo.entries;\n if (entries && entries.length) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(entryListInfo);\n this._dataLoader.add(OVPEntryListLoader, {entries, ks, redirectFromEntryId});\n this._dataLoader.fetchData(false).then(\n response => {\n resolve(this._parseEntryListDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parseEntryListDataFromResponse(data: Map): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPEntryListLoader.id)) {\n const playlistLoader = data.get(OVPEntryListLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const entryList = OVPProviderParser.getEntryList(playlistLoader.response);\n entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n _getPlaylistObject(): ProviderPlaylistObject {\n return {\n id: '',\n metadata: {\n name: '',\n description: ''\n },\n poster: '',\n items: []\n };\n }\n\n _getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {\n return {\n hls: [],\n dash: [],\n progressive: [],\n id: '',\n duration: 0,\n type: MediaEntry.Type.UNKNOWN,\n poster: '',\n dvr: false,\n vr: null,\n metadata: {\n name: '',\n description: '',\n tags: ''\n }\n };\n }\n\n _getSourcesObject(mediaEntry: MediaEntry) {\n const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();\n const mediaSources = mediaEntry.sources.toJSON();\n sourcesObject.hls = mediaSources.hls;\n sourcesObject.dash = mediaSources.dash;\n sourcesObject.progressive = mediaSources.progressive;\n sourcesObject.id = mediaEntry.id;\n sourcesObject.duration = mediaEntry.duration;\n sourcesObject.type = mediaEntry.type;\n sourcesObject.dvr = !!mediaEntry.dvrStatus;\n sourcesObject.poster = mediaEntry.poster;\n if (mediaEntry.sources.captions) {\n sourcesObject.captions = mediaEntry.sources.captions;\n }\n if (mediaEntry.metadata && typeof mediaEntry.metadata.tags === 'string' && mediaEntry.metadata.tags.indexOf('360') > -1) {\n sourcesObject.vr = {};\n }\n Object.assign(sourcesObject.metadata, mediaEntry.metadata);\n return sourcesObject;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\n\nexport class KalturaUIConfResponse extends ServiceResult {\n static Type: {[type: string]: number} = {\n PLAYER: 1,\n CONTRIBUTION_WIZARD: 2,\n SIMPLE_EDITOR: 3,\n ADVANCED_EDITOR: 4,\n PLAYLIST: 5,\n APP_STUDIO: 6,\n KRECORD: 7,\n PLAYER_V3: 8,\n KMC_ACCOUNT: 9,\n KMC_ANALYTICS: 10,\n KMC_CONTENT: 11,\n KMC_DASHBOARD: 12,\n KMC_LOGIN: 13,\n PLAYER_SL: 14,\n CLIENTSIDE_ENCODER: 15,\n KMC_GENERAL: 16,\n KMC_ROLES_AND_PERMISSIONS: 17,\n CLIPPER: 18,\n KSR: 19,\n KUPLOAD: 20,\n WEBCASTING: 21\n };\n\n static CreationMode: {[mode: string]: number} = {\n WIZARD: 2,\n ADVANCED: 3\n };\n\n description: string;\n objTypeAsString: string;\n width: number;\n height: number;\n htmlParams: string;\n swfUrl: string;\n confFilePath: string;\n confFile: string;\n confFileFeatures: string;\n name: string;\n config: string;\n confVars: string;\n useCdn: boolean;\n tags: string;\n swfUrlVersion: string;\n created: Date;\n updated: Date;\n html5Url: string;\n version: string;\n partnerTags: string;\n objType: number;\n creationMode: number;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n super(data);\n if (!this.hasError) {\n this.name = data.name;\n this.description = data.description;\n this.objTypeAsString = data.objTypeAsString;\n this.width = data.width;\n this.height = data.height;\n this.htmlParams = data.htmlParams;\n this.swfUrl = data.swfUrl;\n this.confFilePath = data.confFilePath;\n this.confFile = data.confFile;\n this.confFileFeatures = data.confFileFeatures;\n this.config = data.config;\n this.confVars = data.confVars;\n this.useCdn = data.useCdn;\n this.tags = data.tags;\n this.swfUrlVersion = data.swfUrlVersion;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.html5Url = data.description;\n this.version = data.description;\n this.partnerTags = data.description;\n this.objType = data.description;\n this.creationMode = data.description;\n }\n }\n}\n","// @flow\nimport OVPProvider from './provider';\nimport OVPProviderParser from './provider-parser';\nimport RequestBuilder from '../../util/request-builder';\nimport * as ResponseTypes from './response-types';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-ovp';\nconst VERSION = __VERSION__;\n\nexport {OVPProvider as Provider, OVPProviderParser as ProviderParser, NAME, VERSION, RequestBuilder, ResponseTypes};\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./entities/media-entry.js","./providers/./util/request-builder.js","./providers/./util/logger.js","./providers/./k-provider/common/base-service-result.js","./providers/./entities/media-format.js","./providers/./k-provider/common/response-types/kaltura-drm-playback-plugin-data.js","./providers/./k-provider/common/response-types/kaltura-access-control-message.js","./providers/./entities/media-sources.js","./providers/./entities/media-source.js","./providers/./k-provider/common/data-loader-manager.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./entities/drm.js","./providers/./k-provider/common/base-provider.js","./providers/./util/clone.js","./providers/./entities/entry-list.js","./providers/./entities/bumper.js","./providers/./k-provider/ovp/config.js","./providers/./k-provider/ovp/response-types/kaltura-playback-source.js","./providers/./k-provider/ovp/response-types/kaltura-rule-action.js","./providers/./k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.js","./providers/./k-provider/ovp/response-types/kaltura-flavor-asset.js","./providers/./k-provider/ovp/response-types/kaltura-bumper.js","./providers/./k-provider/ovp/response-types/kaltura-playback-context.js","./providers/./k-provider/ovp/response-types/kaltura-metadata.js","./providers/./k-provider/ovp/response-types/kaltura-metadata-list-response.js","./providers/./k-provider/ovp/response-types/kaltura-media-entry.js","./providers/./k-provider/ovp/play-source-url-builder.js","./providers/./util/xml-parser.js","./providers/./entities/playlist.js","./providers/./k-provider/ovp/external-captions-builder.js","./providers/./k-provider/ovp/provider-parser.js","./providers/./k-provider/ovp/services/ovp-service.js","./providers/./k-provider/ovp/request-params/base-entry-response-profile.js","./providers/./k-provider/ovp/services/base-entry-service.js","./providers/./k-provider/ovp/services/meta-data-service.js","./providers/./k-provider/ovp/response-types/kaltura-base-entry-list-response.js","./providers/./k-provider/ovp/loaders/media-entry-loader.js","./providers/./k-provider/ovp/services/session-service.js","./providers/./k-provider/ovp/loaders/session-loader.js","./providers/./k-provider/ovp/loaders/data-loader-manager.js","./providers/./k-provider/ovp/services/playlist-service.js","./providers/./k-provider/ovp/response-types/kaltura-playlist.js","./providers/./k-provider/ovp/response-types/kaltura-media-entries.js","./providers/./k-provider/ovp/loaders/playlist-loader.js","./providers/./k-provider/ovp/loaders/entry-list-loader.js","./providers/./k-provider/ovp/provider.js","./providers/./k-provider/ovp/response-types/kaltura-ui-conf-response.js","./providers/./k-provider/ovp/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","MediaEntry","metadata","Map","sources","MediaSources","type","Type","UNKNOWN","toJSON","id","duration","dvrStatus","status","poster","assetReferenceType","VOD","LIVE","IMAGE","AUDIO","ON","OFF","RequestBuilder","headers","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","JsLogger","VERSION","DEBUG","INFO","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","LogLevel","setLogger","logger","getLogLevel","setLogLevel","level","ServiceResult","objectType","hasError","ServiceError","message","MediaFormat","DASH","mimeType","pathExt","HLS","WVM","MP4","MP3","SupportedStreamFormat","isProgressiveSource","formatName","sourceFormat","KalturaDrmPlaybackPluginData","drm","scheme","licenseURL","certificate","WIDEVINE_CENC","PLAYREADY_CENC","FAIRPLAY","KalturaAccessControlMessage","progressive","dash","hls","map","source","mediaFormat","push","h","MediaSource","mimetype","bandwidth","width","height","label","drmData","length","Array","isArray","DataLoaderManager","networkRetryConfig","_networkRetryConfig","add","loader","ks","execution_loader","isValid","_loaders","set","startIndex","_multiRequest","requests","executionLoaderResponseMap","from","val","index","_loadersResponseMap","fetchData","requestsMustSucceed","execute","then","_multiResponse","prepareData","success","err","loaderDataIndexes","results","slice","MultiRequestBuilder","requestParams","serviceDef","stringify","FAILED_PARSING_REQUEST","multiRequestResult","MultiRequestResult","result","errorResults","serviceResult","Drm","licenseUrl","BaseProvider","options","playerVersion","_partnerId","partnerId","_widgetId","widgetId","_uiConfId","uiConfId","_isAnonymous","_ks","_playerVersion","defaultWidgetId","getMediaConfig","mediaInfo","getPlaylistConfig","playlistInfo","getEntryListConfig","entryListInfo","_verifyHasSources","concat","messages","clone","node","e","keys","EntryList","items","Bumper","clickThroughUrl","defaultConfig","cdnUrl","serviceParams","apiVersion","format","useApiCaptions","OVPConfiguration","clientConfig","KalturaPlaybackSource","deliveryProfileId","protocols","flavorIds","hasDrmData","hasFlavorIds","getProtocol","protocol","returnValue","KalturaRuleAction","DRM_POLICY","BLOCK","PREVIEW","LIMIT_FLAVORS","ADD_TO_STORAGE","LIMIT_DELIVERY_PROFILES","SERVE_FROM_REMOTE_SERVER","REQUEST_HOST_REGEX","LIMIT_THUMBNAIL_CAPTURE","KalturaAccessControlModifyRequestHostRegexAction","pattern","replacement","replacmenServerNodeId","KalturaFlavorAsset","flavorParamsId","fileExt","bitrate","frameRate","isOriginal","isWeb","containerFormat","videoCodecId","language","QUEUED","CONVERTING","READY","DELETED","NOT_APPLICABLE","TEMP","WAIT_FOR_CONVERT","IMPORTING","VALIDATING","EXPORTING","KalturaBumper","entryId","KalturaPlaybackContext","actions","flavorAssets","flavor","bumperData","bumper","hasBlockAction","undefined","getBlockAction","find","getErrorMessages","getRequestHostRegexAction","KalturaMetadata","metadataProfileId","metadataProfileVersion","metadataObjectType","objectId","version","created","Date","setUTCSeconds","createdAt","updated","updatedAt","xml","AD_CUE_POINT","ANNOTATION","CODE_CUE_POINT","THUMB_CUE_POINT","ENTRY","CATEGORY","USER","PARTNER","DYNAMIC_OBJECT","VALID","INVALID","KalturaMetadataListResponse","responseObj","totalCount","metas","objects","meta","KalturaMediaEntry","entry","referenceId","externalSourceType","description","dataUrl","entryType","mediaType","flavorParamsIds","thumbnailUrl","tags","AUTOMATIC","EXTERNAL_MEDIA","MEDIA_CLIP","MIX","PLAYLIST","DATA","LIVE_STREAM","LIVE_CHANNEL","DOCUMENT","VIDEO","LIVE_STREAM_FLASH","LIVE_STREAM_WINDOWS_MEDIA","LIVE_STREAM_REAL_MEDIA","LIVE_STREAM_QUICK_TIME","ERROR_IMPORTING","ERROR_CONVERTING","SCAN_FAILURE","IMPORT","INFECTED","PRECONVERT","PENDING","MODERATE","BLOCKED","NO_CONTENT","PENDING_MODERATION","APPROVED","REJECTED","FLAGGED_FOR_REVIEW","AUTO_APPROVED","PlaySourceUrlBuilder","build","urlParams","config","serviceUrlOrigin","substr","lastIndexOf","extension","isNaN","Number","parseInt","playUrl","endsWith","XmlParser","xmlToJson","obj","nodeType","attributes","j","attribute","item","nodeName","nodeValue","hasChildNodes","childNodes","old","Playlist","KalturaCaptionType","SRT","DFXP","WEBVTT","CAP","CaptionsFormatsMap","ExternalCaptionsBuilder","createConfig","captions","caption","includes","webVttUrl","addKsToUrl","default","isDefault","languageCode","OVPProviderParser","getMediaEntry","mediaEntryResponse","mediaEntry","playbackContext","playBackContextResult","metadataList","metadataListResult","kalturaSources","_getParsedSources","playbackCaptions","_fillBaseData","ksParam","replace","getPlaylist","playlistResponse","playlist","playlistData","playlistItems","entries","getEntryList","entryList","getBumper","assetResponse","progressiveBumper","parsedSources","_parseProgressiveSources","_parseMetadata","_getEntryType","entryTypeEnum","typeEnum","MediaType","EntryType","progressiveSource","mediaSource","addAdaptiveSource","parsedSource","_parseAdaptiveSource","_getBaseProtocol","kalturaSource","_applyRegexAction","drmParams","Scheme","videoSources","audioSources","sourceId","metaXml","domParser","DOMParser","parseFromString","metasObj","exec","document","location","regexAction","regex","RegExp","match","OVPService","getMultiRequest","ovpParams","clientTag","multiReq","BaseEntryResponseProfile","responseProfile","INCLUDE_FIELDS","fields","EXCLUDE_FIELDS","OVPBaseEntryService","getPlaybackContext","serviceEntryId","tag","contextDataParams","flavorTags","list","redirectFromEntryId","getEntryListReqParams","filterParams","idEqual","referenceIdEqual","OVPMetadataService","objectIdEqual","metadataObjectTypeEqual","KalturaBaseEntryListResponse","OVPMediaEntryLoader","buildRequests","_entryId","_referenceId","_requests","_response","OVPSessionService","anonymousSession","OVPSessionLoader","OVPDataLoaderManager","OVPPlaylistService","playlistId","SERVICE_NAME","KalturaPlaylist","KalturaMediaEntries","OVPPlaylistLoader","_playlistId","OVPEntryListLoader","_entries","OVPProvider","env","_setFilterOptionsConfig","filterOptions","networkRetryParameters","_dataLoader","_getEntryRedirectFilter","_parseDataFromResponse","doRequest","loaders","theKs","dataLoader","loaderRequest","_filterOptionsConfig","mediaConfig","session","isAnonymous","_getDefaultSourcesObject","plugins","has","sessionLoader","mediaLoader","_getSourcesObject","_verifyMediaStatus","EntryStatus","_parsePlaylistDataFromResponse","playlistConfig","_getPlaylistObject","playlistLoader","_parseEntryListDataFromResponse","dvr","vr","sourcesObject","mediaSources","KalturaUIConfResponse","objTypeAsString","htmlParams","swfUrl","confFilePath","confFile","confFileFeatures","confVars","useCdn","swfUrlVersion","html5Url","partnerTags","objType","creationMode","PLAYER","CONTRIBUTION_WIZARD","SIMPLE_EDITOR","ADVANCED_EDITOR","APP_STUDIO","KRECORD","PLAYER_V3","KMC_ACCOUNT","KMC_ANALYTICS","KMC_CONTENT","KMC_DASHBOARD","KMC_LOGIN","PLAYER_SL","CLIENTSIDE_ENCODER","KMC_GENERAL","KMC_ROLES_AND_PERMISSIONS","CLIPPER","KSR","KUPLOAD","WEBCASTING","WIZARD","ADVANCED","NAME","__NAME__","__VERSION__"],"mappings":"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","file":"playkit-ovp-provider.js","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[\"ovp\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"providers\"] = root[\"playkit\"][\"providers\"] || {}, root[\"playkit\"][\"providers\"][\"ovp\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport MediaSources from './media-sources';\n\nexport default class MediaEntry {\n static Type: {[type: string]: string} = {\n VOD: 'Vod',\n LIVE: 'Live',\n IMAGE: 'Image',\n AUDIO: 'Audio',\n UNKNOWN: 'Unknown'\n };\n static DvrStatus: {[type: string]: number} = {\n ON: 1,\n OFF: 0\n };\n\n /**\n * @member - entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - entry name\n * @type {string}\n */\n name: string;\n /**\n * @member - entry sources\n * @type {MediaSources}\n */\n sources: MediaSources;\n /**\n * @member - entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - entry type\n * @type {string}\n */\n type: string;\n /**\n * @member - entry metadata\n * @type {Object}\n */\n metadata: Object;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - media status\n * @type {number}\n */\n status: number;\n /**\n * @member - media poster\n * @type {string | Array}\n */\n poster: string | Array;\n\n /**\n * @member - assetReferenceType\n * @type {string }\n */\n assetReferenceType: string;\n\n /**\n * @constructor\n */\n constructor() {\n this.metadata = new Map();\n this.sources = new MediaSources();\n this.type = MediaEntry.Type.UNKNOWN;\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaEntryObject} - The json class object.\n */\n toJSON(): ProviderMediaEntryObject {\n return {\n id: this.id,\n name: this.name,\n sources: this.sources.toJSON(),\n duration: this.duration,\n dvrStatus: this.dvrStatus,\n status: this.status,\n metadata: this.metadata,\n type: this.type,\n poster: this.poster,\n assetReferenceType: this.assetReferenceType\n };\n }\n}\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nexport const MediaFormat: {[name: string]: ProviderMediaFormatType} = {\n DASH: {\n name: 'dash',\n mimeType: 'application/dash+xml',\n pathExt: 'mpd'\n },\n HLS: {\n name: 'hls',\n mimeType: 'application/x-mpegURL',\n pathExt: 'm3u8'\n },\n WVM: {\n name: 'wvm',\n mimeType: 'video/wvm',\n pathExt: 'wvm'\n },\n MP4: {\n name: 'mp4',\n mimeType: 'video/mp4',\n pathExt: 'mp4'\n },\n MP3: {\n name: 'mp3',\n mimeType: 'audio/mpeg',\n pathExt: 'mp3'\n }\n};\n\nexport const SupportedStreamFormat: Map = new Map([\n ['mpegdash', MediaFormat.DASH],\n ['applehttp', MediaFormat.HLS],\n ['url', MediaFormat.MP4]\n]);\n\n/**\n * returns a boolean whether a source is progressive or not\n * @param {string} formatName - the format name\n * @returns {boolean} - if source is progressive or not\n */\nfunction isProgressiveSource(formatName: string): boolean {\n const sourceFormat = SupportedStreamFormat.get(formatName);\n return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;\n}\n\nexport {isProgressiveSource};\n","//@flow\nexport class KalturaDrmPlaybackPluginData {\n static Scheme: {[scheme: string]: string} = {\n 'drm.PLAYREADY_CENC': 'com.microsoft.playready',\n 'drm.WIDEVINE_CENC': 'com.widevine.alpha',\n 'fairplay.FAIRPLAY': 'com.apple.fairplay',\n WIDEVINE_CENC: 'com.widevine.alpha',\n PLAYREADY_CENC: 'com.microsoft.playready',\n FAIRPLAY: 'com.apple.fairplay'\n };\n\n /**\n * @member - The drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - The license URL\n * @type {string}\n */\n licenseURL: string;\n\n /**\n * @member - The drm certificate\n * @type {?string}\n */\n certificate: ?string;\n\n /**\n * @constructor\n * @param {Object} drm The json response\n */\n constructor(drm: any) {\n this.scheme = drm.scheme;\n this.licenseURL = drm.licenseURL;\n this.certificate = drm.certificate;\n }\n}\n","//@flow\nexport class KalturaAccessControlMessage {\n /**\n * @member - The access control message\n * @type {string}\n */\n message: string;\n /**\n * @member - The access control message code\n * @@type {string}\n */\n code: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n this.message = data.message;\n this.code = data.code;\n }\n}\n","// @flow\nimport MediaSource from './media-source';\nimport {MediaFormat} from './media-format';\n\nexport default class MediaSources {\n /**\n * Progressive download media sources container.\n * @type {Array}\n * @public\n */\n progressive: Array;\n /**\n * Dash media sources container.\n * @type {Array}\n * @public\n */\n dash: Array;\n /**\n * Hls media sources container.\n * @type {Array}\n * @public\n */\n hls: Array;\n captions: Array;\n\n /**\n * @constructor\n */\n constructor() {\n this.progressive = [];\n this.dash = [];\n this.hls = [];\n }\n\n /**\n * Maps the source to one of the containers according to his media format.\n * @param {MediaSource} source - The source to add to one of the containers.\n * @param {MediaFormat} mediaFormat - The media format of the source.\n * @returns {void}\n */\n map(source: MediaSource, mediaFormat: ?ProviderMediaFormatType) {\n if (mediaFormat) {\n switch (mediaFormat.name) {\n case MediaFormat.MP4.name:\n this.progressive.push(source);\n break;\n case MediaFormat.DASH.name:\n this.dash.push(source);\n break;\n case MediaFormat.HLS.name:\n this.hls.push(source);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourcesObject} - The json class object.\n */\n toJSON(): ProviderMediaSourcesObject {\n const response: ProviderMediaSourcesObject = {\n progressive: [],\n dash: [],\n hls: []\n };\n this.progressive.forEach(p => response.progressive.push(p.toJSON()));\n this.hls.forEach(h => response.hls.push(h.toJSON()));\n this.dash.forEach(d => response.dash.push(d.toJSON()));\n return response;\n }\n}\n","//@flow\nimport Drm from './drm';\n\nexport default class MediaSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n /**\n * @member - media source drm data\n * @type {Array}\n */\n drmData: Array;\n /**\n * @member - media source bandwidth\n * @type {number}\n */\n bandwidth: number;\n /**\n * @member - media source width\n * @type {number}\n */\n width: number;\n /**\n * @member - media source height\n * @type {number}\n */\n height: number;\n /**\n * @member - media source label\n * @type {string}\n */\n label: string;\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourceObject} - The json class object.\n */\n toJSON(): ProviderMediaSourceObject {\n const response: ProviderMediaSourceObject = {\n id: this.id,\n url: this.url,\n mimetype: this.mimetype\n };\n if (this.bandwidth) response.bandwidth = this.bandwidth;\n if (this.width) response.width = this.width;\n if (this.height) response.height = this.height;\n if (this.label) response.label = this.label;\n if (this.drmData && this.drmData.length > 0) {\n response.drmData = [];\n this.drmData.forEach(d => {\n if (Array.isArray(response.drmData)) {\n response.drmData.push(d.toJSON());\n }\n });\n }\n return response;\n }\n}\n","// @flow\nimport MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';\nimport Error from '../../util/error/error';\n\nexport default class DataLoaderManager {\n /**\n * @member - Loaders response map index\n * @type {Map>}\n * @private\n */\n _loadersResponseMap: Map> = new Map();\n /**\n * @member - Loaders multi request\n * @type {MultiRequestBuilder}\n * @protected\n */\n _multiRequest: MultiRequestBuilder;\n /**\n * @member - Loaders multi response\n * @type {MultiRequestResult}\n * @private\n */\n _multiResponse: MultiRequestResult;\n /**\n * @member - Loaders to execute\n * @type {Map}\n * @private\n */\n _loaders: Map = new Map();\n\n _networkRetryConfig: ProviderNetworkRetryParameters;\n\n constructor(networkRetryConfig: ProviderNetworkRetryParameters) {\n this._networkRetryConfig = networkRetryConfig;\n }\n\n /**\n * Add loader to execution loaders map\n * @function\n * @param {Function} loader Loader to add\n * @param {Object} params Loader params\n * @param {string} ks ks\n * @returns {void}\n */\n add(loader: Function, params: Object, ks?: string): void {\n let execution_loader = new loader(params);\n if (execution_loader.isValid()) {\n this._loaders.set(loader.id, execution_loader);\n // Get the start index from the multiReqeust before adding current execution_loader requests\n let startIndex = this._multiRequest.requests.length;\n // Get the requests\n let requests = execution_loader.requests;\n this._multiRequest.retryConfig = this._networkRetryConfig;\n // Add requests to multiRequest queue\n requests.forEach(request => {\n request.params = request.params || {};\n request.params.ks = request.params.ks || ks;\n this._multiRequest.add(request);\n });\n // Create range array of current execution_loader requests\n let executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);\n // Add to map\n this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);\n }\n }\n\n /**\n * Get data from all loaders using multi request\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @function\n * @returns {Promise} Promise\n */\n fetchData(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n this._multiRequest.execute(requestsMustSucceed).then(\n data => {\n this._multiResponse = data.response;\n let preparedData: Object = this.prepareData(data.response);\n if (preparedData.success) {\n resolve(this._loaders);\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {\n headers: data.headers\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n /**\n * Prepare fetched data\n * @function\n * @param {MultiRequestResult} response - The multi request result\n * @returns {Object} - The prepared data\n */\n prepareData(response: MultiRequestResult): Object {\n this._loaders.forEach((loader, name) => {\n let loaderDataIndexes = this._loadersResponseMap.get(name);\n try {\n if (loaderDataIndexes && loaderDataIndexes.length > 0) {\n loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);\n }\n } catch (err) {\n return {success: false, error: err};\n }\n });\n return {success: true, data: this._loaders};\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n this.results = results;\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nexport default class Drm {\n /**\n * @member - license url\n * @type {string}\n */\n licenseUrl: string;\n /**\n * @member - drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - drm certificate\n * @type {string}\n */\n certificate: string;\n\n /**\n * @constructor\n * @param {string} licenseUrl - the license url\n * @param {string} scheme - the drm scheme\n * @param {?string} certificate - the drm certificate\n */\n constructor(licenseUrl: string, scheme: string, certificate: ?string) {\n this.licenseUrl = licenseUrl;\n this.scheme = scheme;\n if (certificate) {\n this.certificate = certificate;\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderDrmDataObject} - The json class object.\n */\n toJSON(): ProviderDrmDataObject {\n const response: ProviderDrmDataObject = {\n licenseUrl: this.licenseUrl,\n scheme: this.scheme\n };\n if (this.certificate) response.certificate = this.certificate;\n return response;\n }\n}\n","// @flow\nimport {getLogLevel, setLogLevel, setLogger, type LogLevelType, LogLevel} from '../../util/logger';\nimport DataLoaderManager from './data-loader-manager';\nimport Error from '../../util/error/error';\n\nexport default class BaseProvider {\n _partnerId: number;\n _widgetId: ?string;\n _ks: string;\n _uiConfId: ?number;\n _dataLoader: DataLoaderManager;\n _playerVersion: string;\n _logger: any;\n _isAnonymous: boolean;\n _networkRetryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n get partnerId(): number {\n return this._partnerId;\n }\n\n get widgetId(): string {\n return this._widgetId || this.defaultWidgetId;\n }\n\n get defaultWidgetId(): string {\n return '_' + this._partnerId;\n }\n\n get uiConfId(): ?number {\n return this._uiConfId;\n }\n\n get ks(): string {\n return this._ks;\n }\n\n set ks(value: string): void {\n this._ks = value;\n }\n\n get playerVersion(): string {\n return this._playerVersion;\n }\n\n get isAnonymous(): boolean {\n return this._isAnonymous;\n }\n\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n setLogger(options.logger);\n this._partnerId = options.partnerId;\n this._widgetId = options.widgetId;\n this._uiConfId = options.uiConfId;\n this._isAnonymous = !options.ks;\n this._ks = options.ks || '';\n this._playerVersion = playerVersion;\n }\n\n // eslint-disable-next-line no-unused-vars\n getMediaConfig(mediaInfo: MI): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'getMediaConfig method must be implement by the derived class'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading playlist by id'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading entry list'\n })\n );\n }\n\n _verifyHasSources(sources: ProviderMediaConfigSourcesObject) {\n if (sources.hls.concat(sources.dash, sources.progressive).length === 0) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {\n action: '',\n messages: `No play source for entry id: ${sources.id}`\n });\n }\n }\n\n get LogLevel(): LogLevelType {\n return LogLevel;\n }\n\n getLogLevel(name?: string): Object {\n return getLogLevel(name);\n }\n\n setLogLevel(level: Object, name?: string): void {\n setLogLevel(level, name);\n }\n}\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class EntryList {\n /**\n * @member - entry list items\n * @type {Array}\n */\n items: Array;\n\n constructor() {\n this.items = [];\n }\n}\n","//@flow\n\nexport default class Bumper {\n /**\n * @member - bumper url\n * @type {string}\n */\n url: string;\n /**\n * @member - bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n\n /**\n * @constructor\n * @param {Object} data - The bumper response\n */\n constructor(data: Object) {\n this.url = data.url;\n this.clickThroughUrl = data.clickThroughUrl;\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","//@flow\nimport {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';\n\nexport type OVPKalturaPlaybackSource = KalturaPlaybackSource;\n\nexport class KalturaPlaybackSource {\n /**\n * @member - source format according to delivery profile streamer type (applehttp, mpegdash etc.)\n * @type {string}\n */\n format: string;\n /**\n * @member - delivery profile Id\n * @type {string}\n */\n deliveryProfileId: string;\n /**\n * @member - The source URL\n * @type {string}\n */\n url: string;\n /**\n * @member - comma separated string according to deliveryProfile media protocols ('http,https' etc.)\n * @type {string}\n */\n protocols: string;\n /**\n * @member - comma separated string of flavor ids\n * @type {string}\n */\n flavorIds: string;\n /**\n * @member - drm data object containing relevant license url ,scheme name and certificate\n * @type {Array}\n */\n drm: Array = [];\n\n /**\n * @constructor\n * @param {Object} source The response\n */\n constructor(source: Object) {\n this.format = source.format;\n this.deliveryProfileId = source.deliveryProfileId;\n this.url = source.url;\n this.protocols = source.protocols;\n this.flavorIds = source.flavorIds;\n if (source.drm) {\n source.drm.map(drm => this.drm.push(new KalturaDrmPlaybackPluginData(drm)));\n }\n }\n\n /**\n * Checks if source has DRM data\n * @function hasDrmData\n * @returns {boolean} Is source has DRM\n */\n hasDrmData(): boolean {\n return this.drm && this.drm.length > 0;\n }\n\n /**\n * Checks if source has flavor IDs\n * @function hasFlavorIds\n * @returns {boolean} Is source ha flavor IDs\n */\n hasFlavorIds(): boolean {\n return !!this.flavorIds && this.flavorIds.length > 0;\n }\n\n /**\n * Returns source desired protocol if supported\n * @param {string} protocol - the desired protocol for the source (base play url protocol)\n * @returns {string} - protocol if protocol is in the protocols list - if not empty string returned\n */\n getProtocol(protocol: string): string {\n let returnValue: string = '';\n if (this.protocols && this.protocols.length > 0) {\n let protocolsArr: Array = this.protocols.split(',');\n protocolsArr.forEach(p => {\n if (p === protocol) {\n returnValue = p;\n }\n });\n } else if (protocol === 'http') {\n return protocol;\n }\n return returnValue;\n }\n}\n","//@flow\nexport class KalturaRuleAction {\n static Type: {[type: string]: string | number} = {\n DRM_POLICY: 'drm.DRM_POLICY',\n BLOCK: 1,\n PREVIEW: 2,\n LIMIT_FLAVORS: 3,\n ADD_TO_STORAGE: 4,\n LIMIT_DELIVERY_PROFILES: 5,\n SERVE_FROM_REMOTE_SERVER: 6,\n REQUEST_HOST_REGEX: 7,\n LIMIT_THUMBNAIL_CAPTURE: 8\n };\n\n /**\n * @member - The type of the action\n * @type {string|number}\n */\n type: string | number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.type = data.type;\n }\n}\n","//@flow\nimport {KalturaRuleAction} from './kaltura-rule-action';\n\nexport class KalturaAccessControlModifyRequestHostRegexAction extends KalturaRuleAction {\n /**\n * @member - Request host regex pattern\n * @type {string}\n */\n pattern: string;\n /**\n * @member - Request host regex replacement\n * @type {string}\n */\n replacement: string;\n /**\n * @member - serverNodeId to generate replacment host from\n * @type {number}\n */\n replacmenServerNodeId: number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n super(data);\n this.pattern = data.pattern;\n this.replacement = data.replacement;\n this.replacmenServerNodeId = data.replacmenServerNodeId;\n }\n}\n","//@flow\nexport class KalturaFlavorAsset {\n static Status: {[status: string]: number} = {\n ERROR: -1,\n QUEUED: 0,\n CONVERTING: 1,\n READY: 2,\n DELETED: 3,\n NOT_APPLICABLE: 4,\n TEMP: 5,\n WAIT_FOR_CONVERT: 6,\n IMPORTING: 7,\n VALIDATING: 8,\n EXPORTING: 9\n };\n\n /**\n * @member - The ID of the Flavor Asset\n * @type {string}\n */\n id: string;\n /**\n * @member -The Flavor Params used to create this Flavor Asset\n * @type {string}\n */\n flavorParamsId: string;\n /**\n * @member -The file extension\n * @type {string}\n */\n fileExt: string;\n /**\n * @member - The overall bitrate (in KBits) of the Flavor Asset\n * @type {string}\n */\n bitrate: number;\n /**\n * @member - The width of the Flavor Asset\n * @type {number}\n */\n width: number;\n /**\n * @member - The height of the Flavor Asset\n * @type {number}\n */\n height: number;\n /**\n * @member - The frame rate (in FPS) of the Flavor Asset\n * @type {number}\n */\n frameRate: number;\n /**\n * @member - True if this Flavor Asset is the original source\n * @type {number}\n */\n isOriginal: boolean;\n /**\n * @member - True if this Flavor Asset is playable in KDP\n * @type {boolean}\n */\n isWeb: boolean;\n /**\n * @member - The container format\n * @type {boolean}\n */\n containerFormat: string;\n /**\n *@member - The video codec\n * @type {boolean}\n */\n videoCodecId: string;\n /**\n * @member - The status of the Flavor Asset\n * @type {number}\n */\n status: number;\n /**\n * @member - The language of the flavor asset\n * @type {Status}\n */\n language: string;\n /**\n * @member - The label of the flavor asset\n * @type {string}\n */\n label: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: any) {\n this.id = data.id;\n this.flavorParamsId = data.flavorParamsId;\n this.fileExt = data.fileExt;\n this.bitrate = data.bitrate;\n this.width = data.width;\n this.height = data.height;\n this.id = data.id;\n this.frameRate = data.frameRate;\n this.isOriginal = data.isOriginal;\n this.isWeb = data.isWeb;\n this.containerFormat = data.containerFormat;\n this.videoCodecId = data.videoCodecId;\n this.status = data.status;\n this.language = data.language;\n this.label = data.label;\n }\n}\n","//@flow\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\n\nexport class KalturaBumper {\n /**\n * @member - The bumper entry ID\n * @type {string}\n */\n entryId: string;\n /**\n * @member - The bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n /**\n * @member - The bumper sources\n * @type {Array}\n */\n sources: Array;\n\n constructor(data: any) {\n this.entryId = data.entryId;\n this.clickThroughUrl = data.url;\n this.sources = data.sources ? data.sources.map(source => new KalturaPlaybackSource(source)) : [];\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\nimport {KalturaAccessControlModifyRequestHostRegexAction} from './kaltura-access-control-modify-request-host-regex-action';\nimport {KalturaRuleAction} from './kaltura-rule-action';\nimport {KalturaFlavorAsset} from './kaltura-flavor-asset';\nimport {KalturaBumper} from './kaltura-bumper';\n\nexport class KalturaPlaybackContext extends ServiceResult {\n /**\n * @member - The playback sources\n * @type {Array}\n */\n sources: Array = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array}\n */\n actions: Array = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array}\n */\n messages: Array = [];\n /**\n * @member - The flavor assets\n * @type {Array}\n */\n flavorAssets: Array = [];\n /**\n * @member - The bumper data\n * @type {Array}\n */\n bumperData: Array = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n const messages = response.messages;\n if (messages) {\n messages.map(message => this.messages.push(new KalturaAccessControlMessage(message)));\n }\n const actions = response.actions;\n if (actions) {\n actions.map(action => {\n if (action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX) {\n this.actions.push(new KalturaAccessControlModifyRequestHostRegexAction(action));\n } else {\n this.actions.push(new KalturaRuleAction(action));\n }\n });\n }\n const sources = response.sources;\n if (sources) {\n sources.map(source => this.sources.push(new KalturaPlaybackSource(source)));\n }\n const flavorAssets = response.flavorAssets;\n if (flavorAssets) {\n flavorAssets.map(flavor => this.flavorAssets.push(new KalturaFlavorAsset(flavor)));\n }\n const bumperData = response.bumperData;\n if (bumperData) {\n bumperData.map(bumper => this.bumperData.push(new KalturaBumper(bumper)));\n }\n }\n }\n\n hasBlockAction(): boolean {\n return this.getBlockAction() !== undefined;\n }\n\n getBlockAction(): ?KalturaRuleAction {\n return this.actions.find(action => action.type === KalturaRuleAction.Type.BLOCK);\n }\n\n getErrorMessages(): Array {\n return this.messages;\n }\n\n /**\n * Get the KalturaAccessControlModifyRequestHostRegexAction action\n * @function getRequestHostRegexAction\n * @returns {?KalturaAccessControlModifyRequestHostRegexAction} The action\n * */\n getRequestHostRegexAction(): ?KalturaAccessControlModifyRequestHostRegexAction {\n const action = this.actions.find(action => action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX);\n if (action instanceof KalturaAccessControlModifyRequestHostRegexAction) {\n return action;\n }\n }\n}\n","//@flow\nexport class KalturaMetadata {\n static ObjectType: {[type: string]: string | number} = {\n AD_CUE_POINT: 'adCuePointMetadata.AdCuePoint',\n ANNOTATION: 'annotationMetadata.Annotation',\n CODE_CUE_POINT: 'codeCuePointMetadata.CodeCuePoint',\n THUMB_CUE_POINT: 'thumbCuePointMetadata.thumbCuePoint',\n ENTRY: 1,\n CATEGORY: 2,\n USER: 3,\n PARTNER: 4,\n DYNAMIC_OBJECT: 5\n };\n\n static Status: {[status: string]: number} = {\n VALID: 1,\n INVALID: 2,\n DELETED: 3\n };\n\n id: number;\n metadataProfileId: number;\n metadataProfileVersion: number;\n metadataObjectType: string | number;\n objectId: string;\n version: number;\n created: Date;\n updated: Date;\n status: number;\n xml: string;\n\n /**\n * @constructor\n * @param {Object} data The response\n */\n constructor(data: Object) {\n this.id = data.id;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataProfileVersion = data.metadataProfileVersion;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataObjectType = data.metadataObjectType;\n this.objectId = data.objectId;\n this.version = data.version;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.status = data.status;\n this.xml = data.xml;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMetadata} from './kaltura-metadata';\n\nexport class KalturaMetadataListResponse extends ServiceResult {\n totalCount: number;\n metas: Array;\n\n /**\n * @constructor\n * @param {Object} responseObj The response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.metas = [];\n responseObj.objects.map(meta => this.metas.push(new KalturaMetadata(meta)));\n }\n }\n }\n}\n","//@flow\nexport class KalturaMediaEntry {\n static EntryType: {[entryType: string]: {value: number | string}} = {\n AUTOMATIC: {value: -1},\n EXTERNAL_MEDIA: {value: 'externalMedia.externalMedia'},\n MEDIA_CLIP: {value: 1},\n MIX: {value: 2},\n PLAYLIST: {value: 5},\n DATA: {value: 6},\n LIVE_STREAM: {value: 7},\n LIVE_CHANNEL: {value: 8},\n DOCUMENT: {value: 10}\n };\n\n static MediaType: {[mediaType: string]: {value: number}} = {\n VIDEO: {value: 1},\n IMAGE: {value: 2},\n AUDIO: {value: 5},\n LIVE_STREAM_FLASH: {value: 201},\n LIVE_STREAM_WINDOWS_MEDIA: {value: 202},\n LIVE_STREAM_REAL_MEDIA: {value: 203},\n LIVE_STREAM_QUICK_TIME: {value: 204}\n };\n\n static EntryStatus: {[status: string]: string | number} = {\n ERROR_IMPORTING: -2,\n ERROR_CONVERTING: -1,\n SCAN_FAILURE: 'virusScan.ScanFailure',\n IMPORT: 0,\n INFECTED: 'virusScan.Infected',\n PRECONVERT: 1,\n READY: 2,\n DELETED: 3,\n PENDING: 4,\n MODERATE: 5,\n BLOCKED: 6,\n NO_CONTENT: 7\n };\n\n static EntryModerationStatus: {[status: string]: number} = {\n PENDING_MODERATION: 1,\n APPROVED: 2,\n REJECTED: 3,\n FLAGGED_FOR_REVIEW: 4,\n MODERATE: 5,\n AUTO_APPROVED: 6\n };\n\n /**\n * @member - The entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - The entry referenceId\n * @type {string}\n */\n referenceId: string;\n /**\n * @member - The entry externalSourceType\n * @type {string}\n */\n externalSourceType: string;\n /**\n * @member - Entry name (Min 1 chars)\n * @type {string}\n */\n name: string;\n /**\n * @member - Entry description\n * @type {string}\n */\n description: string;\n /**\n * @member - The URL used for playback. This is not the download URL.\n * @type {string}\n */\n dataUrl: string;\n /**\n * @member - Comma separated flavor params ids that exists for this media entry\n * @type {string}\n */\n flavorParamsIds: string;\n /**\n * @member - The entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object\n * @type {string | number}\n */\n type: string | number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object (Image, Audio etc.)\n * @type {number}\n */\n entryType: number;\n /**\n * @member - Entry poster image\n * @type {string}\n */\n poster: string;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - Entry tags\n * @type {string}\n */\n tags: string;\n\n /**\n * @member - Entry status\n * @type {number}\n */\n status: number;\n\n /**\n * @constructor\n * @param {Object} entry The json response\n */\n constructor(entry: Object) {\n this.id = entry.id;\n this.referenceId = entry.referenceId;\n this.externalSourceType = entry.externalSourceType;\n this.name = entry.name;\n this.description = entry.description;\n this.dataUrl = entry.dataUrl;\n this.type = entry.type;\n this.entryType = entry.mediaType;\n this.flavorParamsIds = entry.flavorParamsIds;\n this.duration = entry.duration;\n this.poster = entry.thumbnailUrl;\n this.status = entry.status;\n this.dvrStatus = entry.dvrStatus;\n this.tags = entry.tags;\n }\n}\n","//@flow\nimport OVPConfiguration from './config';\n\ntype urlParamsType = {\n partnerId: number,\n entryId: string,\n ks: string,\n uiConfId: ?number,\n format: string,\n protocol: string,\n extension: string,\n flavorIds: ?string\n};\n\nexport default class PlaySourceUrlBuilder {\n /**\n * Returns source url by given url params\n * @function build\n * @param {urlParamsType} urlParams The params\n * @returns {string} The URL\n * @static\n */\n static build(urlParams: urlParamsType): string {\n const config = OVPConfiguration.get();\n const serviceUrlOrigin: string = config.serviceUrl.substr(0, config.serviceUrl.lastIndexOf('/'));\n const {partnerId, entryId, ks, uiConfId, format, protocol, extension, flavorIds} = urlParams;\n\n //verify mandatory params\n //$FlowFixMe\n if (!serviceUrlOrigin || isNaN(Number.parseInt(partnerId)) || !entryId || !format || !protocol) {\n return '';\n }\n\n let playUrl = serviceUrlOrigin;\n if (!serviceUrlOrigin.endsWith('/')) {\n playUrl += '/';\n }\n playUrl += 'p/' + partnerId + '/sp/' + partnerId + '00' + '/playManifest/entryId/' + entryId + '/protocol/' + protocol + '/format/' + format;\n\n if (flavorIds) {\n playUrl += '/flavorIds/' + flavorIds;\n } else if (uiConfId) {\n playUrl += '/uiConfId/' + uiConfId;\n }\n\n if (ks !== '') {\n playUrl += '/ks/' + ks;\n }\n\n if (extension !== '') {\n playUrl += '/a.' + extension;\n }\n\n if (uiConfId && flavorIds !== '') {\n playUrl += '?uiConfId=' + uiConfId;\n }\n\n return playUrl;\n }\n}\n","//@flow\nexport default class XmlParser {\n /**\n * Parses xml string to json object\n * @param {string} xml The xml to parse\n * @returns {{}} The parsed xml as Json object\n * @static\n */\n static xmlToJson(xml: Object) {\n let obj = {};\n if (xml.nodeType === 1) {\n if (xml.attributes.length > 0) {\n obj['@attributes'] = {};\n for (let j = 0; j < xml.attributes.length; j++) {\n let attribute = xml.attributes.item(j);\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\n }\n }\n } else if (xml.nodeType === 3) {\n obj = xml.nodeValue;\n }\n if (xml.hasChildNodes()) {\n for (let i = 0; i < xml.childNodes.length; i++) {\n let item = xml.childNodes.item(i);\n let nodeName = item.nodeName;\n if (typeof obj[nodeName] === 'undefined') {\n obj[nodeName] = this.xmlToJson(item);\n } else {\n if (typeof obj[nodeName].push === 'undefined') {\n let old = obj[nodeName];\n obj[nodeName] = [];\n obj[nodeName].push(old);\n }\n obj[nodeName].push(this.xmlToJson(item));\n }\n }\n }\n return obj;\n }\n}\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class Playlist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n\n /**\n * @member - playlist poster\n * @type {string}\n */\n poster: string;\n\n /**\n * @member - playlist items\n * @type {Array}\n */\n items: Array;\n\n constructor() {\n this.items = [];\n }\n}\n","// @flow\n\nimport {addKsToUrl} from './provider-parser';\n\nconst KalturaCaptionType: CaptionType = {\n SRT: '1',\n DFXP: '2',\n WEBVTT: '3',\n CAP: '4'\n};\n\nconst CaptionsFormatsMap: {[format: string]: string} = {\n '3': 'vtt',\n '1': 'srt'\n};\n\nclass ExternalCaptionsBuilder {\n static createConfig(captions: Array, ks: string): Array {\n return captions.map(caption => {\n let url = caption.url;\n let type = CaptionsFormatsMap[caption.format];\n if ([KalturaCaptionType.DFXP, KalturaCaptionType.CAP].includes(caption.format)) {\n url = caption.webVttUrl;\n type = CaptionsFormatsMap[KalturaCaptionType.WEBVTT];\n }\n url = addKsToUrl(url, ks);\n return {\n default: !!caption.isDefault,\n type: type,\n language: caption.languageCode,\n label: caption.label,\n url: url\n };\n });\n }\n}\n\nexport {ExternalCaptionsBuilder};\n","//@flow\nimport {KalturaPlaybackContext} from './response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from './response-types/kaltura-metadata-list-response';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport {KalturaPlaybackSource} from './response-types/kaltura-playback-source';\nimport {KalturaBumper} from './response-types/kaltura-bumper';\nimport {KalturaDrmPlaybackPluginData} from '../common/response-types/kaltura-drm-playback-plugin-data';\nimport PlaySourceUrlBuilder from './play-source-url-builder';\nimport XmlParser from '../../util/xml-parser';\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport MediaEntry from '../../entities/media-entry';\nimport Drm from '../../entities/drm';\nimport MediaSource from '../../entities/media-source';\nimport MediaSources from '../../entities/media-sources';\nimport {SupportedStreamFormat, isProgressiveSource} from '../../entities/media-format';\nimport Playlist from '../../entities/playlist';\nimport EntryList from '../../entities/entry-list';\nimport Bumper from '../../entities/bumper';\nimport {KalturaRuleAction} from './response-types/kaltura-rule-action';\nimport {KalturaAccessControlMessage} from '../common/response-types/kaltura-access-control-message';\nimport type {OVPMediaEntryLoaderResponse} from './loaders/media-entry-loader';\nimport {ExternalCaptionsBuilder} from './external-captions-builder';\n\nclass OVPProviderParser {\n static _logger = getLogger('OVPProviderParser');\n\n /**\n * Returns parsed media entry by given OVP response objects\n * @function getMediaEntry\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {any} mediaEntryResponse - The media entry response\n * @returns {MediaEntry} - The media entry\n * @static\n * @public\n */\n static getMediaEntry(ks: string, partnerId: number, uiConfId: ?number, mediaEntryResponse: any): MediaEntry {\n const mediaEntry = new MediaEntry();\n const entry = mediaEntryResponse.entry;\n const playbackContext = mediaEntryResponse.playBackContextResult;\n const metadataList = mediaEntryResponse.metadataListResult;\n const kalturaSources = playbackContext.sources;\n\n mediaEntry.sources = OVPProviderParser._getParsedSources(kalturaSources, ks, partnerId, uiConfId, entry, playbackContext);\n if (OVPConfiguration.get().useApiCaptions && playbackContext.data.playbackCaptions) {\n mediaEntry.sources.captions = ExternalCaptionsBuilder.createConfig(playbackContext.data.playbackCaptions, ks);\n }\n OVPProviderParser._fillBaseData(mediaEntry, entry, metadataList);\n return mediaEntry;\n }\n\n /**\n * Returns the url with KS\n * @function addKsToUrl\n * @param {String} url - The url to add the KS\n * @param {string} ks - The ks\n * @returns {string} - The url with KS\n * @static\n * @public\n */\n static addKsToUrl(url: string, ks: string): string {\n const hasUrlExtension = path => {\n const pathWithoutQuery = path.split('?')[0];\n const pathAfterLastSlash = pathWithoutQuery.replace(/^.*[\\\\/]/, '');\n return pathAfterLastSlash.indexOf('.') !== -1;\n };\n let ksParam;\n if (ks) {\n if (hasUrlExtension(url)) {\n ksParam = url.indexOf('?') === -1 ? '?ks=' : '&ks=';\n } else {\n ksParam = '/ks/';\n }\n return url + ksParam + ks;\n }\n return url;\n }\n\n /**\n * Returns parsed playlist by given OVP response objects\n * @function getPlaylist\n * @param {any} playlistResponse - The playlist response\n * @returns {Playlist} - The playlist\n * @static\n * @public\n */\n static getPlaylist(playlistResponse: any): Playlist {\n const playlist = new Playlist();\n const playlistData = playlistResponse.playlistData;\n const playlistItems = playlistResponse.playlistItems.entries;\n playlist.id = playlistData.id;\n playlist.name = playlistData.name;\n playlist.description = playlistData.description;\n playlist.poster = playlistData.poster;\n playlistItems.forEach((entry: KalturaMediaEntry) => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n playlist.items.push(mediaEntry);\n });\n return playlist;\n }\n\n /**\n * Returns parsed entry list by given OVP response objects\n * @function getEntryList\n * @param {any} playlistResponse - response\n * @returns {Playlist} - The entry list\n * @static\n * @public\n */\n static getEntryList(playlistResponse: any): EntryList {\n const entryList = new EntryList();\n const playlistItems = playlistResponse.playlistItems.entries;\n playlistItems.forEach(entry => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n entryList.items.push(mediaEntry);\n });\n return entryList;\n }\n\n /**\n * Returns parsed bumper by given OTT response objects.\n * @function getBumper\n * @param {any} assetResponse - The asset response.\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @returns {?Bumper} - The bumper\n * @static\n * @public\n */\n static getBumper(assetResponse: any, ks: string, partnerId: number): ?Bumper {\n const playbackContext = assetResponse.playBackContextResult;\n const bumperData: KalturaBumper = playbackContext.bumperData[0];\n if (bumperData) {\n const bumperSources = bumperData && bumperData.sources;\n const progressiveBumper = bumperSources.find(bumper => isProgressiveSource(bumper.format));\n if (progressiveBumper) {\n const parsedSources = OVPProviderParser._parseProgressiveSources(progressiveBumper, playbackContext, ks, partnerId, 0, bumperData.entryId);\n if (parsedSources[0]) {\n return new Bumper({url: parsedSources[0].url, clickThroughUrl: bumperData.clickThroughUrl});\n }\n }\n }\n }\n\n static _fillBaseData(mediaEntry: MediaEntry, entry: KalturaMediaEntry, metadataList: ?KalturaMetadataListResponse) {\n mediaEntry.poster = entry.poster;\n mediaEntry.id = entry.id;\n mediaEntry.duration = entry.duration;\n mediaEntry.metadata = OVPProviderParser._parseMetadata(metadataList);\n mediaEntry.metadata.description = entry.description || '';\n mediaEntry.metadata.name = entry.name || '';\n mediaEntry.metadata.tags = entry.tags || '';\n mediaEntry.status = entry.status;\n\n mediaEntry.type = OVPProviderParser._getEntryType(entry.entryType, entry.type);\n if (mediaEntry.type === MediaEntry.Type.LIVE) {\n mediaEntry.dvrStatus = entry.dvrStatus;\n }\n\n return mediaEntry;\n }\n\n static _getEntryType(entryTypeEnum: number, typeEnum: number | string): string {\n let type = MediaEntry.Type.UNKNOWN;\n switch (entryTypeEnum) {\n case KalturaMediaEntry.MediaType.IMAGE.value:\n type = MediaEntry.Type.IMAGE;\n break;\n case KalturaMediaEntry.MediaType.AUDIO.value:\n type = MediaEntry.Type.AUDIO;\n break;\n default:\n switch (typeEnum) {\n case KalturaMediaEntry.EntryType.MEDIA_CLIP.value:\n type = MediaEntry.Type.VOD;\n break;\n case KalturaMediaEntry.EntryType.LIVE_STREAM.value:\n case KalturaMediaEntry.EntryType.LIVE_CHANNEL.value:\n type = MediaEntry.Type.LIVE;\n break;\n default:\n type = MediaEntry.Type.UNKNOWN;\n }\n }\n return type;\n }\n\n /**\n * Returns the parsed sources\n * @function _getParsedSources\n * @param {Array} kalturaSources - The kaltura sources\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {Object} entry - The entry\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @return {MediaSources} - A media sources\n * @static\n * @private\n */\n static _getParsedSources(\n kalturaSources: Array,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entry: Object,\n playbackContext: KalturaPlaybackContext\n ): MediaSources {\n const sources = new MediaSources();\n const addAdaptiveSource = (source: KalturaPlaybackSource) => {\n const parsedSource = OVPProviderParser._parseAdaptiveSource(source, playbackContext, ks, partnerId, uiConfId, entry.id);\n if (parsedSource) {\n const sourceFormat = SupportedStreamFormat.get(source.format);\n sources.map(parsedSource, sourceFormat);\n }\n };\n const parseAdaptiveSources = () => {\n kalturaSources.filter(source => !isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n const parseProgressiveSources = () => {\n const progressiveSource = kalturaSources.find(source => {\n //match progressive source with supported protocol(http/s)\n return isProgressiveSource(source.format) && source.getProtocol(OVPProviderParser._getBaseProtocol()) !== '';\n });\n sources.progressive = OVPProviderParser._parseProgressiveSources(progressiveSource, playbackContext, ks, partnerId, uiConfId, entry.id);\n };\n\n const parseExternalMedia = () => {\n const mediaSource = new MediaSource();\n mediaSource.mimetype = 'video/youtube';\n mediaSource.url = entry.referenceId;\n mediaSource.id = entry.id + '_youtube';\n sources.progressive.push(mediaSource);\n };\n\n if (entry.type === KalturaMediaEntry.EntryType.EXTERNAL_MEDIA.value) {\n parseExternalMedia();\n } else if (kalturaSources && kalturaSources.length > 0) {\n parseAdaptiveSources();\n parseProgressiveSources();\n }\n return sources;\n }\n\n /**\n * Returns a parsed adaptive source\n * @function _parseAdaptiveSource\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {?MediaSource} - The parsed adaptive kalturaSource\n * @static\n * @private\n */\n static _parseAdaptiveSource(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): ?MediaSource {\n const mediaSource: MediaSource = new MediaSource();\n if (kalturaSource) {\n let playUrl: string = '';\n const mediaFormat = SupportedStreamFormat.get(kalturaSource.format);\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const format = kalturaSource.format;\n let extension: string = '';\n if (mediaFormat) {\n extension = mediaFormat.pathExt;\n mediaSource.mimetype = mediaFormat.mimeType;\n }\n // in case playbackSource doesn't have flavors we don't need to build the url and we'll use the provided one.\n if (kalturaSource.hasFlavorIds()) {\n if (!extension && playbackContext.flavorAssets && playbackContext.flavorAssets.length > 0) {\n extension = playbackContext.flavorAssets[0].fileExt;\n }\n playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: kalturaSource.flavorIds,\n format,\n ks,\n partnerId,\n uiConfId,\n extension,\n protocol\n });\n } else {\n playUrl = OVPProviderParser.addKsToUrl(kalturaSource.url, ks);\n }\n if (!playUrl) {\n const message = `failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}`;\n OVPProviderParser._logger.warn(message);\n return null;\n }\n mediaSource.url = OVPProviderParser._applyRegexAction(playbackContext, playUrl);\n mediaSource.id = entryId + '_' + deliveryProfileId + ',' + format;\n if (kalturaSource.hasDrmData()) {\n const drmParams: Array = [];\n kalturaSource.drm.forEach(drm => {\n drmParams.push(new Drm(drm.licenseURL, KalturaDrmPlaybackPluginData.Scheme[drm.scheme], drm.certificate));\n });\n mediaSource.drmData = drmParams;\n }\n }\n return mediaSource;\n }\n\n /**\n * Returns parsed progressive sources\n * @function _parseProgressiveSources\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {Array} - The parsed progressive kalturaSources\n * @static\n * @private\n */\n static _parseProgressiveSources(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): Array {\n const videoSources: Array = [];\n const audioSources: Array = [];\n if (kalturaSource) {\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const format = kalturaSource.format;\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const sourceId = deliveryProfileId + ',' + format;\n playbackContext.flavorAssets.map(flavor => {\n const mediaSource: MediaSource = new MediaSource();\n mediaSource.id = flavor.id + sourceId;\n mediaSource.mimetype = flavor.fileExt === 'mp3' ? 'audio/mp3' : 'video/mp4';\n mediaSource.height = flavor.height;\n mediaSource.width = flavor.width;\n mediaSource.bandwidth = flavor.bitrate * 1024;\n mediaSource.label = flavor.label || flavor.language;\n const playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: flavor.id,\n format,\n ks,\n partnerId: partnerId,\n uiConfId: uiConfId,\n extension: flavor.fileExt,\n protocol\n });\n if (playUrl === '') {\n OVPProviderParser._logger.warn(`failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}.`);\n return null;\n } else {\n mediaSource.url = OVPProviderParser._applyRegexAction(playbackContext, playUrl);\n if (flavor.height && flavor.width) {\n videoSources.push(mediaSource);\n } else {\n audioSources.push(mediaSource);\n }\n }\n });\n }\n //If we have only audio flavors return them, otherwise return video flavors\n return audioSources.length && !videoSources.length ? audioSources : videoSources;\n }\n\n /**\n * Ovp metadata parser\n * @function _parseMetaData\n * @param {KalturaMetadataListResponse} metadataList The metadata list\n * @returns {Object} Parsed metadata\n * @static\n * @private\n */\n static _parseMetadata(metadataList: ?KalturaMetadataListResponse): Object {\n const metadata = {};\n if (metadataList && metadataList.metas && metadataList.metas.length > 0) {\n metadataList.metas.forEach(meta => {\n if (meta.xml) {\n let metaXml: Object;\n const domParser: DOMParser = new DOMParser();\n meta.xml = meta.xml.replace(/\\r?\\n|\\r/g, '');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n metaXml = domParser.parseFromString(meta.xml, 'text/xml');\n const metasObj: Object = XmlParser.xmlToJson(metaXml);\n const metaKeys = Object.keys(metasObj.metadata);\n metaKeys.forEach(key => {\n metadata[key] = metasObj.metadata[key]['#text'];\n });\n }\n });\n }\n return metadata;\n }\n\n /**\n * Returns the base protocol\n * @function _getBaseProtocol\n * @returns {string} - The base protocol\n * @static\n * @private\n */\n static _getBaseProtocol(): string {\n const config = OVPConfiguration.get();\n const protocolRegex = /^https?:/;\n const result = protocolRegex.exec(config.cdnUrl);\n const protocol = result ? result[0] : document.location.protocol;\n if (typeof protocol === 'string') {\n return protocol.slice(0, -1); // remove ':' from the end\n }\n return 'https';\n }\n\n static hasBlockAction(response: OVPMediaEntryLoaderResponse): boolean {\n return response.playBackContextResult.hasBlockAction();\n }\n\n static getBlockAction(response: OVPMediaEntryLoaderResponse): ?KalturaRuleAction {\n return response.playBackContextResult.getBlockAction();\n }\n\n static getErrorMessages(response: OVPMediaEntryLoaderResponse): Array {\n return response.playBackContextResult.getErrorMessages();\n }\n\n /**\n * Applies the request host regex on the url\n * @function _applyRegexAction\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} playUrl - The original url\n * @returns {string} - The request host regex applied url\n * @static\n * @private\n */\n static _applyRegexAction(playbackContext: KalturaPlaybackContext, playUrl: string): string {\n const regexAction = playbackContext.getRequestHostRegexAction();\n if (regexAction) {\n const regex = new RegExp(regexAction.pattern, 'i');\n if (playUrl.match(regex)) {\n return playUrl.replace(regex, regexAction.replacement + '/');\n }\n }\n return playUrl;\n }\n}\n\nexport const addKsToUrl = OVPProviderParser.addKsToUrl;\nexport default OVPProviderParser;\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nconst FIELDS =\n 'id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status';\nconst RESPONSE_PROFILE_TYPE = {\n INCLUDE_FIELDS: 1,\n EXCLUDE_FIELDS: 2\n};\nexport class BaseEntryResponseProfile {\n static Type: {[type: string]: number} = RESPONSE_PROFILE_TYPE;\n /**\n * @member - the response profile type\n * @type {number}\n */\n type: number;\n /**\n * @member - Comma separated fields list to be included or excluded\n * @type {string}\n */\n fields: string;\n\n /**\n * @constructor\n * @param {Object} responseProfile -\n */\n constructor(responseProfile: Object = {}) {\n this.type = responseProfile.type || BaseEntryResponseProfile.Type.INCLUDE_FIELDS;\n this.fields = responseProfile.fields || FIELDS;\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'baseEntry';\n\nexport default class OVPBaseEntryService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for baseentry.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {serviceEntryId} serviceEntryId The entry id from the request result (to support loading by referenceId)\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static getPlaybackContext(serviceUrl: string, ks: string, serviceEntryId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'getPlaybackContext';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'baseEntry-getPlaybackContext';\n const contextDataParams = {objectType: 'KalturaContextDataParams', flavorTags: 'all'};\n request.params = {entryId: serviceEntryId, ks: ks, contextDataParams: contextDataParams};\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for baseentry.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string, redirectFromEntryId: boolean, referenceId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'list';\n request.params = OVPBaseEntryService.getEntryListReqParams(entryId, ks, redirectFromEntryId, referenceId);\n return request;\n }\n\n /**\n * Gets baseentry.list service params\n * @function getEntryListReqParams\n * @param {string} entryId The entry ID\n * @param {string} ks The ks\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {{ks: string, filter: {redirectFromEntryId: string}, responseProfile: {fields: string, type: number}}} The service params object\n * @static\n */\n static getEntryListReqParams(entryId: string, ks: string, redirectFromEntryId: boolean, referenceId: string): any {\n let filterParams = {};\n if (entryId) {\n filterParams = redirectFromEntryId ? {redirectFromEntryId: entryId} : {idEqual: entryId};\n } else if (referenceId) {\n filterParams = {objectType: 'KalturaBaseEntryFilter', referenceIdEqual: referenceId};\n }\n\n return {ks: ks, filter: filterParams, responseProfile: new BaseEntryResponseProfile()};\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'metadata_metadata';\n\nexport default class OVPMetadataService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for metadata_metadata.list\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'metadata_metadata-list';\n const filter = {objectType: 'KalturaMetadataFilter', objectIdEqual: entryId, metadataObjectTypeEqual: '1'};\n request.params = {filter: filter, ks: ks};\n return request;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaBaseEntryListResponse extends ServiceResult {\n /**\n * @member - The total count\n * @type {number}\n */\n totalCount: number;\n /**\n * @member - The entries\n * @type {Array}\n */\n entries: Array;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.entries = [];\n responseObj.objects.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport OVPMetadataService from '../services/meta-data-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaybackContext} from '../response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from '../response-types/kaltura-metadata-list-response';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\nimport {KalturaMediaEntry} from '../response-types/kaltura-media-entry';\n\ntype OVPMediaEntryLoaderResponse = {\n entry: KalturaMediaEntry,\n playBackContextResult: KalturaPlaybackContext,\n metadataListResult: KalturaMetadataListResponse\n};\nexport type {OVPMediaEntryLoaderResponse};\n\nexport default class OVPMediaEntryLoader implements ILoader {\n _entryId: string;\n _referenceId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'media';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n * @boolean {boolean} useExternalCaptions - if we should add captions request to the multirequests.\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entryId = params.entryId;\n this._referenceId = params.referenceId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse = new KalturaBaseEntryListResponse(response[0].data);\n this._response.entry = mediaEntryResponse.entries[0];\n this._response.playBackContextResult = new KalturaPlaybackContext(response[1].data);\n this._response.metadataListResult = new KalturaMetadataListResponse(response[2].data);\n }\n\n get response(): OVPMediaEntryLoaderResponse {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, params.entryId, params.redirectFromEntryId, params.referenceId));\n // Use the entry id from the request result to support loading by referenceId\n const serviceEntryId = params.ks === '{1:result:ks}' ? '{2:result:objects:0:id}' : '{1:result:objects:0:id}';\n requests.push(OVPBaseEntryService.getPlaybackContext(config.serviceUrl, params.ks, serviceEntryId));\n requests.push(OVPMetadataService.list(config.serviceUrl, params.ks, serviceEntryId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entryId || this._referenceId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'session';\n\nexport default class OVPSessionService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} widgetId The widget ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static anonymousSession(serviceUrl: string, widgetId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'startWidgetSession';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'session-startWidget';\n request.params = {widgetId};\n return request;\n }\n}\n","//@flow\nimport OVPSessionService from '../services/session-service';\nimport OVPConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\n\nexport default class OVPSessionLoader implements ILoader {\n _widgetId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'session';\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.ks = response[0].data.ks;\n }\n\n get response(): any {\n return this._response.ks;\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._widgetId = params.widgetId;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n requests.push(OVPSessionService.anonymousSession(config.serviceUrl, params.widgetId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._widgetId;\n }\n}\n","// @flow\nimport DataLoaderManager from '../../common/data-loader-manager';\nimport OVPService from '../services/ovp-service';\n\n/**\n * OTTDataLoaderManager is a class that handles the OVP data loading\n * @param {string} playerVersion - player version\n * @param {string} partnerId - partner id\n * @param {string} ks - ks\n * @param {ProviderNetworkRetryParameters} [networkRetryConfig] - network retry configuration\n */\nexport default class OVPDataLoaderManager extends DataLoaderManager {\n constructor(playerVersion: string, partnerId: number, ks: string = '', networkRetryConfig: ProviderNetworkRetryParameters) {\n super(networkRetryConfig);\n this._multiRequest = OVPService.getMultiRequest(playerVersion, ks, partnerId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'playlist';\n\nexport default class OVPPlaylistService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for playlist.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static execute(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'execute';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-execute`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: new BaseEntryResponseProfile()\n };\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for playlist.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static get(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'get';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-get`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: {\n fields: 'id,name,description,thumbnailUrl',\n type: 1\n }\n };\n return request;\n }\n}\n","//@flow\n\nexport class KalturaPlaylist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n /**\n * @member - playlist poster image\n * @type {string}\n */\n poster: string;\n\n /**\n * @constructor\n * @param {Object} playlist - The json response\n */\n constructor(playlist: Object) {\n this.id = playlist.id;\n this.name = playlist.name;\n this.description = playlist.description;\n this.poster = playlist.thumbnailUrl;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaMediaEntries extends ServiceResult {\n /**\n * @member - The entries\n * @type {Array}\n */\n entries: Array;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.entries = [];\n responseObj.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPPlaylistService from '../services/playlist-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaylist} from '../response-types/kaltura-playlist';\nimport {KalturaMediaEntries} from '../response-types/kaltura-media-entries';\n\nexport default class OVPPlaylistLoader implements ILoader {\n _playlistId: string;\n _requests: Array;\n _response: any = {};\n\n static get id(): string {\n return 'playlist';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._playlistId = params.playlistId;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.playlistData = new KalturaPlaylist(response[0].data);\n this._response.playlistItems = new KalturaMediaEntries(response[1].data);\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n requests.push(OVPPlaylistService.get(config.serviceUrl, params.ks, params.playlistId));\n requests.push(OVPPlaylistService.execute(config.serviceUrl, params.ks, params.playlistId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._playlistId;\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPConfiguration from '../config';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\n\nexport default class OVPEntryListLoader implements ILoader {\n _entries: Array;\n _requests: Array;\n _response: any = {playlistItems: {entries: []}};\n\n static get id(): string {\n return 'entry_list';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entries = params.entries;\n }\n\n set requests(requests: Array) {\n this._requests = requests;\n }\n\n get requests(): Array {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse;\n response.forEach(item => {\n mediaEntryResponse = new KalturaBaseEntryListResponse(item.data);\n this._response.playlistItems.entries.push(mediaEntryResponse.entries[0]);\n });\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array {\n const config = OVPConfiguration.get();\n const requests: Array = [];\n params.entries.forEach(entry => {\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, entry.entryId || entry, params.redirectFromEntryId, entry.referenceId));\n });\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entries && this._entries.length);\n }\n}\n","//@flow\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport OVPProviderParser from './provider-parser';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport OVPMediaEntryLoader from './loaders/media-entry-loader';\nimport OVPSessionLoader from './loaders/session-loader';\nimport OVPDataLoaderManager from './loaders/data-loader-manager';\nimport OVPPlaylistLoader from './loaders/playlist-loader';\nimport BaseProvider from '../common/base-provider';\nimport MediaEntry from '../../entities/media-entry';\nimport OVPEntryListLoader from './loaders/entry-list-loader';\nimport Error from '../../util/error/error';\n\nexport default class OVPProvider extends BaseProvider {\n _filterOptionsConfig: ProviderFilterOptionsObject = {redirectFromEntryId: true};\n /**\n * @constructor\n * @param {ProviderOptionsObject} options - provider options\n * @param {string} playerVersion - player version\n */\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n super(options, playerVersion);\n this._logger = getLogger('OVPProvider');\n OVPConfiguration.set(options.env);\n this._setFilterOptionsConfig(options.filterOptions);\n this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);\n }\n\n get env() {\n return OVPConfiguration.get();\n }\n\n /**\n * Gets the backend media config.\n * @param {OVPProviderMediaInfoObject} mediaInfo - ovp media info\n * @returns {Promise} - The provider media config\n */\n getMediaConfig(mediaInfo: OVPProviderMediaInfoObject): Promise {\n if (mediaInfo.ks) {\n this.ks = mediaInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entryId = mediaInfo.entryId;\n const referenceId = mediaInfo.referenceId;\n if (entryId || referenceId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(mediaInfo);\n this._dataLoader.add(OVPMediaEntryLoader, {entryId, ks, redirectFromEntryId, referenceId});\n return this._dataLoader.fetchData().then(\n response => {\n try {\n resolve(this._parseDataFromResponse(response));\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));\n }\n });\n }\n\n doRequest(loaders: Array, ks?: string): Promise {\n let theKs: string = ks || this.ks;\n const dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, theKs, this._networkRetryConfig);\n\n return new Promise((resolve, reject) => {\n if (!theKs) {\n dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n loaders.forEach((loaderRequest: RequestLoader) => {\n dataLoader.add(loaderRequest.loader, loaderRequest.params, theKs || '{1:result:ks}');\n });\n return dataLoader.fetchData().then(\n response => {\n try {\n resolve(response);\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n _getEntryRedirectFilter(mediaInfo: Object): boolean {\n return typeof mediaInfo.redirectFromEntryId === 'boolean'\n ? mediaInfo.redirectFromEntryId\n : typeof this._filterOptionsConfig.redirectFromEntryId === 'boolean'\n ? this._filterOptionsConfig.redirectFromEntryId\n : true;\n }\n\n _setFilterOptionsConfig(options?: ProviderFilterOptionsObject): void {\n if (options && typeof options.redirectFromEntryId == 'boolean') {\n this._filterOptionsConfig.redirectFromEntryId = options.redirectFromEntryId;\n }\n }\n\n _parseDataFromResponse(data: Map): ProviderMediaConfigObject {\n this._logger.debug('Data parsing started');\n const mediaConfig: ProviderMediaConfigObject = {\n session: {\n isAnonymous: this._isAnonymous,\n partnerId: this.partnerId\n },\n sources: this._getDefaultSourcesObject(),\n plugins: {}\n };\n\n if (this.uiConfId) {\n mediaConfig.session.uiConfId = this.uiConfId;\n }\n\n if (data) {\n if (data.has(OVPSessionLoader.id)) {\n const sessionLoader = data.get(OVPSessionLoader.id);\n if (sessionLoader && sessionLoader.response) {\n mediaConfig.session.ks = sessionLoader.response;\n if (this.widgetId !== this.defaultWidgetId) {\n this.ks = mediaConfig.session.ks;\n }\n }\n } else {\n mediaConfig.session.ks = this.ks;\n }\n if (data.has(OVPMediaEntryLoader.id)) {\n const mediaLoader = data.get(OVPMediaEntryLoader.id);\n if (mediaLoader && mediaLoader.response) {\n const response = (mediaLoader: OVPMediaEntryLoader).response;\n if (OVPProviderParser.hasBlockAction(response)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {\n action: OVPProviderParser.getBlockAction(response),\n messages: OVPProviderParser.getErrorMessages(response)\n });\n }\n const mediaEntry = OVPProviderParser.getMediaEntry(this.isAnonymous ? '' : this.ks, this.partnerId, this.uiConfId, response);\n Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));\n this._verifyMediaStatus(mediaEntry);\n this._verifyHasSources(mediaConfig.sources);\n const bumper = OVPProviderParser.getBumper(response, this.isAnonymous ? '' : this.ks, this.partnerId);\n if (bumper) {\n Object.assign(mediaConfig.plugins, {bumper});\n }\n }\n }\n }\n this._logger.debug('Data parsing finished', mediaConfig);\n return mediaConfig;\n }\n\n /**\n * Checks media is ready for playback (not being imported or converted)\n * @param {MediaEntry} mediaEntry - the media entry info\n * @returns {void}\n */\n _verifyMediaStatus(mediaEntry: MediaEntry) {\n if ([KalturaMediaEntry.EntryStatus.IMPORT, KalturaMediaEntry.EntryStatus.PRECONVERT].includes(mediaEntry.status)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MEDIA_STATUS_NOT_READY, {\n messages: `Status of entry id ${mediaEntry.id} is ${mediaEntry.status} and is still being imported or converted`,\n data: {status}\n });\n }\n }\n /**\n * Gets the backend playlist config.\n * @param {ProviderPlaylistInfoObject} playlistInfo - ovp playlist info\n * @returns {Promise} - The provider playlist config\n */\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise {\n if (playlistInfo.ks) {\n this.ks = playlistInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const playlistId = playlistInfo.playlistId;\n if (playlistId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n this._dataLoader.add(OVPPlaylistLoader, {playlistId, ks});\n this._dataLoader.fetchData().then(\n response => {\n resolve(this._parsePlaylistDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parsePlaylistDataFromResponse(data: Map): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPPlaylistLoader.id)) {\n const playlistLoader = data.get(OVPPlaylistLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const playlist = OVPProviderParser.getPlaylist(playlistLoader.response);\n playlistConfig.id = playlist.id;\n playlistConfig.poster = playlist.poster;\n playlistConfig.metadata.name = playlist.name;\n playlistConfig.metadata.description = playlist.description;\n playlist.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n /**\n * Gets playlist config from entry list.\n * @param {ProviderEntryListObject} entryListInfo - ovp entry list info\n * @returns {Promise} - The provider playlist config\n */\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise {\n if (entryListInfo.ks) {\n this.ks = entryListInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entries = entryListInfo.entries;\n if (entries && entries.length) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(entryListInfo);\n this._dataLoader.add(OVPEntryListLoader, {entries, ks, redirectFromEntryId});\n this._dataLoader.fetchData(false).then(\n response => {\n resolve(this._parseEntryListDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parseEntryListDataFromResponse(data: Map): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPEntryListLoader.id)) {\n const playlistLoader = data.get(OVPEntryListLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const entryList = OVPProviderParser.getEntryList(playlistLoader.response);\n entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n _getPlaylistObject(): ProviderPlaylistObject {\n return {\n id: '',\n metadata: {\n name: '',\n description: ''\n },\n poster: '',\n items: []\n };\n }\n\n _getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {\n return {\n hls: [],\n dash: [],\n progressive: [],\n id: '',\n duration: 0,\n type: MediaEntry.Type.UNKNOWN,\n poster: '',\n dvr: false,\n vr: null,\n metadata: {\n name: '',\n description: '',\n tags: ''\n }\n };\n }\n\n _getSourcesObject(mediaEntry: MediaEntry) {\n const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();\n const mediaSources = mediaEntry.sources.toJSON();\n sourcesObject.hls = mediaSources.hls;\n sourcesObject.dash = mediaSources.dash;\n sourcesObject.progressive = mediaSources.progressive;\n sourcesObject.id = mediaEntry.id;\n sourcesObject.duration = mediaEntry.duration;\n sourcesObject.type = mediaEntry.type;\n sourcesObject.dvr = !!mediaEntry.dvrStatus;\n sourcesObject.poster = mediaEntry.poster;\n if (mediaEntry.sources.captions) {\n sourcesObject.captions = mediaEntry.sources.captions;\n }\n if (mediaEntry.metadata && typeof mediaEntry.metadata.tags === 'string' && mediaEntry.metadata.tags.indexOf('360') > -1) {\n sourcesObject.vr = {};\n }\n Object.assign(sourcesObject.metadata, mediaEntry.metadata);\n return sourcesObject;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\n\nexport class KalturaUIConfResponse extends ServiceResult {\n static Type: {[type: string]: number} = {\n PLAYER: 1,\n CONTRIBUTION_WIZARD: 2,\n SIMPLE_EDITOR: 3,\n ADVANCED_EDITOR: 4,\n PLAYLIST: 5,\n APP_STUDIO: 6,\n KRECORD: 7,\n PLAYER_V3: 8,\n KMC_ACCOUNT: 9,\n KMC_ANALYTICS: 10,\n KMC_CONTENT: 11,\n KMC_DASHBOARD: 12,\n KMC_LOGIN: 13,\n PLAYER_SL: 14,\n CLIENTSIDE_ENCODER: 15,\n KMC_GENERAL: 16,\n KMC_ROLES_AND_PERMISSIONS: 17,\n CLIPPER: 18,\n KSR: 19,\n KUPLOAD: 20,\n WEBCASTING: 21\n };\n\n static CreationMode: {[mode: string]: number} = {\n WIZARD: 2,\n ADVANCED: 3\n };\n\n description: string;\n objTypeAsString: string;\n width: number;\n height: number;\n htmlParams: string;\n swfUrl: string;\n confFilePath: string;\n confFile: string;\n confFileFeatures: string;\n name: string;\n config: string;\n confVars: string;\n useCdn: boolean;\n tags: string;\n swfUrlVersion: string;\n created: Date;\n updated: Date;\n html5Url: string;\n version: string;\n partnerTags: string;\n objType: number;\n creationMode: number;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n super(data);\n if (!this.hasError) {\n this.name = data.name;\n this.description = data.description;\n this.objTypeAsString = data.objTypeAsString;\n this.width = data.width;\n this.height = data.height;\n this.htmlParams = data.htmlParams;\n this.swfUrl = data.swfUrl;\n this.confFilePath = data.confFilePath;\n this.confFile = data.confFile;\n this.confFileFeatures = data.confFileFeatures;\n this.config = data.config;\n this.confVars = data.confVars;\n this.useCdn = data.useCdn;\n this.tags = data.tags;\n this.swfUrlVersion = data.swfUrlVersion;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.html5Url = data.description;\n this.version = data.description;\n this.partnerTags = data.description;\n this.objType = data.description;\n this.creationMode = data.description;\n }\n }\n}\n","// @flow\nimport OVPProvider from './provider';\nimport OVPProviderParser from './provider-parser';\nimport RequestBuilder from '../../util/request-builder';\nimport * as ResponseTypes from './response-types';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-ovp';\nconst VERSION = __VERSION__;\n\nexport {OVPProvider as Provider, OVPProviderParser as ProviderParser, NAME, VERSION, RequestBuilder, ResponseTypes};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/playkit-stats-service.js b/dist/playkit-stats-service.js index b037c5ab..4f4aef03 100644 --- a/dist/playkit-stats-service.js +++ b/dist/playkit-stats-service.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.stats=t():(e.playkit=e.playkit||{},e.playkit.services=e.playkit.services||{},e.playkit.services.stats=t())}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=10)}([function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(2);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function e(t,r,n,o){void 0===o&&(o={}),this.severity=t,this.category=r,this.code=n,this.data=o,e._logger.error("Category:"+r+" | Code:"+n+" |",o)};o(i,"Severity",{RECOVERABLE:1,CRITICAL:2}),o(i,"Category",{NETWORK:1,SERVICE:2,PROVIDER:3}),o(i,"Code",{UNSUPPORTED_SCHEME:1e3,BAD_HTTP_STATUS:1001,HTTP_ERROR:1002,TIMEOUT:1003,MALFORMED_DATA_URI:1004,BAD_SERVER_RESPONSE:1005,MULTIREQUEST_API_ERROR:1006,API_RESPONSE_MISMATCH:1007,ERROR:2e3,BLOCK_ACTION:2001,MEDIA_STATUS_NOT_READY:2002,MISSING_MANDATORY_PARAMS:3e3,MISSING_PLAY_SOURCE:3001,METHOD_NOT_IMPLEMENTED:3002}),o(i,"_logger",Object(n.a)("Error"))},function(e,t,r){"use strict";r.d(t,"a",(function(){return i}));var n=r(0);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=function(){function e(e){void 0===e&&(e=new Map),o(this,"retryConfig",{async:!0,timeout:0,maxAttempts:4}),o(this,"_attemptCounter",1),this.headers=e}var t=e.prototype;return t.getUrl=function(e){return e+"/service/"+this.service+(this.action?"/action/"+this.action:"")},t.doHttpRequest=function(){var e=this,t=new Promise((function(t,r){e._requestPromise={resolve:t,reject:r}}));return this.url||this._requestPromise.reject(new n.a(n.a.Severity.CRITICAL,n.a.Category.NETWORK,n.a.Code.MALFORMED_DATA_URI,{url:this.url})),this._createXHR(),t},t._createXHR=function(){var e=this,t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status)try{var r=JSON.parse(t.responseText);return e.responseHeaders=e._getResponseHeaders(t),e._requestPromise.resolve(r)}catch(r){e._requestPromise.reject(e._createError(t,n.a.Code.BAD_SERVER_RESPONSE,{text:t.responseText}))}},t.open(this.method,this.url,this.retryConfig.async),this.retryConfig.async&&this.retryConfig.timeout&&(t.timeout=this.retryConfig.timeout);var r=performance.now();t.ontimeout=function(){e._handleError(t,n.a.Code.TIMEOUT,{timeout:(performance.now()-r)/1e3,statusText:t.statusText})},t.onerror=t.onabort=function(){e._handleError(t,n.a.Code.HTTP_ERROR,{text:t.responseText,statusText:t.statusText})},this.headers.forEach((function(e,r){t.setRequestHeader(r,e)})),t.send(this.params)},t._getResponseHeaders=function(e){return e.getAllResponseHeaders().split("\n").filter((function(e){return 0===e.toLowerCase().indexOf("x-")}))},t._handleError=function(e,t,r){var n=this._createError(e,t,r);if(e.onreadystatechange=function(){},e.onerror=function(){},e.ontimeout=function(){},e.onabort=function(){},!(this.retryConfig.maxAttempts&&this._attemptCounter0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return f}));var n=r(1),o=r(2);var i=function(e){var t,r,n;n=!1,(r="hasError")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,"KalturaAPIException"===e.objectType?(this.hasError=!0,this.error=new s(e.code,e.message)):e.error&&"KalturaAPIException"===e.error.objectType?(this.hasError=!0,this.error=new s(e.error.code,e.error.message)):this.data=e},s=function(e,t){this.code=e,this.message=t},a=r(0);function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),o=0;o0?t.slice(0):[]).forEach((function(t,n){("object"==typeof t&&t!=={}||Array.isArray(t)&&t.length>0)&&(r[n]=e(t))})):"object"==typeof t?(r=Object.assign({},t),Object.keys(r).forEach((function(t){("object"==typeof r[t]&&r[t]!=={}||Array.isArray(r[t])&&r[t].length>0)&&(r[t]=e(r[t]))}))):r=t,r}},function(e,t,r){"use strict";r.d(t,"a",(function(){return f}));var n=r(1),o=r(2);var i=function(e){var t,r,n;n=!1,(r="hasError")in(t=this)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,"KalturaAPIException"===e.objectType?(this.hasError=!0,this.error=new a(e.code,e.message)):e.error&&"KalturaAPIException"===e.error.objectType?(this.hasError=!0,this.error=new a(e.error.code,e.error.message)):this.data=e},a=function(e,t){this.code=e,this.message=t},s=r(0);function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(e){var t,r;function n(){for(var t,r=arguments.length,n=new Array(r),o=0;o}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = this.results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.results = results;\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","const param = a => {\n let s = [],\n rbracket = /\\[\\]$/,\n isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n },\n add = function (k, v) {\n v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;\n s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);\n },\n buildParams = function (prefix, obj) {\n let i, len, key;\n\n if (prefix) {\n if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n if (rbracket.test(prefix)) {\n add(prefix, obj[i]);\n } else {\n buildParams(prefix + ':' + (typeof obj[i] === 'object' ? i : ''), obj[i]);\n }\n }\n } else if (obj && String(obj) === '[object Object]') {\n for (key in obj) {\n buildParams(prefix + ':' + key, obj[key]);\n }\n } else {\n add(prefix, obj);\n }\n } else if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n add(obj[i].name, obj[i].value);\n }\n } else {\n for (key in obj) {\n buildParams(key, obj[key]);\n }\n }\n return s;\n };\n\n return buildParams('', a).join('&').replace(/%20/g, '+');\n};\n\nexport {param};\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nimport OVPService from '../ovp-service';\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport {param} from '../../../../util/param';\n\nconst SERVICE_NAME: string = 'stats';\n\nexport default class OVPStatsService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for stats.collect\n * @function collect\n * @param {string} serviceUrl - The service base url\n * @param {string} ks - The ks\n * @param {string} playerVersion - The player version\n * @param {Object} event - The event data\n * @returns {RequestBuilder} - The request builder\n * @static\n */\n static collect(serviceUrl: string, ks: string, playerVersion: string, event: Object): RequestBuilder {\n const ovpParams = OVPConfiguration.get();\n const serviceParams = {};\n Object.assign(serviceParams, ovpParams.serviceParams, {ks: ks, clientTag: 'html5:v' + playerVersion}, event);\n const request = new RequestBuilder();\n request.service = SERVICE_NAME;\n request.action = 'collect';\n request.method = 'GET';\n request.tag = 'stats-collect';\n request.params = serviceParams;\n request.url = serviceUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(request.params);\n return request;\n }\n}\n","// @flow\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport OVPStatsService from './stats-service';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-stats-service';\nconst VERSION = __VERSION__;\n\nexport {OVPStatsService, OVPConfiguration, RequestBuilder, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./util/request-builder.js","./providers/./util/logger.js","./providers/./k-provider/ovp/config.js","./providers/./util/clone.js","./providers/./k-provider/common/base-service-result.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./util/param.js","./providers/./k-provider/ovp/services/ovp-service.js","./providers/./k-provider/ovp/services/stats/stats-service.js","./providers/./k-provider/ovp/services/stats/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","RequestBuilder","headers","Map","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","status","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","JsLogger","VERSION","DEBUG","INFO","OFF","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","defaultConfig","cdnUrl","serviceParams","apiVersion","format","useApiCaptions","OVPConfiguration","set","clientConfig","clone","node","Array","isArray","length","slice","e","keys","ServiceResult","objectType","hasError","ServiceError","message","MultiRequestBuilder","add","requests","push","requestParams","serviceDef","execute","requestsMustSucceed","stringify","err","FAILED_PARSING_REQUEST","then","multiRequestResult","MultiRequestResult","success","results","result","map","errorResults","serviceResult","param","a","rbracket","obj","toString","k","v","encodeURIComponent","buildParams","prefix","len","test","String","join","replace","OVPService","getMultiRequest","playerVersion","ks","partnerId","config","ovpParams","clientTag","multiReq","OVPStatsService","collect","event","tag","NAME","__NAME__","__VERSION__"],"mappings":"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","file":"playkit-stats-service.js","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[\"stats\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"services\"] = root[\"playkit\"][\"services\"] || {}, root[\"playkit\"][\"services\"][\"stats\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 10);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map}\n */\n headers: Map;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array}\n */\n responseHeaders: Array;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map} headers The request headers\n */\n constructor(headers: Map = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.} Service response as promise\n */\n doHttpRequest(): Promise {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array}\n */\n requests: Array = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n this.results = results;\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","const param = a => {\n let s = [],\n rbracket = /\\[\\]$/,\n isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n },\n add = function (k, v) {\n v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;\n s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);\n },\n buildParams = function (prefix, obj) {\n let i, len, key;\n\n if (prefix) {\n if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n if (rbracket.test(prefix)) {\n add(prefix, obj[i]);\n } else {\n buildParams(prefix + ':' + (typeof obj[i] === 'object' ? i : ''), obj[i]);\n }\n }\n } else if (obj && String(obj) === '[object Object]') {\n for (key in obj) {\n buildParams(prefix + ':' + key, obj[key]);\n }\n } else {\n add(prefix, obj);\n }\n } else if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n add(obj[i].name, obj[i].value);\n }\n } else {\n for (key in obj) {\n buildParams(key, obj[key]);\n }\n }\n return s;\n };\n\n return buildParams('', a).join('&').replace(/%20/g, '+');\n};\n\nexport {param};\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nimport OVPService from '../ovp-service';\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport {param} from '../../../../util/param';\n\nconst SERVICE_NAME: string = 'stats';\n\nexport default class OVPStatsService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for stats.collect\n * @function collect\n * @param {string} serviceUrl - The service base url\n * @param {string} ks - The ks\n * @param {string} playerVersion - The player version\n * @param {Object} event - The event data\n * @returns {RequestBuilder} - The request builder\n * @static\n */\n static collect(serviceUrl: string, ks: string, playerVersion: string, event: Object): RequestBuilder {\n const ovpParams = OVPConfiguration.get();\n const serviceParams = {};\n Object.assign(serviceParams, ovpParams.serviceParams, {ks: ks, clientTag: 'html5:v' + playerVersion}, event);\n const request = new RequestBuilder();\n request.service = SERVICE_NAME;\n request.action = 'collect';\n request.method = 'GET';\n request.tag = 'stats-collect';\n request.params = serviceParams;\n request.url = serviceUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(request.params);\n return request;\n }\n}\n","// @flow\nimport RequestBuilder from '../../../../util/request-builder';\nimport OVPConfiguration from '../../config';\nimport OVPStatsService from './stats-service';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-stats-service';\nconst VERSION = __VERSION__;\n\nexport {OVPStatsService, OVPConfiguration, RequestBuilder, NAME, VERSION};\n"],"sourceRoot":""} \ No newline at end of file