mk9-prebid
Version:
Header Bidding Management Library
135 lines (127 loc) • 4.66 kB
JavaScript
/**
* This module adds dgkeyword provider to the real time data module
* The {@link module:modules/realTimeData} module is required
* The module will get keywords from 1plux profile api.
* This module can work only with AppNexusBidAdapter.
* @module modules/dgkeywordProvider
* @requires module:modules/realTimeData
*/
import * as utils from '../src/utils.js';
import { ajax } from '../src/ajax.js';
import { submodule } from '../src/hook.js';
import { getGlobal } from '../src/prebidGlobal.js';
/**
* get keywords from api server. and set keywords.
* @param {Object} reqBidsConfigObj
* @param {function} callback
* @param {Object} moduleConfig
* @param {Object} userConsent
*/
export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, userConsent) {
const URL = 'https://mediaconsortium.profiles.tagger.opecloud.com/api/v1?url=';
const PROFILE_TIMEOUT_MS = 1000;
const timeout = (moduleConfig && moduleConfig.params && moduleConfig.params.timeout && Number(moduleConfig.params.timeout) > 0) ? Number(moduleConfig.params.timeout) : PROFILE_TIMEOUT_MS;
const url = (moduleConfig && moduleConfig.params && moduleConfig.params.url) ? moduleConfig.params.url : URL + encodeURIComponent(window.location.href);
const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits;
let isFinish = false;
utils.logMessage('[dgkeyword sub module]', adUnits, timeout);
let setKeywordTargetBidders = getTargetBidderOfDgKeywords(adUnits);
if (setKeywordTargetBidders.length <= 0) {
utils.logMessage('[dgkeyword sub module] no dgkeyword targets.');
callback();
} else {
utils.logMessage('[dgkeyword sub module] dgkeyword targets:', setKeywordTargetBidders);
utils.logMessage('[dgkeyword sub module] get targets from profile api start.');
ajax(url, {
success: function(response) {
const res = JSON.parse(response);
if (!isFinish) {
utils.logMessage('[dgkeyword sub module] get targets from profile api end.');
if (res) {
let keywords = {};
if (res['s'] != null && res['s'].length > 0) {
keywords['opeaud'] = res['s'];
}
if (res['t'] != null && res['t'].length > 0) {
keywords['opectx'] = res['t'];
}
if (Object.keys(keywords).length > 0) {
const targetBidKeys = {}
for (let bid of setKeywordTargetBidders) {
// set keywords to params
bid.params.keywords = keywords;
if (!targetBidKeys[bid.bidder]) {
targetBidKeys[bid.bidder] = true;
}
}
if (!reqBidsConfigObj._ignoreSetOrtb2) {
// set keywrods to ortb2
let addOrtb2 = {};
utils.deepSetValue(addOrtb2, 'site.keywords', keywords);
utils.deepSetValue(addOrtb2, 'user.keywords', keywords);
const ortb2 = {ortb2: addOrtb2};
reqBidsConfigObj.setBidderConfig({ bidders: Object.keys(targetBidKeys), config: ortb2 });
}
}
}
isFinish = true;
}
callback();
},
error: function(errorStatus) {
// error occur
utils.logError('[dgkeyword sub module] profile api access error.', errorStatus);
callback();
}
}, null, {
withCredentials: true,
contentType: 'application/json',
});
setTimeout(function () {
if (!isFinish) {
// profile api timeout
utils.logInfo('[dgkeyword sub module] profile api timeout. [timeout: ' + timeout + 'ms]');
isFinish = true;
}
callback();
}, timeout);
}
}
/**
* get all bidder which hava {dgkeyword: true} in params
* @param {Object} adUnits
*/
export function getTargetBidderOfDgKeywords(adUnits) {
let setKeywordTargetBidders = [];
for (let adUnit of adUnits) {
for (let bid of adUnit.bids) {
if (bid.params && bid.params['dgkeyword'] === true) {
delete bid.params['dgkeyword'];
setKeywordTargetBidders.push(bid);
}
}
}
return setKeywordTargetBidders;
}
/** @type {RtdSubmodule} */
export const dgkeywordSubmodule = {
/**
* used to link submodule with realTimeData
* @type {string}
*/
name: 'dgkeyword',
/**
* get data and send back to realTimeData module
* @function
* @param {string[]} adUnitsCodes
*/
getBidRequestData: getDgKeywordsAndSet,
init: init,
};
function init(moduleConfig) {
return true;
}
function registerSubModule() {
submodule('realTimeData', dgkeywordSubmodule);
}
registerSubModule();