Skip to content

Commit ff240a1

Browse files
committed
Common user-sync
1 parent 7fba6dd commit ff240a1

File tree

2 files changed

+52
-20
lines changed

2 files changed

+52
-20
lines changed

src/adapters/adkernel.js

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,9 @@ const AdKernelAdapter = function AdKernelAdapter() {
5555
}
5656
if (syncedHostZones[host].indexOf(zone) === -1) {
5757
syncedHostZones[host].push(zone);
58-
insertUserSync(host, zone);
5958
}
6059
};
6160

62-
function insertUserSync(host, zone) {
63-
var iframe = utils.createInvisibleIframe();
64-
iframe.src = `//${host}/user-sync?zone=${zone}`;
65-
try {
66-
document.body.appendChild(iframe);
67-
} catch (error) {
68-
/* istanbul ignore next */
69-
utils.logError(error);
70-
}
71-
}
72-
7361
/**
7462
* Main function to get bid requests
7563
*/
@@ -82,6 +70,16 @@ const AdKernelAdapter = function AdKernelAdapter() {
8270
});
8371
});
8472
};
73+
/**
74+
* Build flat user-sync queue from host->zones mapping
75+
*/
76+
this.buildUserSyncQueue = function() {
77+
return Object.keys(syncedHostZones)
78+
.reduce((m, k) => {
79+
syncedHostZones[k].forEach((v) => m.push([k, v]));
80+
return m;
81+
}, []);
82+
};
8583

8684
function dispatchRtbRequest(host, zone, impressions, callback) {
8785
let url = buildEndpointUrl(host);
@@ -160,7 +158,9 @@ const AdKernelAdapter = function AdKernelAdapter() {
160158
dispatcher.addImp(bid);
161159
}
162160
});
163-
//process bids grouped into bidrequests
161+
//start async usersync
162+
processUserSyncQueue(dispatcher.buildUserSyncQueue());
163+
//process bids grouped into bid requests
164164
dispatcher.dispatch((bid, imp, bidResp) => {
165165
let adUnitId = bid.placementCode;
166166
if (bidResp) {
@@ -221,6 +221,32 @@ const AdKernelAdapter = function AdKernelAdapter() {
221221
};
222222
}
223223

224+
/**
225+
* Recursively process user-sync queue
226+
*/
227+
function processUserSyncQueue(queue) {
228+
if (queue.length === 0) {
229+
return;
230+
}
231+
let entry = queue.pop();
232+
insertUserSync(entry[0], entry[1], () => processUserSyncQueue(queue));
233+
}
234+
235+
/**
236+
* Insert single iframe user-sync
237+
*/
238+
function insertUserSync(host, zone, callback) {
239+
var iframe = utils.createInvisibleIframe();
240+
iframe.src = `//sync.adkernel.com/user-sync?zone=${zone}&r=%2F%2F${host}%2Fuser-synced%3Fuid%3D%7BUID%7D`;
241+
utils.addEventHandler(iframe, 'load', callback);
242+
try {
243+
document.body.appendChild(iframe);
244+
} catch (error) {
245+
/* istanbul ignore next */
246+
utils.logError(error);
247+
}
248+
}
249+
224250
return {
225251
callBids: baseAdapter.callBids,
226252
setBidderCode: baseAdapter.setBidderCode,

test/spec/adapters/adkernel_spec.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,21 +242,27 @@ describe('Adkernel adapter', () => {
242242
sandbox.spy(utils, 'createTrackPixelHtml');
243243
ajaxStub.onCall(0).callsArgWith(1, JSON.stringify(bidResponse1));
244244
doRequest([bid1_zone1]);
245-
expect(bidmanager.addBidResponse.firstCall.args[1].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD);
246245
expect(utils.createTrackPixelHtml.calledOnce);
247-
let result = pbjs.getBidResponsesForAdUnitCode(bid1_zone1.placementCode);
246+
expect(bidmanager.addBidResponse.firstCall.args[1].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD);
248247
let expectedNurl = bidResponse1.seatbid[0].bid[0].nurl + '&px=1';
249-
expect(result.bids[0].ad).to.include(expectedNurl);
248+
expect(bidmanager.addBidResponse.firstCall.args[1].ad).to.include(expectedNurl);
250249
});
251250

252251
it('should perform usersync for each unique host/zone combination', () => {
253252
ajaxStub.callsArgWith(1, '');
254-
const expectedSyncUrls = ['http://rtb.adkernel.com/user-sync?zone=1', 'http://rtb.adkernel.com/user-sync?zone=2',
255-
'http://rtb-private.adkernel.com/user-sync?zone=1'];
256-
sandbox.spy(utils, 'createInvisibleIframe');
253+
const expectedSyncUrls = ['//sync.adkernel.com/user-sync?zone=1&r=%2F%2Frtb-private.adkernel.com%2Fuser-synced%3Fuid%3D%7BUID%7D',
254+
'//sync.adkernel.com/user-sync?zone=2&r=%2F%2Frtb.adkernel.com%2Fuser-synced%3Fuid%3D%7BUID%7D',
255+
'//sync.adkernel.com/user-sync?zone=1&r=%2F%2Frtb.adkernel.com%2Fuser-synced%3Fuid%3D%7BUID%7D'];
256+
let userSyncUrls = [];
257+
sandbox.stub(utils, 'createInvisibleIframe', () => {
258+
return {};
259+
});
260+
sandbox.stub(utils, 'addEventHandler', (el, ev, cb) => {
261+
userSyncUrls.push(el.src);
262+
cb(); //instant callback
263+
});
257264
doRequest([bid1_zone1, bid2_zone2, bid2_zone2, bid3_host2]);
258265
expect(utils.createInvisibleIframe.calledThrice);
259-
let userSyncUrls = utils.createInvisibleIframe.returnValues.map( val => val.src);
260266
expect(userSyncUrls).to.be.eql(expectedSyncUrls);
261267
});
262268

0 commit comments

Comments
 (0)