Skip to content

Commit 74dcdfa

Browse files
jsnellbakermkendall07
authored andcommitted
Fix #3265 - pbs cookie sync race condition (#3393)
* Fix #3265 - pbs cookie sync race condition * add/update jsdoc comments
1 parent 3c9592f commit 74dcdfa

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

modules/prebidServerBidAdapter/index.js

+20-4
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ function queueSync(bidderCodes, gdprConsent) {
150150
(response) => {
151151
try {
152152
response = JSON.parse(response);
153-
response.bidder_status.forEach(bidder => doBidderSync(bidder.usersync.type, bidder.usersync.url, bidder.bidder));
153+
doAllSyncs(response.bidder_status);
154154
} catch (e) {
155155
utils.logError(e);
156156
}
@@ -162,24 +162,40 @@ function queueSync(bidderCodes, gdprConsent) {
162162
});
163163
}
164164

165+
function doAllSyncs(bidders) {
166+
if (bidders.length === 0) {
167+
return;
168+
}
169+
170+
const thisSync = bidders.pop();
171+
if (thisSync.no_cookie) {
172+
doBidderSync(thisSync.usersync.type, thisSync.usersync.url, thisSync.bidder, doAllSyncs.bind(null, bidders));
173+
} else {
174+
doAllSyncs(bidders);
175+
}
176+
}
177+
165178
/**
166179
* Run a cookie sync for the given type, url, and bidder
167180
*
168181
* @param {string} type the type of sync, "image", "redirect", "iframe"
169182
* @param {string} url the url to sync
170183
* @param {string} bidder name of bidder doing sync for
184+
* @param {function} done an exit callback; to signify this pixel has either: finished rendering or something went wrong
171185
*/
172-
function doBidderSync(type, url, bidder) {
186+
function doBidderSync(type, url, bidder, done) {
173187
if (!url) {
174188
utils.logError(`No sync url for bidder "${bidder}": ${url}`);
189+
done();
175190
} else if (type === 'image' || type === 'redirect') {
176191
utils.logMessage(`Invoking image pixel user sync for bidder: "${bidder}"`);
177-
utils.triggerPixel(url);
192+
utils.triggerPixel(url, done);
178193
} else if (type == 'iframe') {
179194
utils.logMessage(`Invoking iframe user sync for bidder: "${bidder}"`);
180-
utils.insertUserSyncIframe(url);
195+
utils.insertUserSyncIframe(url, done);
181196
} else {
182197
utils.logError(`User sync type "${type}" not supported for bidder: "${bidder}"`);
198+
done();
183199
}
184200
}
185201

src/utils.js

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

571-
exports.triggerPixel = function (url) {
571+
/**
572+
* Inserts an image pixel with the specified `url` for cookie sync
573+
* @param {string} url URL string of the image pixel to load
574+
* @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
575+
*/
576+
exports.triggerPixel = function (url, done) {
572577
const img = new Image();
578+
if (done && exports.isFn(done)) {
579+
img.addEventListener('load', done);
580+
img.addEventListener('error', done);
581+
}
573582
img.src = url;
574583
};
575584

@@ -615,12 +624,17 @@ exports.insertHtmlIntoIframe = function(htmlCode) {
615624
* Inserts empty iframe with the specified `url` for cookie sync
616625
* @param {string} url URL to be requested
617626
* @param {string} encodeUri boolean if URL should be encoded before inserted. Defaults to true
627+
* @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
618628
*/
619-
exports.insertUserSyncIframe = function(url) {
629+
exports.insertUserSyncIframe = function(url, done) {
620630
let iframeHtml = exports.createTrackPixelIframeHtml(url, false, 'allow-scripts allow-same-origin');
621631
let div = document.createElement('div');
622632
div.innerHTML = iframeHtml;
623633
let iframe = div.firstChild;
634+
if (done && exports.isFn(done)) {
635+
iframe.addEventListener('load', done);
636+
iframe.addEventListener('error', done);
637+
}
624638
exports.insertElement(iframe);
625639
};
626640

0 commit comments

Comments
 (0)