UNPKG

mk9-prebid

Version:

Header Bidding Management Library

154 lines (130 loc) 4.4 kB
import { config } from './config.js'; import { logMessage as utilsLogMessage, logWarn as utilsLogWarn } from './utils.js'; import { addBidderRequests, addBidResponse } from './auction.js'; const OVERRIDE_KEY = '$$PREBID_GLOBAL$$:debugging'; export let addBidResponseBound; export let addBidderRequestsBound; function logMessage(msg) { utilsLogMessage('DEBUG: ' + msg); } function logWarn(msg) { utilsLogWarn('DEBUG: ' + msg); } function addHooks(overrides) { addBidResponseBound = addBidResponseHook.bind(overrides); addBidResponse.before(addBidResponseBound, 5); addBidderRequestsBound = addBidderRequestsHook.bind(overrides); addBidderRequests.before(addBidderRequestsBound, 5); } function removeHooks() { addBidResponse.getHooks({hook: addBidResponseBound}).remove(); addBidderRequests.getHooks({hook: addBidderRequestsBound}).remove(); } export function enableOverrides(overrides, fromSession = false) { config.setConfig({'debug': true}); removeHooks(); addHooks(overrides); logMessage(`bidder overrides enabled${fromSession ? ' from session' : ''}`); } export function disableOverrides() { removeHooks(); logMessage('bidder overrides disabled'); } /** * @param {{bidder:string, adUnitCode:string}} overrideObj * @param {string} bidderCode * @param {string} adUnitCode * @returns {boolean} */ export function bidExcluded(overrideObj, bidderCode, adUnitCode) { if (overrideObj.bidder && overrideObj.bidder !== bidderCode) { return true; } if (overrideObj.adUnitCode && overrideObj.adUnitCode !== adUnitCode) { return true; } return false; } /** * @param {string[]} bidders * @param {string} bidderCode * @returns {boolean} */ export function bidderExcluded(bidders, bidderCode) { return (Array.isArray(bidders) && bidders.indexOf(bidderCode) === -1); } /** * @param {Object} overrideObj * @param {Object} bidObj * @param {Object} bidType * @returns {Object} bidObj with overridden properties */ export function applyBidOverrides(overrideObj, bidObj, bidType) { return Object.keys(overrideObj).filter(key => (['adUnitCode', 'bidder'].indexOf(key) === -1)).reduce(function(result, key) { logMessage(`bidder overrides changed '${result.adUnitCode}/${result.bidderCode}' ${bidType}.${key} from '${result[key]}.js' to '${overrideObj[key]}'`); result[key] = overrideObj[key]; return result; }, bidObj); } export function addBidResponseHook(next, adUnitCode, bid) { const overrides = this; if (bidderExcluded(overrides.bidders, bid.bidderCode)) { logWarn(`bidder '${bid.bidderCode}' excluded from auction by bidder overrides`); return; } if (Array.isArray(overrides.bids)) { overrides.bids.forEach(function(overrideBid) { if (!bidExcluded(overrideBid, bid.bidderCode, adUnitCode)) { applyBidOverrides(overrideBid, bid, 'bidder'); } }); } next(adUnitCode, bid); } export function addBidderRequestsHook(next, bidderRequests) { const overrides = this; const includedBidderRequests = bidderRequests.filter(function(bidderRequest) { if (bidderExcluded(overrides.bidders, bidderRequest.bidderCode)) { logWarn(`bidRequest '${bidderRequest.bidderCode}' excluded from auction by bidder overrides`); return false; } return true; }); if (Array.isArray(overrides.bidRequests)) { includedBidderRequests.forEach(function(bidderRequest) { overrides.bidRequests.forEach(function(overrideBid) { bidderRequest.bids.forEach(function(bid) { if (!bidExcluded(overrideBid, bidderRequest.bidderCode, bid.adUnitCode)) { applyBidOverrides(overrideBid, bid, 'bidRequest'); } }); }); }); } next(includedBidderRequests); } export function getConfig(debugging) { if (!debugging.enabled) { disableOverrides(); try { window.sessionStorage.removeItem(OVERRIDE_KEY); } catch (e) {} } else { try { window.sessionStorage.setItem(OVERRIDE_KEY, JSON.stringify(debugging)); } catch (e) {} enableOverrides(debugging); } } config.getConfig('debugging', ({debugging}) => getConfig(debugging)); export function sessionLoader(storage) { let overrides; try { storage = storage || window.sessionStorage; overrides = JSON.parse(storage.getItem(OVERRIDE_KEY)); } catch (e) { } if (overrides) { enableOverrides(overrides, true); } }