Skip to content

Commit

Permalink
Merge pull request #964 from PubMatic-OpenWrap/nightly_23oct_24
Browse files Browse the repository at this point in the history
PR for 23rd Oct release
  • Loading branch information
kapil-tuptewar authored Oct 22, 2024
2 parents e7b1007 + d3a0ce3 commit 96aed8e
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 10 deletions.
46 changes: 41 additions & 5 deletions modules/pubmaticAnalyticsAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -633,7 +633,7 @@ function executeBidsLoggerCall(e, highestCpmBids) {
);
}

function executeBidWonLoggerCall(auctionId, adUnitId) {
function executeBidWonLoggerCall(auctionId, adUnitId, isIma) {
const winningBidId = cache.auctions[auctionId].adUnitCodes[adUnitId].bidWon;
const winningBids = cache.auctions[auctionId].adUnitCodes[adUnitId].bids[winningBidId];
if (!winningBids) {
Expand Down Expand Up @@ -711,6 +711,10 @@ function executeBidWonLoggerCall(auctionId, adUnitId) {
pixelURL += '&af=' + enc(winningBid.bidResponse ? (winningBid.bidResponse.mediaType || undefined) : undefined);
pixelURL += '&cds=' + getCDSDataLoggerStr(); // encoded string is returned from function

if (isIma) {
return pixelURL;
}

ajax(
pixelURL,
null,
Expand Down Expand Up @@ -836,12 +840,44 @@ function bidderDoneHandler(args) {
}

function bidWonHandler(args) {
let auctionCache = cache.auctions[args.auctionId];
auctionCache.adUnitCodes[args.adUnitCode].bidWon = args.originalRequestId || args.requestId;
auctionCache.adUnitCodes[args.adUnitCode].bidWonAdId = args.adId;
executeBidWonLoggerCall(args.auctionId, args.adUnitCode);
generateBidWonLogger(args, false);
}

function generateBidWonLogger(bid, isIma) {
var auctionCache = cache.auctions[bid.auctionId];
auctionCache.adUnitCodes[bid.adUnitCode].bidWon = bid.requestId;
auctionCache.adUnitCodes[bid.adUnitCode].bidWonAdId = bid.adId;
return executeBidWonLoggerCall(bid.auctionId, bid.adUnitCode, isIma);
}

getGlobal().injectTrackerForIMA = function (args, vast) {
var bid = cache.auctions[args.auctionId].adUnitCodes[args.adUnitCode].bids[args.requestId][0];
if (!bid) {
logError(LOG_PRE_FIX + 'Could not find associated bid request for bid response with requestId: ', args.requestId);
return;
}
bid.adId = args.adId;
bid.auctionId = args.auctionId;
bid.adUnitCode = args.adUnitCode;
bid.requestId = args.requestId;
bid.bidResponse = parseBidResponse(args);
try {
var domParser = new DOMParser();
var parsedVast = domParser.parseFromString(vast, 'application/xml');
var impEle = parsedVast.createElement('Impression');
impEle.innerHTML = '<![CDATA[' + generateBidWonLogger(bid, true) + ']]>';
if (parsedVast.getElementsByTagName('Wrapper').length == 1) {
parsedVast.getElementsByTagName('Wrapper')[0].appendChild(impEle);
} else if (parsedVast.getElementsByTagName('InLine').length == 1) {
parsedVast.getElementsByTagName('InLine')[0].appendChild(impEle);
}
return new XMLSerializer().serializeToString(parsedVast);
} catch (ex) {
logError(LOG_PRE_FIX + ' Exception in injecting tracker for IMA ', ex);
return vast;
}
};

function auctionEndHandler(args) {
// if for the given auction bidderDonePendingCount == 0 then execute logger call sooners
let highestCpmBids = getGlobal().getHighestCpmBids() || [];
Expand Down
34 changes: 33 additions & 1 deletion modules/userId/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -842,6 +842,26 @@ export function getRawPDString(emailHashes, userID) {
return btoa(pdString);
};

function hexToBytes(hex) {
return Uint8Array.from(
hex.match(/.{1,2}/g).map(byte => parseInt(byte, 16))
);
}

// Module to convert byte array to Base64
function bytesToBase64(bytes) {
const binaryString = String.fromCharCode(...bytes);
return btoa(binaryString);
}

export function getHexToBase64(hex) {
if (!hex || typeof hex !== 'string' || hex.trim() === '') {
logWarn(`Invalid hex input: hex string is undefined, null, or empty. This message applies only to UID2 client-side integration.`);
return undefined;
}
return bytesToBase64(hexToBytes(hex)); // Convert byte array to Base64
}

export function updateModuleParams(moduleToUpdate) {
let params = MODULE_PARAM_TO_UPDATE_FOR_SSO[moduleToUpdate.name];
if (!params) return;
Expand All @@ -850,7 +870,19 @@ export function updateModuleParams(moduleToUpdate) {
let enableSSO = (window.IHPWT && window.IHPWT.ssoEnabled) || (window.PWT && window.PWT.ssoEnabled) || false;
let emailHashes = enableSSO && userIdentity.emailHash ? userIdentity.emailHash : userIdentity.pubProvidedEmailHash ? userIdentity.pubProvidedEmailHash : undefined;
params.forEach(function(param) {
moduleToUpdate.params[param.key] = (moduleToUpdate.name === 'id5Id' ? getRawPDString(emailHashes, userIdentity.userID) : emailHashes ? emailHashes[param.hashType] : undefined);
switch (moduleToUpdate.name) {
case 'id5Id':
moduleToUpdate.params[param.key] = getRawPDString(emailHashes, userIdentity.userID);
break;
case 'uid2':
moduleToUpdate.params[param.key] = emailHashes && emailHashes[param.hashType]
? emailHashes[param.hashType]
: getHexToBase64(emailHashes?.SHA256);
break;
default:
moduleToUpdate.params[param.key] = emailHashes ? emailHashes[param.hashType] : undefined;
break;
}
});
}

Expand Down
11 changes: 9 additions & 2 deletions src/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ export const REFRESH_IDMODULES_LIST = {
'id5Id',
'publinkId',
'connectId',
'liveIntentId'
'liveIntentId',
'uid2'
],
SCRIPT_BASED_MODULES: [
'zeotapIdPlus',
Expand Down Expand Up @@ -150,7 +151,13 @@ export const MODULE_PARAM_TO_UPDATE_FOR_SSO = {
liveIntentId: [
{
key: 'emailHash',
hashType: 'SHA256'
hashType: 'SHA256' // Default Hex encoding
}
],
uid2: [
{
key: 'emailHash',
hashType: 'SHA256_BASE64' // SHA256 Base64 encoding
}
]
};
Expand Down
5 changes: 3 additions & 2 deletions src/videoCache.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {config} from './config.js';
import {auctionManager} from './auctionManager.js';
import {logError, logWarn} from './utils.js';
import {addBidToAuction} from './auction.js';
import {getGlobal} from '../src/prebidGlobal.js';

/**
* Might be useful to be configurable in the future
Expand Down Expand Up @@ -75,8 +76,8 @@ function toStorageRequest(bid, {index = auctionManager.index} = {}) {
let vastValue = bid.vastXml ? bid.vastXml : wrapURI(bid.vastUrl, bid.vastImpUrl);
const auction = index.getAuction(bid);
/* istanbul ignore next */
if (window && window.PWT) {
vastValue = window.PWT.UpdateVastWithTracker(bid, vastValue);
if (window && window.ima) {
vastValue = getGlobal().injectTrackerForIMA(bid, vastValue);
}
const ttlWithBuffer = Number(bid.ttl) + ttlBufferInSeconds;
let payload = {
Expand Down

0 comments on commit 96aed8e

Please sign in to comment.