UNPKG

video-ad-sdk

Version:

VAST/VPAID SDK that allows video ads to be played on top of any player

62 lines (61 loc) 2.79 kB
import { createVideoAdUnit } from '../../adUnit'; import { VideoAdContainer } from '../../adContainer'; import { ErrorCode } from '../../tracker'; import { getInteractiveFiles, getMediaFiles } from '../../vastSelectors'; import { canPlay } from '../../adUnit/helpers/media/canPlay'; import { start, closeLinear } from '../../tracker/linearEvents'; import { adStopped, adUserClose } from '../../adUnit/helpers/vpaid/api'; import { VastError } from '../../vastRequest/helpers/vastError'; const validate = (vastChain, videoAdContainer) => { if (!Array.isArray(vastChain) || vastChain.length === 0) { throw new TypeError('Invalid vastChain'); } if (!(videoAdContainer instanceof VideoAdContainer)) { throw new TypeError('Invalid VideoAdContainer'); } }; const hasVpaidCreative = (ad) => Boolean(getInteractiveFiles(ad)); const hasVastCreative = (ad, videoElement) => { const mediaFiles = getMediaFiles(ad); if (mediaFiles) { return mediaFiles.some((mediaFile) => canPlay(videoElement, mediaFile)); } return false; }; const startAdUnit = (adUnit, { onAdReady }) => new Promise((resolve, reject) => { const createRejectHandler = (event) => () => reject(new Error(`Ad unit start rejected due to event '${event}'`)); adUnit.onError(reject); adUnit.on(start, () => resolve(adUnit)); adUnit.on(adUserClose, createRejectHandler(adUserClose)); adUnit.on(closeLinear, createRejectHandler(closeLinear)); adUnit.on(adStopped, createRejectHandler(adStopped)); onAdReady(adUnit); adUnit.start(); }); const tryToStartVpaidAd = (vastChain, videoAdContainer, options) => { const [{ ad: inlineAd }] = vastChain; if (!inlineAd || !hasVpaidCreative(inlineAd)) { const error = new VastError('No valid creative found in the passed VAST chain'); error.code = ErrorCode.VAST_MEDIA_FILE_NOT_FOUND; throw error; } const adUnit = createVideoAdUnit(vastChain, videoAdContainer, Object.assign(Object.assign({}, options), { type: 'VPAID' })); return startAdUnit(adUnit, options); }; const startVastAd = (vastChain, videoAdContainer, options) => { const adUnit = createVideoAdUnit(vastChain, videoAdContainer, Object.assign(Object.assign({}, options), { type: 'VAST' })); return startAdUnit(adUnit, options); }; export const startVideoAd = async (vastChain, videoAdContainer, options) => { validate(vastChain, videoAdContainer); try { return await tryToStartVpaidAd(vastChain, videoAdContainer, options); } catch (error) { const [{ ad: inlineAd }] = vastChain; if (inlineAd && hasVastCreative(inlineAd, videoAdContainer.videoElement)) { return startVastAd(vastChain, videoAdContainer, options); } throw error; } };