video-ad-sdk
Version:
VAST/VPAID SDK that allows video ads to be played on top of any player
153 lines (143 loc) • 4.28 kB
text/typescript
import {
getClickTracking,
getCustomClick,
getImpression,
getViewable,
getNotViewable,
getViewUndetermined,
getLinearTrackingEvents
} from '../vastSelectors'
import type {
ParsedAd,
VastChain,
VastTrackingEvent,
VastEventTrackerOptions,
Optional
} from '../types'
import {pixelTracker} from './helpers/pixelTracker'
import {trackError} from './helpers/trackError'
import {trackIconView} from './helpers/trackIconView'
import {trackIconClick} from './helpers/trackIconClick'
import {trackProgress} from './helpers/trackProgress'
import {createVastEventTracker} from './helpers/createVastEventTracker'
import {
clickThrough,
closeLinear,
complete,
error,
exitFullscreen,
firstQuartile,
fullscreen,
iconClick,
iconView,
impression,
viewable,
notViewable,
viewUndetermined,
midpoint,
mute,
pause,
playerCollapse,
playerExpand,
progress,
resume,
rewind,
skip,
start,
thirdQuartile,
unmute,
creativeView
} from './linearEvents'
type TrackingEventSelector = (ad: ParsedAd) => Optional<string[]>
const eventSelector =
(...selectors: TrackingEventSelector[]) =>
(ad: ParsedAd) => {
const trackingURIs: VastTrackingEvent[] = []
if (selectors.length > 0) {
selectors.forEach((getElements) => {
const elements = getElements(ad)
/* istanbul ignore else */
if (Array.isArray(elements) && elements.length > 0) {
trackingURIs.push(...elements.map((uri) => ({uri})))
}
})
}
return trackingURIs
}
const linearTrackingEventSelector = (event: string) => (ad: ParsedAd) =>
getLinearTrackingEvents(ad, event)
const linearTrackers = {
[ ]: createVastEventTracker(
eventSelector(getClickTracking, getCustomClick)
),
[ ]: createVastEventTracker(
linearTrackingEventSelector(closeLinear)
),
[ ]: createVastEventTracker(linearTrackingEventSelector(complete)),
[ ]: createVastEventTracker(
linearTrackingEventSelector(creativeView)
),
[ ]: trackError,
[ ]: createVastEventTracker(
linearTrackingEventSelector(exitFullscreen)
),
[ ]: createVastEventTracker(
linearTrackingEventSelector(firstQuartile)
),
[ ]: createVastEventTracker(linearTrackingEventSelector(fullscreen)),
[ ]: trackIconClick,
[ ]: trackIconView,
[ ]: createVastEventTracker(eventSelector(getImpression)),
[ ]: createVastEventTracker(linearTrackingEventSelector(midpoint)),
[ ]: createVastEventTracker(linearTrackingEventSelector(mute)),
[ ]: createVastEventTracker(eventSelector(getNotViewable)),
[ ]: createVastEventTracker(linearTrackingEventSelector(pause)),
[ ]: createVastEventTracker(
linearTrackingEventSelector(playerCollapse)
),
[ ]: createVastEventTracker(
linearTrackingEventSelector(playerExpand)
),
[ ]: trackProgress,
[ ]: createVastEventTracker(linearTrackingEventSelector(resume)),
[ ]: createVastEventTracker(linearTrackingEventSelector(rewind)),
[ ]: createVastEventTracker(linearTrackingEventSelector(skip)),
[ ]: createVastEventTracker(linearTrackingEventSelector(start)),
[ ]: createVastEventTracker(
linearTrackingEventSelector(thirdQuartile)
),
[ ]: createVastEventTracker(linearTrackingEventSelector(unmute)),
[ ]: createVastEventTracker(eventSelector(getViewable)),
[ ]: createVastEventTracker(eventSelector(getViewUndetermined))
}
/**
* Tracks the passed linear event.
*
* @param event name of the linear event we need to track. @see LinearEvents
* @param vastChain the ad VAST Chain.
* @param options Options Map. The allowed properties are:
*/
export const trackLinearEvent = (
event: keyof typeof linearTrackers,
vastChain: VastChain,
{
data,
errorCode,
tracker = pixelTracker,
logger = console
}: VastEventTrackerOptions
): void => {
const {[event]: linearTracker} = linearTrackers
if (linearTracker) {
linearTracker(vastChain, {
data: {
...data,
errorCode
},
errorCode,
tracker
})
} else {
logger.error(`Event '${event}' cannot be tracked`)
}
}