UNPKG

@lahzenegar/video-react

Version:

Video-React is a web video player built from the ground up for an HTML5 world using React library.

362 lines (297 loc) 11 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleVAST = undefined; var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var parseVAST = function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(xml) { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return new _promise2.default(function (resolve, reject) { parseString(xml).then(function (json) { return resolve(objectTransform(json)); }).catch(function (error) { return reject(error); }); }); case 2: return _context.abrupt('return', _context.sent); case 3: case 'end': return _context.stop(); } } }, _callee, this); })); return function parseVAST(_x) { return _ref.apply(this, arguments); }; }(); var fetchVast = function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(URL) { var _this = this; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return new _promise2.default(function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(resolve, reject) { var response; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return timeoutFetch(URL, { method: 'GET' }, 5000); case 3: response = _context2.sent; if (!(response.status !== 200)) { _context2.next = 6; break; } return _context2.abrupt('return', reject('INVALID_RESPONSE_STATUS_CODE')); case 6: _context2.t0 = resolve; _context2.next = 9; return response.text(); case 9: _context2.t1 = _context2.sent; (0, _context2.t0)(_context2.t1); _context2.next = 16; break; case 13: _context2.prev = 13; _context2.t2 = _context2['catch'](0); reject(_context2.t2); case 16: case 'end': return _context2.stop(); } } }, _callee2, _this, [[0, 13]]); })); return function (_x3, _x4) { return _ref3.apply(this, arguments); }; }()); case 2: return _context3.abrupt('return', _context3.sent); case 3: case 'end': return _context3.stop(); } } }, _callee3, this); })); return function fetchVast(_x2) { return _ref2.apply(this, arguments); }; }(); var handleVAST = exports.handleVAST = function () { var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(sourceURL) { var _this2 = this; return _regenerator2.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return new _promise2.default(function () { var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(resolve, reject) { var XMLData, domainURL; return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.prev = 0; _context4.next = 3; return fetchVast(sourceURL); case 3: XMLData = _context4.sent; domainURL = new URL(sourceURL); _context4.t0 = resolve; _context4.t1 = adObject; _context4.next = 9; return parseVAST(XMLData); case 9: _context4.t2 = _context4.sent; _context4.t3 = domainURL && domainURL.origin; _context4.t4 = (0, _context4.t1)(_context4.t2, _context4.t3); (0, _context4.t0)(_context4.t4); _context4.next = 18; break; case 15: _context4.prev = 15; _context4.t5 = _context4['catch'](0); reject(_context4.t5); case 18: case 'end': return _context4.stop(); } } }, _callee4, _this2, [[0, 15]]); })); return function (_x6, _x7) { return _ref5.apply(this, arguments); }; }()); case 2: return _context5.abrupt('return', _context5.sent); case 3: case 'end': return _context5.stop(); } } }, _callee5, this); })); return function handleVAST(_x5) { return _ref4.apply(this, arguments); }; }(); exports.timeoutFetch = timeoutFetch; var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _xml2js = require('xml2js'); var _xml2js2 = _interopRequireDefault(_xml2js); var _each = require('lodash/each'); var _each2 = _interopRequireDefault(_each); var _isPlainObject = require('lodash/isPlainObject'); var _isPlainObject2 = _interopRequireDefault(_isPlainObject); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ARRAY_TAGS = ['error', 'ad', 'impression', 'category', 'survey', 'viewable', 'notViewable', 'viewUndetermined', 'creative', 'creativeExtension', 'mediaFile', 'InteractiveCreativeFile', 'clickTracking', 'customClick', 'icon', 'iconViewTracking', 'iconClickTracking', 'nonLinear', 'nonLinearClickTracking', 'companion', 'companionClickTracking', 'tracking', 'staticResource', 'iFrameResource', 'htmlResource', 'verification', 'javaScriptResource', 'flashResource', 'extension']; var TAG_ARRAY_OBJ = ARRAY_TAGS.reduce(function (accum, tag) { var result = accum; result[tag] = true; return result; }, {}); function tagProcessor(n) { var name = n; if (name.indexOf('HTML') > -1) { name = name.replace('HTML', 'html'); } else if (name.indexOf('VAST') > -1) { name = name.replace('VAST', 'vast'); } return name; } var Parser = new _xml2js2.default.Parser({ tagNameProcessors: [tagProcessor, _xml2js2.default.processors.firstCharLowerCase], attrNameProcessors: [_xml2js2.default.processors.firstCharLowerCase], explicitArray: false, explicitCharkey: true, explicitAttrkey: true, charkey: '_value', attrkey: '_attr' }); function getValue() { try { return this._value; } catch (error) { return null; } } function getAttr(attribute) { try { return this._attr[attribute]; } catch (error) { return null; } } function objectTransform(object) { var result = Array.isArray(object) ? [] : {}; (0, _each2.default)(object, function (v, key) { var value = v; var isPlainObject = isPlainObject(value); var isArray = Array.isArray(value); if (isPlainObject) { if (value._value) { value.getValue = getValue.bind(value); } value.getAttr = getAttr.bind(value); } if (isPlainObject || isArray) { result[key] = TAG_ARRAY_OBJ[key] && !isArray ? [objectTransform(value)] : objectTransform(value); } else { result[key] = value; } }); return result; } var parseString = _bluebird2.default.promisify(Parser.parseString); function isValidUrl(string) { try { new URL(string); return true; } catch (error) { return false; } } function adObject(vast, baseURL) { try { var ad = vast.vast.ad, result = []; ad.map(function (item) { var inLine = item.inLine, creative = item.inLine.creatives.creative; creative.map(function (adCreative) { var linear = adCreative.linear, _adCreative$linear = adCreative.linear, clickThrough = _adCreative$linear.videoClicks.clickThrough, mediaFile = _adCreative$linear.mediaFiles.mediaFile; result.push({ adTitle: inLine.adTitle.getValue(), adSystem: inLine.adSystem.getValue(), duration: hmsToSecondsOnly(linear.duration.getValue()), skipOn: hmsToSecondsOnly(linear.getAttr('skipoffset')), adID: adCreative.getAttr('adID'), videoClicks: clickThrough.getValue(), mediaFiles: mediaFile.map(function (media) { var adURL = media.getValue(); if (!isValidUrl(adURL) && baseURL) { adURL = '' + baseURL + (adURL.startsWith('/') ? '' : '/') + adURL; } return { URL: adURL, type: media.getAttr('type'), width: media.getAttr('width'), height: media.getAttr('height'), delivery: media.getAttr('delivery') }; }) }); }); }); return result; } catch (error) { return []; } } function hmsToSecondsOnly(stringTime) { if (!stringTime || stringTime.split(':').length !== 3) { return 0; } var p = stringTime && stringTime.split(':'), s = 0, m = 1; while (p.length > 0) { s += m * parseInt(p.pop(), 10); m *= 60; } return s; } function timeoutFetch(url, options, timeout) { return _promise2.default.race([fetch(url, options), new _promise2.default(function (_, reject) { return setTimeout(function () { return reject('FILE_FETCH_TIMEOUT'); }, timeout); })]); }