Skip to content

Commit 4762b4c

Browse files
committed
Fix #3265 - pbs cookie sync race condition
1 parent 14bf872 commit 4762b4c

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

modules/prebidServerBidAdapter/index.js

+19-4
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ function queueSync(bidderCodes, gdprConsent) {
116116
(response) => {
117117
try {
118118
response = JSON.parse(response);
119-
response.bidder_status.forEach(bidder => doBidderSync(bidder.usersync.type, bidder.usersync.url, bidder.bidder));
119+
doAllSyncs(response.bidder_status);
120120
} catch (e) {
121121
utils.logError(e);
122122
}
@@ -128,24 +128,39 @@ function queueSync(bidderCodes, gdprConsent) {
128128
});
129129
}
130130

131+
function doAllSyncs(bidders) {
132+
if (bidders.length === 0) {
133+
return;
134+
}
135+
136+
const thisSync = bidders.pop();
137+
if (thisSync.no_cookie) {
138+
doBidderSync(thisSync.usersync.type, thisSync.usersync.url, thisSync.bidder, doAllSyncs.bind(null, bidders));
139+
} else {
140+
doAllSyncs(bidders);
141+
}
142+
}
143+
131144
/**
132145
* Run a cookie sync for the given type, url, and bidder
133146
*
134147
* @param {string} type the type of sync, "image", "redirect", "iframe"
135148
* @param {string} url the url to sync
136149
* @param {string} bidder name of bidder doing sync for
137150
*/
138-
function doBidderSync(type, url, bidder) {
151+
function doBidderSync(type, url, bidder, done) {
139152
if (!url) {
140153
utils.logError(`No sync url for bidder "${bidder}": ${url}`);
154+
done();
141155
} else if (type === 'image' || type === 'redirect') {
142156
utils.logMessage(`Invoking image pixel user sync for bidder: "${bidder}"`);
143-
utils.triggerPixel(url);
157+
utils.triggerPixel(url, done);
144158
} else if (type == 'iframe') {
145159
utils.logMessage(`Invoking iframe user sync for bidder: "${bidder}"`);
146-
utils.insertUserSyncIframe(url);
160+
utils.insertUserSyncIframe(url, done);
147161
} else {
148162
utils.logError(`User sync type "${type}" not supported for bidder: "${bidder}"`);
163+
done();
149164
}
150165
}
151166

src/utils.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,12 @@ exports.insertElement = function(elm, doc, target) {
568568
} catch (e) {}
569569
};
570570

571-
exports.triggerPixel = function (url) {
571+
exports.triggerPixel = function (url, done) {
572572
const img = new Image();
573+
if (done && exports.isFn(done)) {
574+
img.addEventListener('load', done);
575+
img.addEventListener('error', done);
576+
}
573577
img.src = url;
574578
};
575579

@@ -616,11 +620,15 @@ exports.insertHtmlIntoIframe = function(htmlCode) {
616620
* @param {string} url URL to be requested
617621
* @param {string} encodeUri boolean if URL should be encoded before inserted. Defaults to true
618622
*/
619-
exports.insertUserSyncIframe = function(url) {
623+
exports.insertUserSyncIframe = function(url, done) {
620624
let iframeHtml = exports.createTrackPixelIframeHtml(url, false, 'allow-scripts allow-same-origin');
621625
let div = document.createElement('div');
622626
div.innerHTML = iframeHtml;
623627
let iframe = div.firstChild;
628+
if (done && exports.isFn(done)) {
629+
iframe.addEventListener('load', done);
630+
iframe.addEventListener('error', done);
631+
}
624632
exports.insertElement(iframe);
625633
};
626634

0 commit comments

Comments
 (0)