@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
JavaScript
;
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);
})]);
}