mk9-prebid
Version:
Header Bidding Management Library
122 lines (113 loc) • 4.01 kB
JavaScript
/**
* This module adds IdentityLink to the User ID module
* The {@link module:modules/userId} module is required
* @module modules/identityLinkSubmodule
* @requires module:modules/userId
*/
import * as utils from '../src/utils.js'
import { ajax } from '../src/ajax.js';
import { submodule } from '../src/hook.js';
import {getStorageManager} from '../src/storageManager.js';
export const storage = getStorageManager();
/** @type {Submodule} */
export const identityLinkSubmodule = {
/**
* used to link submodule with config
* @type {string}
*/
name: 'identityLink',
/**
* used to specify vendor id
* @type {number}
*/
gvlid: 97,
/**
* decode the stored id value for passing to bid requests
* @function
* @param {string} value
* @returns {{idl_env:string}}
*/
decode(value) {
return { 'idl_env': value }
},
/**
* performs action to obtain id and return a value in the callback's response argument
* @function
* @param {ConsentData} [consentData]
* @param {SubmoduleConfig} [config]
* @returns {IdResponse|undefined}
*/
getId(config, consentData) {
const configParams = (config && config.params) || {};
if (!configParams || typeof configParams.pid !== 'string') {
utils.logError('identityLink: requires partner id to be defined');
return;
}
const hasGdpr = (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) ? 1 : 0;
const gdprConsentString = hasGdpr ? consentData.consentString : '';
const tcfPolicyV2 = utils.deepAccess(consentData, 'vendorData.tcfPolicyVersion') === 2;
// use protocol relative urls for http or https
if (hasGdpr && (!gdprConsentString || gdprConsentString === '')) {
utils.logInfo('identityLink: Consent string is required to call envelope API.');
return;
}
const url = `https://api.rlcdn.com/api/identity/envelope?pid=${configParams.pid}${hasGdpr ? (tcfPolicyV2 ? '&ct=4&cv=' : '&ct=1&cv=') + gdprConsentString : ''}`;
let resp;
resp = function (callback) {
// Check ats during callback so it has a chance to initialise.
// If ats library is available, use it to retrieve envelope. If not use standard third party endpoint
if (window.ats) {
utils.logInfo('identityLink: ATS exists!');
window.ats.retrieveEnvelope(function (envelope) {
if (envelope) {
utils.logInfo('identityLink: An envelope can be retrieved from ATS!');
setEnvelopeSource(true);
callback(JSON.parse(envelope).envelope);
} else {
getEnvelope(url, callback, configParams);
}
});
} else {
getEnvelope(url, callback, configParams);
}
};
return { callback: resp };
}
};
// return envelope from third party endpoint
function getEnvelope(url, callback, configParams) {
const callbacks = {
success: response => {
let responseObj;
if (response) {
try {
responseObj = JSON.parse(response);
} catch (error) {
utils.logInfo(error);
}
}
callback((responseObj && responseObj.envelope) ? responseObj.envelope : '');
},
error: error => {
utils.logInfo(`identityLink: identityLink: ID fetch encountered an error`, error);
callback();
}
};
if (!configParams.notUse3P && !storage.getCookie('_lr_retry_request')) {
setRetryCookie();
utils.logInfo('identityLink: A 3P retrieval is attempted!');
setEnvelopeSource(false);
ajax(url, callbacks, undefined, { method: 'GET', withCredentials: true });
}
}
function setRetryCookie() {
let now = new Date();
now.setTime(now.getTime() + 3600000);
storage.setCookie('_lr_retry_request', 'true', now.toUTCString());
}
function setEnvelopeSource(src) {
let now = new Date();
now.setTime(now.getTime() + 2592000000);
storage.setCookie('_lr_env_src_ats', src, now.toUTCString());
}
submodule('userId', identityLinkSubmodule);