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
JavaScript
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;
}
};