prebid.js 6.26.0 → 6.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/adWMGAnalyticsAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adfBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
- package/dist/adlooxAdServerVideo.js +1 -1
- package/dist/adlooxAnalyticsAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adoceanBidAdapter.js +1 -1
- package/dist/adomikAnalyticsAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adxpremiumAnalyticsAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/akamaiDapRtdProvider.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/atsAnalyticsAdapter.js +1 -1
- package/dist/audiencerunBidAdapter.js +1 -1
- package/dist/automatadBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bluebillywigBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/colossussspBidAdapter.js +1 -1
- package/dist/concertAnalyticsAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/datablocksAnalyticsAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningAnalyticsAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/ftrackIdSystem.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronAnalyticsAdapter.js +1 -1
- package/dist/hadronRtdProvider.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/impactifyBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/incrxBidAdapter.js +1 -0
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/inskinBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/invisiblyAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoAnalyticsAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/koblerBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/mantisBidAdapter.js +1 -1
- package/dist/marsmediaAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediakeysBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/medianetRtdProvider.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/merkleIdSystem.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/naveggIdSystem.js +1 -1
- package/dist/not-for-prod/prebid.js +178 -176
- package/dist/novatiqIdSystem.js +1 -1
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/oneVideoBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxAnalyticsAdapter.js +1 -1
- package/dist/optimonAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +3 -3
- package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
- package/dist/pubCommonId.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubperfAnalyticsAdapter.js +1 -1
- package/dist/pubstackAnalyticsAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pulsepointAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/realvuAnalyticsAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevantAnalyticsAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rivrAnalyticsAdapter.js +1 -1
- package/dist/roxotAnalyticsAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/scaleableAnalyticsAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharedIdSystem.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/sigmoidAnalyticsAdapter.js +1 -1
- package/dist/slimcutBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiAnalyticsAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sortableAnalyticsAdapter.js +1 -1
- package/dist/sortableBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/spotxBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/staqAnalyticsAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -0
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/telariaBidAdapter.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/trustxBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspBidAdapter.js +1 -1
- package/integrationExamples/gpt/akamaidap_segments_example.html +5 -3
- package/modules/.submodules.json +1 -0
- package/modules/adfBidAdapter.js +0 -3
- package/modules/adlooxAnalyticsAdapter.js +9 -5
- package/modules/adlooxAnalyticsAdapter.md +3 -3
- package/modules/adlooxRtdProvider.js +3 -5
- package/modules/adlooxRtdProvider.md +2 -2
- package/modules/adoceanBidAdapter.js +29 -1
- package/modules/adyoulikeBidAdapter.js +3 -0
- package/modules/akamaiDapRtdProvider.js +469 -139
- package/modules/akamaiDapRtdProvider.md +5 -3
- package/modules/automatadBidAdapter.js +9 -5
- package/modules/colossussspBidAdapter.js +17 -17
- package/modules/conversantBidAdapter.js +2 -2
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/ftrackIdSystem.js +5 -8
- package/modules/gdprEnforcement.js +15 -9
- package/modules/gridBidAdapter.js +4 -0
- package/modules/hadronAnalyticsAdapter.js +5 -1
- package/modules/hadronRtdProvider.js +15 -13
- package/modules/incrxBidAdapter.js +87 -0
- package/modules/{vertozBidAdapter.md → incrxBidAdapter.md} +6 -6
- package/modules/inskinBidAdapter.js +4 -3
- package/modules/insticatorBidAdapter.js +109 -42
- package/modules/ixBidAdapter.js +3 -2
- package/modules/ixBidAdapter.md +1 -1
- package/modules/kargoBidAdapter.js +32 -1
- package/modules/koblerBidAdapter.js +54 -45
- package/modules/koblerBidAdapter.md +12 -17
- package/modules/mantisBidAdapter.js +4 -8
- package/modules/medianetBidAdapter.js +2 -2
- package/modules/medianetRtdProvider.js +4 -6
- package/modules/merkleIdSystem.js +43 -31
- package/modules/naveggIdSystem.js +3 -2
- package/modules/novatiqIdSystem.js +6 -1
- package/modules/pubCommonId.js +2 -1
- package/modules/pubmaticAnalyticsAdapter.js +49 -33
- package/modules/relaidoBidAdapter.js +0 -3
- package/modules/sharedIdSystem.js +5 -11
- package/modules/slimcutBidAdapter.js +2 -2
- package/modules/spotxBidAdapter.js +1 -1
- package/modules/synacormediaBidAdapter.js +11 -2
- package/modules/taboolaBidAdapter.js +265 -0
- package/modules/taboolaBidAdapter.md +49 -0
- package/modules/telariaBidAdapter.js +3 -3
- package/modules/userId/eids.js +25 -5
- package/modules/zeta_global_sspBidAdapter.js +3 -2
- package/package.json +1 -1
- package/src/AnalyticsAdapter.js +5 -1
- package/src/adloader.js +6 -1
- package/src/storageManager.js +5 -4
- package/test/mocks/analyticsStub.js +13 -0
- package/test/mocks/xhr.js +22 -0
- package/test/spec/AnalyticsAdapter_spec.js +4 -0
- package/test/spec/modules/adfBidAdapter_spec.js +1 -1
- package/test/spec/modules/adoceanBidAdapter_spec.js +25 -1
- package/test/spec/modules/adriverIdSystem_spec.js +7 -3
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +16 -1
- package/test/spec/modules/akamaiDapRtdProvider_spec.js +457 -109
- package/test/spec/modules/automatadBidAdapter_spec.js +4 -0
- package/test/spec/modules/conversantBidAdapter_spec.js +36 -5
- package/test/spec/modules/datablocksBidAdapter_spec.js +9 -8
- package/test/spec/modules/eids_spec.js +48 -3
- package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +4 -4
- package/test/spec/modules/ftrackIdSystem_spec.js +11 -22
- package/test/spec/modules/gdprEnforcement_spec.js +100 -53
- package/test/spec/modules/gridBidAdapter_spec.js +11 -0
- package/test/spec/modules/incrxBidAdapter_spec.js +100 -0
- package/test/spec/modules/insticatorBidAdapter_spec.js +46 -1
- package/test/spec/modules/ixBidAdapter_spec.js +1 -1
- package/test/spec/modules/kargoBidAdapter_spec.js +27 -0
- package/test/spec/modules/koblerBidAdapter_spec.js +160 -124
- package/test/spec/modules/medianetRtdProvider_spec.js +146 -0
- package/test/spec/modules/merkleIdSystem_spec.js +58 -37
- package/test/spec/modules/naveggIdSystem_spec.js +25 -1
- package/test/spec/modules/proxistoreBidAdapter_spec.js +0 -2
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +117 -0
- package/test/spec/modules/sovrnBidAdapter_spec.js +253 -264
- package/test/spec/modules/synacormediaBidAdapter_spec.js +74 -0
- package/test/spec/modules/taboolaBidAdapter_spec.js +455 -0
- package/test/spec/modules/userId_spec.js +27 -1
- package/test/spec/modules/vidazooBidAdapter_spec.js +9 -4
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +4 -2
- package/test/test_deps.js +1 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {config} from '../src/config.js';
|
|
2
|
-
import {BANNER} from '../src/mediaTypes.js';
|
|
2
|
+
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
3
3
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
4
4
|
import {deepAccess, generateUUID, logError, isArray} from '../src/utils.js';
|
|
5
5
|
import {getStorageManager} from '../src/storageManager.js';
|
|
@@ -48,14 +48,9 @@ function setUserId(userId) {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
function
|
|
51
|
+
function buildBanner(bidRequest) {
|
|
52
52
|
const format = [];
|
|
53
|
-
const
|
|
54
|
-
insticator: {
|
|
55
|
-
adUnitId: bidRequest.params.adUnitId,
|
|
56
|
-
},
|
|
57
|
-
}
|
|
58
|
-
|
|
53
|
+
const pos = deepAccess(bidRequest, 'mediaTypes.banner.pos');
|
|
59
54
|
const sizes =
|
|
60
55
|
deepAccess(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes;
|
|
61
56
|
|
|
@@ -66,27 +61,47 @@ function buildImpression(bidRequest) {
|
|
|
66
61
|
});
|
|
67
62
|
}
|
|
68
63
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
ext.gpid = gpid;
|
|
64
|
+
return {
|
|
65
|
+
format,
|
|
66
|
+
pos,
|
|
73
67
|
}
|
|
68
|
+
}
|
|
74
69
|
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
const
|
|
70
|
+
function buildVideo(bidRequest) {
|
|
71
|
+
const w = deepAccess(bidRequest, 'mediaTypes.video.w');
|
|
72
|
+
const h = deepAccess(bidRequest, 'mediaTypes.video.h');
|
|
73
|
+
const mimes = deepAccess(bidRequest, 'mediaTypes.video.mimes');
|
|
78
74
|
|
|
79
75
|
return {
|
|
76
|
+
mimes,
|
|
77
|
+
w,
|
|
78
|
+
h,
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function buildImpression(bidRequest) {
|
|
83
|
+
const imp = {
|
|
80
84
|
id: bidRequest.bidId,
|
|
81
85
|
tagid: bidRequest.adUnitCode,
|
|
82
|
-
instl,
|
|
83
|
-
secure,
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
86
|
+
instl: deepAccess(bidRequest, 'ortb2Imp.instl'),
|
|
87
|
+
secure: location.protocol === 'https:' ? 1 : 0,
|
|
88
|
+
ext: {
|
|
89
|
+
gpid: deepAccess(bidRequest, 'ortb2Imp.ext.gpid'),
|
|
90
|
+
insticator: {
|
|
91
|
+
adUnitId: bidRequest.params.adUnitId,
|
|
92
|
+
},
|
|
87
93
|
},
|
|
88
|
-
|
|
89
|
-
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (deepAccess(bidRequest, 'mediaTypes.banner')) {
|
|
97
|
+
imp.banner = buildBanner(bidRequest);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (deepAccess(bidRequest, 'mediaTypes.video')) {
|
|
101
|
+
imp.video = buildVideo(bidRequest);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return imp;
|
|
90
105
|
}
|
|
91
106
|
|
|
92
107
|
function buildDevice() {
|
|
@@ -252,31 +267,83 @@ function validateSizes(sizes) {
|
|
|
252
267
|
);
|
|
253
268
|
}
|
|
254
269
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
270
|
+
function validateAdUnitId(bid) {
|
|
271
|
+
if (!bid.params.adUnitId) {
|
|
272
|
+
logError('insticator: missing adUnitId bid parameter');
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
259
275
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
logError('insticator: missing adUnitId bid parameter');
|
|
263
|
-
return false;
|
|
264
|
-
}
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
265
278
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
279
|
+
function validateMediaType(bid) {
|
|
280
|
+
if (!(BANNER in bid.mediaTypes || VIDEO in bid.mediaTypes)) {
|
|
281
|
+
logError('insticator: expected banner or video in mediaTypes');
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
270
284
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
!validateSizes(bid.mediaTypes.banner.sizes)
|
|
274
|
-
) {
|
|
275
|
-
logError('insticator: banner sizes not specified or invalid');
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
278
287
|
|
|
288
|
+
function validateBanner(bid) {
|
|
289
|
+
const banner = deepAccess(bid, 'mediaTypes.banner');
|
|
290
|
+
|
|
291
|
+
if (banner === undefined) {
|
|
279
292
|
return true;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (
|
|
296
|
+
!validateSizes(bid.sizes) &&
|
|
297
|
+
!validateSizes(bid.mediaTypes.banner.sizes)
|
|
298
|
+
) {
|
|
299
|
+
logError('insticator: banner sizes not specified or invalid');
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function validateVideo(bid) {
|
|
307
|
+
const video = deepAccess(bid, 'mediaTypes.video');
|
|
308
|
+
|
|
309
|
+
if (video === undefined) {
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const videoSize = [
|
|
314
|
+
deepAccess(bid, 'mediaTypes.video.w'),
|
|
315
|
+
deepAccess(bid, 'mediaTypes.video.h'),
|
|
316
|
+
];
|
|
317
|
+
|
|
318
|
+
if (
|
|
319
|
+
!validateSize(videoSize)
|
|
320
|
+
) {
|
|
321
|
+
logError('insticator: video size not specified or invalid');
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const mimes = deepAccess(bid, 'mediaTypes.video.mimes');
|
|
326
|
+
|
|
327
|
+
if (!Array.isArray(mimes) || mimes.length === 0) {
|
|
328
|
+
logError('insticator: mimes not specified');
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export const spec = {
|
|
336
|
+
code: BIDDER_CODE,
|
|
337
|
+
gvlid: GVLID,
|
|
338
|
+
supportedMediaTypes: [ BANNER, VIDEO ],
|
|
339
|
+
|
|
340
|
+
isBidRequestValid: function (bid) {
|
|
341
|
+
return (
|
|
342
|
+
validateAdUnitId(bid) &&
|
|
343
|
+
validateMediaType(bid) &&
|
|
344
|
+
validateBanner(bid) &&
|
|
345
|
+
validateVideo(bid)
|
|
346
|
+
);
|
|
280
347
|
},
|
|
281
348
|
|
|
282
349
|
buildRequests: function (validBidRequests, bidderRequest) {
|
package/modules/ixBidAdapter.js
CHANGED
|
@@ -30,7 +30,8 @@ import {Renderer} from '../src/Renderer.js';
|
|
|
30
30
|
const BIDDER_CODE = 'ix';
|
|
31
31
|
const ALIAS_BIDDER_CODE = 'roundel';
|
|
32
32
|
const GLOBAL_VENDOR_ID = 10;
|
|
33
|
-
const
|
|
33
|
+
const MODULE_TYPE = 'bid-adapter';
|
|
34
|
+
const SECURE_BID_URL = 'https://htlb.casalemedia.com/openrtb/pbjs';
|
|
34
35
|
const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
|
|
35
36
|
const BANNER_ENDPOINT_VERSION = 7.2;
|
|
36
37
|
const VIDEO_ENDPOINT_VERSION = 8.1;
|
|
@@ -1086,7 +1087,7 @@ function localStorageHandler(data) {
|
|
|
1086
1087
|
hasEnforcementHook: false,
|
|
1087
1088
|
valid: hasDeviceAccess()
|
|
1088
1089
|
};
|
|
1089
|
-
validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
|
|
1090
|
+
validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, MODULE_TYPE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
|
|
1090
1091
|
if (permissions.valid) {
|
|
1091
1092
|
storeErrorEventData(data);
|
|
1092
1093
|
}
|
package/modules/ixBidAdapter.md
CHANGED
|
@@ -423,4 +423,4 @@ The `size` parameter is no longer a required field, the `siteId` will now be ass
|
|
|
423
423
|
In your browser of choice, create a new tab and open the developer tools. In
|
|
424
424
|
developer tools, select the network tab. Then, navigate to a page where IX is
|
|
425
425
|
setup to bid. Now, in the network tab, search for requests to
|
|
426
|
-
`casalemedia.com/
|
|
426
|
+
`casalemedia.com/openrtb/pbjs`. These are the bid requests.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _each } from '../src/utils.js';
|
|
1
|
+
import { _each, buildUrl, triggerPixel } from '../src/utils.js';
|
|
2
2
|
import { config } from '../src/config.js';
|
|
3
3
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
4
4
|
import { getStorageManager } from '../src/storageManager.js';
|
|
@@ -55,6 +55,10 @@ export const spec = {
|
|
|
55
55
|
},
|
|
56
56
|
bidIDs,
|
|
57
57
|
bidSizes,
|
|
58
|
+
device: {
|
|
59
|
+
width: window.screen.width,
|
|
60
|
+
height: window.screen.height
|
|
61
|
+
},
|
|
58
62
|
prebidRawBidRequests: validBidRequests
|
|
59
63
|
}, spec._getAllMetadata(tdid, bidderRequest.uspConsent, bidderRequest.gdprConsent));
|
|
60
64
|
const encodedParams = encodeURIComponent(JSON.stringify(transformedParams));
|
|
@@ -133,6 +137,15 @@ export const spec = {
|
|
|
133
137
|
return syncs;
|
|
134
138
|
},
|
|
135
139
|
supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
|
|
140
|
+
onTimeout: function(timeoutData) {
|
|
141
|
+
if (timeoutData == null) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
timeoutData.forEach((bid) => {
|
|
146
|
+
this._sendTimeoutData(bid.auctionId, bid.timeout);
|
|
147
|
+
});
|
|
148
|
+
},
|
|
136
149
|
|
|
137
150
|
// PRIVATE
|
|
138
151
|
_readCookie(name) {
|
|
@@ -263,6 +276,24 @@ export const spec = {
|
|
|
263
276
|
} catch (e) {
|
|
264
277
|
return '';
|
|
265
278
|
}
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
_sendTimeoutData(auctionId, auctionTimeout) {
|
|
282
|
+
let params = {
|
|
283
|
+
aid: auctionId,
|
|
284
|
+
ato: auctionTimeout,
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
let timeoutRequestUrl = buildUrl({
|
|
289
|
+
protocol: 'https',
|
|
290
|
+
hostname: 'krk.kargo.com',
|
|
291
|
+
pathname: '/api/v1/event/timeout',
|
|
292
|
+
search: params
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
triggerPixel(timeoutRequestUrl);
|
|
296
|
+
} catch (e) {}
|
|
266
297
|
}
|
|
267
298
|
};
|
|
268
299
|
registerBidder(spec);
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
deepAccess,
|
|
3
|
+
getWindowSelf,
|
|
4
|
+
isArray,
|
|
5
|
+
isStr,
|
|
6
|
+
parseQueryStringParameters,
|
|
7
|
+
replaceAuctionPrice,
|
|
8
|
+
triggerPixel
|
|
9
|
+
} from '../src/utils.js';
|
|
2
10
|
import {config} from '../src/config.js';
|
|
3
11
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
4
12
|
import {BANNER} from '../src/mediaTypes.js';
|
|
@@ -6,19 +14,26 @@ import {getRefererInfo} from '../src/refererDetection.js';
|
|
|
6
14
|
|
|
7
15
|
const BIDDER_CODE = 'kobler';
|
|
8
16
|
const BIDDER_ENDPOINT = 'https://bid.essrtb.com/bid/prebid_rtb_call';
|
|
17
|
+
const DEV_BIDDER_ENDPOINT = 'https://bid-service.dev.essrtb.com/bid/prebid_rtb_call';
|
|
9
18
|
const TIMEOUT_NOTIFICATION_ENDPOINT = 'https://bid.essrtb.com/notify/prebid_timeout';
|
|
10
19
|
const SUPPORTED_CURRENCY = 'USD';
|
|
11
20
|
const DEFAULT_TIMEOUT = 1000;
|
|
12
21
|
const TIME_TO_LIVE_IN_SECONDS = 10 * 60;
|
|
13
22
|
|
|
14
23
|
export const isBidRequestValid = function (bid) {
|
|
15
|
-
|
|
24
|
+
if (!bid || !bid.bidId) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const sizes = deepAccess(bid, 'mediaTypes.banner.sizes', bid.sizes);
|
|
29
|
+
return isArray(sizes) && sizes.length > 0;
|
|
16
30
|
};
|
|
17
31
|
|
|
18
32
|
export const buildRequests = function (validBidRequests, bidderRequest) {
|
|
33
|
+
const bidderEndpoint = isTest(validBidRequests[0]) ? DEV_BIDDER_ENDPOINT : BIDDER_ENDPOINT;
|
|
19
34
|
return {
|
|
20
35
|
method: 'POST',
|
|
21
|
-
url:
|
|
36
|
+
url: bidderEndpoint,
|
|
22
37
|
data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest),
|
|
23
38
|
options: {
|
|
24
39
|
contentType: 'application/json'
|
|
@@ -27,14 +42,11 @@ export const buildRequests = function (validBidRequests, bidderRequest) {
|
|
|
27
42
|
};
|
|
28
43
|
|
|
29
44
|
export const interpretResponse = function (serverResponse) {
|
|
30
|
-
const adServerPriceCurrency = config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
|
|
31
45
|
const res = serverResponse.body;
|
|
32
46
|
const bids = []
|
|
33
47
|
if (res) {
|
|
34
48
|
res.seatbid.forEach(sb => {
|
|
35
49
|
sb.bid.forEach(b => {
|
|
36
|
-
const adWithCorrectCurrency = b.adm
|
|
37
|
-
.replace(/\${AUCTION_PRICE_CURRENCY}/g, adServerPriceCurrency);
|
|
38
50
|
bids.push({
|
|
39
51
|
requestId: b.impid,
|
|
40
52
|
cpm: b.price,
|
|
@@ -45,7 +57,7 @@ export const interpretResponse = function (serverResponse) {
|
|
|
45
57
|
dealId: b.dealid,
|
|
46
58
|
netRevenue: true,
|
|
47
59
|
ttl: TIME_TO_LIVE_IN_SECONDS,
|
|
48
|
-
ad:
|
|
60
|
+
ad: b.adm,
|
|
49
61
|
nurl: b.nurl,
|
|
50
62
|
meta: {
|
|
51
63
|
advertiserDomains: b.adomain
|
|
@@ -58,13 +70,15 @@ export const interpretResponse = function (serverResponse) {
|
|
|
58
70
|
};
|
|
59
71
|
|
|
60
72
|
export const onBidWon = function (bid) {
|
|
61
|
-
|
|
62
|
-
|
|
73
|
+
// We intentionally use the price set by the publisher to replace the ${AUCTION_PRICE} macro
|
|
74
|
+
// instead of the `originalCpm` here. This notification is not used for billing, only for extra logging.
|
|
75
|
+
const publisherPrice = bid.cpm || 0;
|
|
76
|
+
const publisherCurrency = bid.currency || config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
|
|
63
77
|
const adServerPrice = deepAccess(bid, 'adserverTargeting.hb_pb', 0);
|
|
64
78
|
const adServerPriceCurrency = config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
|
|
65
79
|
if (isStr(bid.nurl) && bid.nurl !== '') {
|
|
66
|
-
const winNotificationUrl = replaceAuctionPrice(bid.nurl,
|
|
67
|
-
.replace(/\${AUCTION_PRICE_CURRENCY}/g,
|
|
80
|
+
const winNotificationUrl = replaceAuctionPrice(bid.nurl, publisherPrice)
|
|
81
|
+
.replace(/\${AUCTION_PRICE_CURRENCY}/g, publisherCurrency)
|
|
68
82
|
.replace(/\${AD_SERVER_PRICE}/g, adServerPrice)
|
|
69
83
|
.replace(/\${AD_SERVER_PRICE_CURRENCY}/g, adServerPriceCurrency);
|
|
70
84
|
triggerPixel(winNotificationUrl);
|
|
@@ -73,17 +87,13 @@ export const onBidWon = function (bid) {
|
|
|
73
87
|
|
|
74
88
|
export const onTimeout = function (timeoutDataArray) {
|
|
75
89
|
if (isArray(timeoutDataArray)) {
|
|
76
|
-
const
|
|
77
|
-
const pageUrl = (refererInfo && refererInfo.referer)
|
|
78
|
-
? refererInfo.referer
|
|
79
|
-
: window.location.href;
|
|
90
|
+
const pageUrl = getPageUrlFromRefererInfo();
|
|
80
91
|
timeoutDataArray.forEach(timeoutData => {
|
|
81
92
|
const query = parseQueryStringParameters({
|
|
82
93
|
ad_unit_code: timeoutData.adUnitCode,
|
|
83
94
|
auction_id: timeoutData.auctionId,
|
|
84
95
|
bid_id: timeoutData.bidId,
|
|
85
96
|
timeout: timeoutData.timeout,
|
|
86
|
-
placement_id: deepAccess(timeoutData, 'params.0.placementId'),
|
|
87
97
|
page_url: pageUrl,
|
|
88
98
|
});
|
|
89
99
|
const timeoutNotificationUrl = `${TIMEOUT_NOTIFICATION_ENDPOINT}?${query}`;
|
|
@@ -92,13 +102,28 @@ export const onTimeout = function (timeoutDataArray) {
|
|
|
92
102
|
}
|
|
93
103
|
};
|
|
94
104
|
|
|
95
|
-
function
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
105
|
+
function getPageUrlFromRefererInfo() {
|
|
106
|
+
const refererInfo = getRefererInfo();
|
|
107
|
+
return (refererInfo && refererInfo.referer)
|
|
108
|
+
? refererInfo.referer
|
|
109
|
+
: window.location.href;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function getPageUrlFromRequest(validBidRequest, bidderRequest) {
|
|
113
|
+
// pageUrl is considered only when testing to ensure that non-test requests always contain the correct URL
|
|
114
|
+
if (isTest(validBidRequest) && config.getConfig('pageUrl')) {
|
|
115
|
+
return config.getConfig('pageUrl');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return (bidderRequest.refererInfo && bidderRequest.refererInfo.referer)
|
|
99
119
|
? bidderRequest.refererInfo.referer
|
|
100
120
|
: window.location.href;
|
|
121
|
+
}
|
|
101
122
|
|
|
123
|
+
function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
|
|
124
|
+
const imps = validBidRequests.map(buildOpenRtbImpObject);
|
|
125
|
+
const timeout = bidderRequest.timeout || config.getConfig('bidderTimeout') || DEFAULT_TIMEOUT;
|
|
126
|
+
const pageUrl = getPageUrlFromRequest(validBidRequests[0], bidderRequest)
|
|
102
127
|
const request = {
|
|
103
128
|
id: bidderRequest.auctionId,
|
|
104
129
|
at: 1,
|
|
@@ -106,13 +131,12 @@ function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
|
|
|
106
131
|
cur: [SUPPORTED_CURRENCY],
|
|
107
132
|
imp: imps,
|
|
108
133
|
device: {
|
|
109
|
-
devicetype: getDevice()
|
|
110
|
-
geo: getGeo(validBidRequests[0])
|
|
134
|
+
devicetype: getDevice()
|
|
111
135
|
},
|
|
112
136
|
site: {
|
|
113
137
|
page: pageUrl,
|
|
114
138
|
},
|
|
115
|
-
test:
|
|
139
|
+
test: getTestAsNumber(validBidRequests[0])
|
|
116
140
|
};
|
|
117
141
|
|
|
118
142
|
return JSON.stringify(request);
|
|
@@ -128,14 +152,8 @@ function buildOpenRtbImpObject(validBidRequest) {
|
|
|
128
152
|
banner: {
|
|
129
153
|
format: buildFormatArray(sizes),
|
|
130
154
|
w: mainSize[0],
|
|
131
|
-
h: mainSize[1]
|
|
132
|
-
ext: {
|
|
133
|
-
kobler: {
|
|
134
|
-
pos: getPosition(validBidRequest)
|
|
135
|
-
}
|
|
136
|
-
}
|
|
155
|
+
h: mainSize[1]
|
|
137
156
|
},
|
|
138
|
-
tagid: validBidRequest.params.placementId,
|
|
139
157
|
bidfloor: floorInfo.floor,
|
|
140
158
|
bidfloorcur: floorInfo.currency,
|
|
141
159
|
pmp: buildPmpObject(validBidRequest)
|
|
@@ -157,17 +175,12 @@ function getDevice() {
|
|
|
157
175
|
return 2; // personal computers
|
|
158
176
|
}
|
|
159
177
|
|
|
160
|
-
function
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
zip: validBidRequest.params.zip
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
return {};
|
|
178
|
+
function getTestAsNumber(validBidRequest) {
|
|
179
|
+
return isTest(validBidRequest) ? 1 : 0;
|
|
167
180
|
}
|
|
168
181
|
|
|
169
|
-
function
|
|
170
|
-
return validBidRequest.params.test
|
|
182
|
+
function isTest(validBidRequest) {
|
|
183
|
+
return validBidRequest.params && validBidRequest.params.test === true;
|
|
171
184
|
}
|
|
172
185
|
|
|
173
186
|
function getSizes(validBidRequest) {
|
|
@@ -188,10 +201,6 @@ function buildFormatArray(sizes) {
|
|
|
188
201
|
});
|
|
189
202
|
}
|
|
190
203
|
|
|
191
|
-
function getPosition(validBidRequest) {
|
|
192
|
-
return parseInt(validBidRequest.params.position) || 0;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
204
|
function getFloorInfo(validBidRequest, mainSize) {
|
|
196
205
|
if (typeof validBidRequest.getFloor === 'function') {
|
|
197
206
|
const sizeParam = mainSize[0] === 0 && mainSize[1] === 0 ? '*' : mainSize;
|
|
@@ -209,11 +218,11 @@ function getFloorInfo(validBidRequest, mainSize) {
|
|
|
209
218
|
}
|
|
210
219
|
|
|
211
220
|
function getFloorPrice(validBidRequest) {
|
|
212
|
-
return parseFloat(validBidRequest
|
|
221
|
+
return parseFloat(deepAccess(validBidRequest, 'params.floorPrice', 0.0));
|
|
213
222
|
}
|
|
214
223
|
|
|
215
224
|
function buildPmpObject(validBidRequest) {
|
|
216
|
-
if (validBidRequest.params.dealIds) {
|
|
225
|
+
if (validBidRequest.params && validBidRequest.params.dealIds && isArray(validBidRequest.params.dealIds)) {
|
|
217
226
|
return {
|
|
218
227
|
deals: validBidRequest.params.dealIds.map(dealId => {
|
|
219
228
|
return {
|
|
@@ -12,14 +12,15 @@ This adapter currently only supports Banner Ads.
|
|
|
12
12
|
|
|
13
13
|
# Parameters
|
|
14
14
|
|
|
15
|
-
| Parameter (in `params`) | Scope
|
|
16
|
-
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
| Parameter (in `params`) | Scope | Type | Description | Example |
|
|
16
|
+
|-------------------------|----------|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------|
|
|
17
|
+
| test | Optional | Boolean | Whether the request is for testing only. When multiple ad units are submitted together, it is enough to set this parameter on the first one. Enables providing a custom URL through config.pageUrl. Defaults to false. | `true` |
|
|
18
|
+
| floorPrice | Optional | Float | Floor price in CPM and USD. Can be used as an alternative to the [Floors module](https://docs.prebid.org/dev-docs/modules/floors.html), which is also supported by this adapter. Defaults to 0. | `5.0` |
|
|
19
|
+
| dealIds | Optional | Array of Strings | Array of deal IDs. | `['abc328745', 'mxw243253']` |
|
|
20
|
+
|
|
21
|
+
## Implicit parameters
|
|
22
|
+
|
|
23
|
+
Kobler identifies the placement using the combination of the page URL and the allowed sizes. As a result, it's important that the correct sizes are provided in `banner.sizes` in order for Kobler to correctly identify the placement. The main, desired format should be the first element of this array.
|
|
23
24
|
|
|
24
25
|
# Test Parameters
|
|
25
26
|
```javascript
|
|
@@ -31,17 +32,14 @@ This adapter currently only supports Banner Ads.
|
|
|
31
32
|
}
|
|
32
33
|
},
|
|
33
34
|
bids: [{
|
|
34
|
-
bidder: 'kobler'
|
|
35
|
-
params: {
|
|
36
|
-
placementId: 'k5H7et3R0'
|
|
37
|
-
}
|
|
35
|
+
bidder: 'kobler'
|
|
38
36
|
}]
|
|
39
37
|
}];
|
|
40
38
|
```
|
|
41
39
|
|
|
42
40
|
In order to see a sample bid from Kobler (without a proper setup), you have to also do the following:
|
|
43
|
-
-
|
|
44
|
-
-
|
|
41
|
+
- Set the `test` parameter to `true`.
|
|
42
|
+
- Set `config.pageUrl` to `'https://www.tv2.no/mening-og-analyse/14555348/'`. This is necessary because Kobler only bids on recognized articles. Kobler runs its own test campaign to make sure there is always a bid for this specific page URL.
|
|
45
43
|
|
|
46
44
|
# Test Optional Parameters
|
|
47
45
|
```javascript
|
|
@@ -55,11 +53,8 @@ In order to see a sample bid from Kobler (without a proper setup), you have to a
|
|
|
55
53
|
bids: [{
|
|
56
54
|
bidder: 'kobler',
|
|
57
55
|
params: {
|
|
58
|
-
placementId: 'k5H7et3R0',
|
|
59
|
-
zip: '102 22',
|
|
60
56
|
test: true,
|
|
61
57
|
floorPrice: 5.0,
|
|
62
|
-
position: 1,
|
|
63
58
|
dealIds: ['abc328745', 'mxw243253']
|
|
64
59
|
}
|
|
65
60
|
}]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
2
2
|
import { getStorageManager } from '../src/storageManager.js';
|
|
3
|
+
import { ajax } from '../src/ajax.js';
|
|
3
4
|
|
|
4
5
|
export const storage = getStorageManager({bidderCode: 'mantis'});
|
|
5
6
|
|
|
@@ -10,12 +11,7 @@ function inIframe() {
|
|
|
10
11
|
return true;
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
var img = document.createElement('img');
|
|
15
|
-
img.src = url;
|
|
16
|
-
img.style.cssText = 'display:none !important;';
|
|
17
|
-
(parent || document.body).appendChild(img);
|
|
18
|
-
}
|
|
14
|
+
|
|
19
15
|
export function onVisible(win, element, doOnVisible, time, pct) {
|
|
20
16
|
var started = null;
|
|
21
17
|
var notified = false;
|
|
@@ -301,9 +297,9 @@ export function iframePostMessage (win, name, callback) {
|
|
|
301
297
|
|
|
302
298
|
onMessage('iframe', function (data) {
|
|
303
299
|
if (window.$sf) {
|
|
304
|
-
sfPostMessage(window.$sf, data.width, data.height, () =>
|
|
300
|
+
sfPostMessage(window.$sf, data.width, data.height, () => ajax(data.pixel));
|
|
305
301
|
} else {
|
|
306
|
-
iframePostMessage(window, data.frame, () =>
|
|
302
|
+
iframePostMessage(window, data.frame, () => ajax(data.pixel));
|
|
307
303
|
}
|
|
308
304
|
});
|
|
309
305
|
|
|
@@ -27,10 +27,10 @@ window.mnet = window.mnet || {};
|
|
|
27
27
|
window.mnet.queue = window.mnet.queue || [];
|
|
28
28
|
|
|
29
29
|
mnData.urlData = {
|
|
30
|
-
domain: parseUrl(refererInfo.referer).hostname,
|
|
30
|
+
domain: parseUrl(refererInfo.referer, {noDecodeWholeURL: true}).hostname,
|
|
31
31
|
page: refererInfo.referer,
|
|
32
32
|
isTop: refererInfo.reachedTop
|
|
33
|
-
}
|
|
33
|
+
};
|
|
34
34
|
|
|
35
35
|
$$PREBID_GLOBAL$$.medianetGlobals = $$PREBID_GLOBAL$$.medianetGlobals || {};
|
|
36
36
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {isEmptyStr, isFn, isStr, logError, mergeDeep} from '../src/utils.js';
|
|
2
|
+
import {loadExternalScript} from '../src/adloader.js';
|
|
2
3
|
import {submodule} from '../src/hook.js';
|
|
3
4
|
import {getGlobal} from '../src/prebidGlobal.js';
|
|
4
5
|
import {includes} from '../src/polyfill.js';
|
|
@@ -82,11 +83,8 @@ function executeCommand(command) {
|
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
function loadRtdScript(customerId) {
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
script.async = true;
|
|
88
|
-
script.src = getClientUrl(customerId, window.location.hostname);
|
|
89
|
-
insertElement(script, window.document, 'head');
|
|
86
|
+
const url = getClientUrl(customerId, window.location.hostname);
|
|
87
|
+
loadExternalScript(url, MODULE_NAME)
|
|
90
88
|
}
|
|
91
89
|
|
|
92
90
|
function getAdUnits(adUnits, adUnitCodes) {
|