UNPKG

dashjs

Version:

A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.

61 lines (60 loc) 6.22 kB
'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _MetricSerialiser=require('../../utils/MetricSerialiser');var _MetricSerialiser2=_interopRequireDefault(_MetricSerialiser);var _RNG=require('../../utils/RNG');var _RNG2=_interopRequireDefault(_RNG);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}/** * The copyright in this software is being made available under the BSD License, * included below. This software may be subject to other third party and contributor * rights, including patent rights, and no such rights are granted under this license. * * Copyright (c) 2013, Dash Industry Forum. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * Neither the name of Dash Industry Forum nor the names of its * contributors may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */function DVBReporting(config){config=config||{};var instance=void 0;var context=this.context;var metricSerialiser=void 0,randomNumberGenerator=void 0,reportingPlayerStatusDecided=void 0,isReportingPlayer=void 0,reportingUrl=void 0,rangeController=void 0;var USE_DRAFT_DVB_SPEC=true;var allowPendingRequestsToCompleteOnReset=true;var pendingRequests=[];var metricsConstants=config.metricsConstants;function setup(){metricSerialiser=(0,_MetricSerialiser2.default)(context).getInstance();randomNumberGenerator=(0,_RNG2.default)(context).getInstance();resetInitialSettings();}function doGetRequest(url,successCB,failureCB){var req=new XMLHttpRequest();var oncomplete=function oncomplete(){var reqIndex=pendingRequests.indexOf(req);if(reqIndex===-1){return;}else{pendingRequests.splice(reqIndex,1);}if(req.status>=200&&req.status<300){if(successCB){successCB();}}else{if(failureCB){failureCB();}}};pendingRequests.push(req);try{req.open('GET',url);req.onloadend=oncomplete;req.onerror=oncomplete;req.send();}catch(e){req.onerror();}}function report(type,vos){if(!Array.isArray(vos)){vos=[vos];}// If the Player is not a reporting Player, then the Player shall // not report any errors. // ... In addition to any time restrictions specified by a Range // element within the Metrics element. if(isReportingPlayer&&rangeController.isEnabled()){// This reporting mechanism operates by creating one HTTP GET // request for every entry in the top level list of the metric. vos.forEach(function(vo){var url=metricSerialiser.serialise(vo);// this has been proposed for errata if(USE_DRAFT_DVB_SPEC&&type!==metricsConstants.DVB_ERRORS){url='metricname='+type+'&'+url;}// Take the value of the @reportingUrl attribute, append a // question mark ('?') character and then append the string // created in the previous step. url=reportingUrl+'?'+url;// Make an HTTP GET request to the URL contained within the // string created in the previous step. doGetRequest(url,null,function(){// If the Player is unable to make the report, for // example because the @reportingUrl is invalid, the // host cannot be reached, or an HTTP status code other // than one in the 200 series is received, the Player // shall cease being a reporting Player for the // duration of the MPD. isReportingPlayer=false;});});}}function initialize(entry,rc){var probability=void 0;rangeController=rc;reportingUrl=entry['dvb:reportingUrl'];// If a required attribute is missing, the Reporting descriptor may // be ignored by the Player if(!reportingUrl){throw new Error('required parameter missing (dvb:reportingUrl)');}// A Player's status, as a reporting Player or not, shall remain // static for the duration of the MPD, regardless of MPD updates. // (i.e. only calling reset (or failure) changes this state) if(!reportingPlayerStatusDecided){// NOTE: DVB spec has a typo where it incorrectly references the // priority attribute, which should be probability probability=entry['dvb:probability']||entry['dvb:priority']||0;// If the @priority attribute is set to 1000, it shall be a reporting Player. // If the @priority attribute is missing, the Player shall not be a reporting Player. // For any other value of the @probability attribute, it shall decide at random whether to be a // reporting Player, such that the probability of being one is @probability/1000. if(probability&&(probability===1000||probability/1000>=randomNumberGenerator.random())){isReportingPlayer=true;}reportingPlayerStatusDecided=true;}}function resetInitialSettings(){reportingPlayerStatusDecided=false;isReportingPlayer=false;reportingUrl=null;rangeController=null;}function reset(){if(!allowPendingRequestsToCompleteOnReset){pendingRequests.forEach(function(req){return req.abort();});pendingRequests=[];}resetInitialSettings();}instance={report:report,initialize:initialize,reset:reset};setup();return instance;}DVBReporting.__dashjs_factory_name='DVBReporting';exports.default=dashjs.FactoryMaker.getClassFactory(DVBReporting);/* jshint ignore:line */ //# sourceMappingURL=DVBReporting.js.map