prebid.js 7.48.0 → 7.50.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/README.md +3 -0
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/admixerBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/aidemBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/confiantRtdProvider.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dependencies.json +3 -0
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +136 -134
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/permutiveRtdProvider.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -0
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/silverpushBidAdapter.js +1 -0
- 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/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/video.js +1 -1
- package/dist/videoModule.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/yieldlabBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/videoModule/eventsUI/eventsUI.css +205 -0
- package/integrationExamples/videoModule/eventsUI/eventsUI.js +181 -0
- package/integrationExamples/videoModule/jwplayer/eventsUI.html +295 -0
- package/integrationExamples/videoModule/videojs/eventsUI.html +319 -0
- package/libraries/video/shared/helpers.js +14 -0
- package/modules/33acrossBidAdapter.js +1 -1
- package/modules/adgenerationBidAdapter.js +24 -15
- package/modules/admixerBidAdapter.js +15 -9
- package/modules/aidemBidAdapter.js +3 -1
- package/modules/appnexusBidAdapter.js +1 -0
- package/modules/beopBidAdapter.js +1 -0
- package/modules/confiantRtdProvider.js +15 -12
- package/modules/conversantAnalyticsAdapter.js +7 -5
- package/modules/conversantBidAdapter.js +1 -1
- package/modules/criteoBidAdapter.js +17 -1
- package/modules/gridBidAdapter.js +3 -0
- package/modules/ixBidAdapter.js +65 -47
- package/modules/kueezRtbBidAdapter.js +30 -33
- package/modules/liveIntentIdSystem.js +8 -4
- package/modules/magniteAnalyticsAdapter.js +26 -3
- package/modules/mgidBidAdapter.js +9 -8
- package/modules/minutemediaBidAdapter.js +6 -0
- package/modules/minutemediaplusBidAdapter.js +30 -32
- package/modules/nexx360BidAdapter.js +2 -1
- package/modules/permutiveRtdProvider.js +9 -38
- package/modules/prebidServerBidAdapter/index.js +1 -3
- package/modules/prebidServerBidAdapter/ortbConverter.js +5 -1
- package/modules/pubmaticAnalyticsAdapter.js +3 -2
- package/modules/retailspotBidAdapter .md +32 -0
- package/modules/retailspotBidAdapter.js +186 -0
- package/modules/riseBidAdapter.js +6 -0
- package/modules/rubiconBidAdapter.js +6 -2
- package/modules/silverpushBidAdapter.js +326 -0
- package/modules/silverpushBidAdapter.md +107 -0
- package/modules/ttdBidAdapter.js +23 -22
- package/modules/underdogmediaBidAdapter.js +2 -2
- package/modules/vidazooBidAdapter.js +28 -32
- package/modules/videoModule/adQueue.js +2 -2
- package/modules/videoModule/index.js +9 -5
- package/modules/yahoosspBidAdapter.js +6 -0
- package/modules/yahoosspBidAdapter.md +37 -0
- package/modules/yieldlabBidAdapter.js +27 -5
- package/package.json +1 -1
- package/src/adapterManager.js +4 -0
- package/src/adapters/bidderFactory.js +1 -0
- package/src/auction.js +2 -0
- package/src/prebid.js +36 -12
- package/src/utils/cpm.js +4 -1
- package/test/spec/modules/33acrossBidAdapter_spec.js +4 -3
- package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
- package/test/spec/modules/admixerBidAdapter_spec.js +64 -25
- package/test/spec/modules/aidemBidAdapter_spec.js +3 -0
- package/test/spec/modules/beopBidAdapter_spec.js +4 -0
- package/test/spec/modules/confiantRtdProvider_spec.js +4 -1
- package/test/spec/modules/conversantBidAdapter_spec.js +2 -1
- package/test/spec/modules/criteoBidAdapter_spec.js +109 -0
- package/test/spec/modules/gridBidAdapter_spec.js +3 -0
- package/test/spec/modules/ixBidAdapter_spec.js +66 -1
- package/test/spec/modules/kueezRtbBidAdapter_spec.js +3 -2
- package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +28 -0
- package/test/spec/modules/liveIntentIdSystem_spec.js +45 -0
- package/test/spec/modules/magniteAnalyticsAdapter_spec.js +16 -36
- package/test/spec/modules/mass_spec.js +2 -0
- package/test/spec/modules/mgidBidAdapter_spec.js +9 -9
- package/test/spec/modules/minutemediaBidAdapter_spec.js +18 -0
- package/test/spec/modules/minutemediaplusBidAdapter_spec.js +3 -2
- package/test/spec/modules/permutiveRtdProvider_spec.js +0 -20
- package/test/spec/modules/prebidServerBidAdapter_spec.js +96 -1
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +6 -1
- package/test/spec/modules/retailspotBidAdapter_spec.js +426 -0
- package/test/spec/modules/riseBidAdapter_spec.js +18 -0
- package/test/spec/modules/rubiconBidAdapter_spec.js +143 -67
- package/test/spec/modules/silverpushBidAdapter_spec.js +394 -0
- package/test/spec/modules/ttdBidAdapter_spec.js +129 -2
- package/test/spec/modules/underdogmediaBidAdapter_spec.js +1 -1
- package/test/spec/modules/vidazooBidAdapter_spec.js +3 -2
- package/test/spec/modules/videoModule/shared/helpers_spec.js +22 -0
- package/test/spec/modules/yahoosspBidAdapter_spec.js +60 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +8 -1
- package/test/spec/unit/core/bidderFactory_spec.js +9 -9
- package/test/spec/unit/pbjs_api_spec.js +59 -1
- package/test/spec/unit/utils/cpm_spec.js +56 -1
package/modules/ttdBidAdapter.js
CHANGED
|
@@ -2,6 +2,7 @@ import * as utils from '../src/utils.js';
|
|
|
2
2
|
import { config } from '../src/config.js';
|
|
3
3
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
4
4
|
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
5
|
+
import {isNumber} from '../src/utils.js';
|
|
5
6
|
|
|
6
7
|
const BIDADAPTERVERSION = 'TTD-PREBID-2022.06.28';
|
|
7
8
|
const BIDDER_CODE = 'ttd';
|
|
@@ -75,7 +76,7 @@ function getSource(validBidRequests) {
|
|
|
75
76
|
return source;
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
function getDevice() {
|
|
79
|
+
function getDevice(firstPartyData) {
|
|
79
80
|
const language = navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage;
|
|
80
81
|
let device = {
|
|
81
82
|
ua: navigator.userAgent,
|
|
@@ -84,6 +85,8 @@ function getDevice() {
|
|
|
84
85
|
connectiontype: getConnectionType()
|
|
85
86
|
};
|
|
86
87
|
|
|
88
|
+
utils.mergeDeep(device, firstPartyData.device)
|
|
89
|
+
|
|
87
90
|
return device;
|
|
88
91
|
};
|
|
89
92
|
|
|
@@ -114,7 +117,7 @@ function getConnectionType() {
|
|
|
114
117
|
}
|
|
115
118
|
}
|
|
116
119
|
|
|
117
|
-
function getUser(bidderRequest) {
|
|
120
|
+
function getUser(bidderRequest, firstPartyData) {
|
|
118
121
|
let user = {};
|
|
119
122
|
if (bidderRequest.gdprConsent) {
|
|
120
123
|
utils.deepSetValue(user, 'ext.consent', bidderRequest.gdprConsent.consentString);
|
|
@@ -129,13 +132,8 @@ function getUser(bidderRequest) {
|
|
|
129
132
|
utils.deepSetValue(user, 'ext.eids', eids);
|
|
130
133
|
}
|
|
131
134
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (ortb2UserData && ortb2UserData.length) {
|
|
135
|
-
user = utils.mergeDeep(user, {
|
|
136
|
-
data: [...ortb2UserData]
|
|
137
|
-
});
|
|
138
|
-
};
|
|
135
|
+
utils.mergeDeep(user, firstPartyData.user)
|
|
136
|
+
|
|
139
137
|
return user;
|
|
140
138
|
}
|
|
141
139
|
|
|
@@ -163,16 +161,6 @@ function getImpression(bidRequest) {
|
|
|
163
161
|
};
|
|
164
162
|
|
|
165
163
|
const gpid = utils.deepAccess(bidRequest, 'ortb2Imp.ext.gpid');
|
|
166
|
-
const tid = utils.deepAccess(bidRequest, 'ortb2Imp.ext.tid');
|
|
167
|
-
const rwdd = utils.deepAccess(bidRequest, 'ortb2Imp.rwdd');
|
|
168
|
-
if (gpid || tid) {
|
|
169
|
-
impression.ext = {}
|
|
170
|
-
if (gpid) { impression.ext.gpid = gpid }
|
|
171
|
-
if (tid) { impression.ext.tid = tid }
|
|
172
|
-
}
|
|
173
|
-
if (rwdd) {
|
|
174
|
-
impression.rwdd = rwdd;
|
|
175
|
-
}
|
|
176
164
|
const tagid = gpid || bidRequest.params.placementId;
|
|
177
165
|
if (tagid) {
|
|
178
166
|
impression.tagid = tagid;
|
|
@@ -197,6 +185,11 @@ function getImpression(bidRequest) {
|
|
|
197
185
|
impression.bidfloorcur = 'USD';
|
|
198
186
|
}
|
|
199
187
|
|
|
188
|
+
const secure = utils.deepAccess(bidRequest, 'ortb2Imp.secure');
|
|
189
|
+
impression.secure = isNumber(secure) ? secure : 1
|
|
190
|
+
|
|
191
|
+
utils.mergeDeep(impression, bidRequest.ortb2Imp)
|
|
192
|
+
|
|
200
193
|
return impression;
|
|
201
194
|
}
|
|
202
195
|
|
|
@@ -416,8 +409,8 @@ export const spec = {
|
|
|
416
409
|
id: bidderRequest.auctionId,
|
|
417
410
|
imp: validBidRequests.map(bidRequest => getImpression(bidRequest)),
|
|
418
411
|
site: getSite(bidderRequest, firstPartyData),
|
|
419
|
-
device: getDevice(),
|
|
420
|
-
user: getUser(bidderRequest),
|
|
412
|
+
device: getDevice(firstPartyData),
|
|
413
|
+
user: getUser(bidderRequest, firstPartyData),
|
|
421
414
|
at: 1,
|
|
422
415
|
cur: ['USD'],
|
|
423
416
|
regs: getRegs(bidderRequest),
|
|
@@ -433,6 +426,14 @@ export const spec = {
|
|
|
433
426
|
topLevel.badv = firstPartyData.badv;
|
|
434
427
|
}
|
|
435
428
|
|
|
429
|
+
if (firstPartyData && firstPartyData.app) {
|
|
430
|
+
topLevel.app = firstPartyData.app
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if (firstPartyData && firstPartyData.pmp) {
|
|
434
|
+
topLevel.pmp = firstPartyData.pmp
|
|
435
|
+
}
|
|
436
|
+
|
|
436
437
|
let url = BIDDER_ENDPOINT + bidderRequest.bids[0].params.supplySourceId;
|
|
437
438
|
|
|
438
439
|
let serverRequest = {
|
|
@@ -468,7 +469,7 @@ export const spec = {
|
|
|
468
469
|
* @param {ttdResponseObj} bidResponse A successful response from ttd.
|
|
469
470
|
* @param {ServerRequest} serverRequest The result of buildRequests() that lead to this response.
|
|
470
471
|
* @return {Bid[]} An array of formatted bids.
|
|
471
|
-
|
|
472
|
+
*/
|
|
472
473
|
interpretResponse: function (response, serverRequest) {
|
|
473
474
|
let seatBidsInResponse = utils.deepAccess(response, 'body.seatbid');
|
|
474
475
|
const currency = utils.deepAccess(response, 'body.cur');
|
|
@@ -74,7 +74,7 @@ export const spec = {
|
|
|
74
74
|
pbTimeout: config.getConfig('bidderTimeout'),
|
|
75
75
|
pbjsVersion: prebidVersion,
|
|
76
76
|
placements: [],
|
|
77
|
-
ref: deepAccess(bidderRequest, 'refererInfo.
|
|
77
|
+
ref: deepAccess(bidderRequest, 'refererInfo.page') ? bidderRequest.refererInfo.page : undefined,
|
|
78
78
|
usp: {},
|
|
79
79
|
userIds: {
|
|
80
80
|
'33acrossId': deepAccess(validBidRequests[0], 'userId.33acrossId.envelope') ? validBidRequests[0].userId['33acrossId'].envelope : undefined,
|
|
@@ -193,7 +193,7 @@ export const spec = {
|
|
|
193
193
|
creativeId: mid.mid,
|
|
194
194
|
currency: 'USD',
|
|
195
195
|
netRevenue: false,
|
|
196
|
-
ttl: mid.ttl ||
|
|
196
|
+
ttl: mid.ttl || 300,
|
|
197
197
|
meta: {
|
|
198
198
|
advertiserDomains: mid.advertiser_domains || []
|
|
199
199
|
}
|
|
@@ -15,18 +15,6 @@ const DEAL_ID_EXPIRY = 1000 * 60 * 15;
|
|
|
15
15
|
const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 60;
|
|
16
16
|
const SESSION_ID_KEY = 'vidSid';
|
|
17
17
|
const OPT_CACHE_KEY = 'vdzwopt';
|
|
18
|
-
export const SUPPORTED_ID_SYSTEMS = {
|
|
19
|
-
'britepoolid': 1,
|
|
20
|
-
'criteoId': 1,
|
|
21
|
-
'id5id': 1,
|
|
22
|
-
'idl_env': 1,
|
|
23
|
-
'lipb': 1,
|
|
24
|
-
'netId': 1,
|
|
25
|
-
'parrableId': 1,
|
|
26
|
-
'pubcid': 1,
|
|
27
|
-
'tdid': 1,
|
|
28
|
-
'pubProvidedId': 1
|
|
29
|
-
};
|
|
30
18
|
export const webSessionId = 'wsid_' + parseInt(Date.now() * Math.random());
|
|
31
19
|
const storage = getStorageManager({bidderCode: BIDDER_CODE});
|
|
32
20
|
|
|
@@ -180,25 +168,22 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
|
|
|
180
168
|
function appendUserIdsToRequestPayload(payloadRef, userIds) {
|
|
181
169
|
let key;
|
|
182
170
|
_each(userIds, (userId, idSystemProviderName) => {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
default:
|
|
200
|
-
payloadRef[key] = userId;
|
|
201
|
-
}
|
|
171
|
+
key = `uid.${idSystemProviderName}`;
|
|
172
|
+
switch (idSystemProviderName) {
|
|
173
|
+
case 'digitrustid':
|
|
174
|
+
payloadRef[key] = deepAccess(userId, 'data.id');
|
|
175
|
+
break;
|
|
176
|
+
case 'lipb':
|
|
177
|
+
payloadRef[key] = userId.lipbid;
|
|
178
|
+
break;
|
|
179
|
+
case 'parrableId':
|
|
180
|
+
payloadRef[key] = userId.eid;
|
|
181
|
+
break;
|
|
182
|
+
case 'id5id':
|
|
183
|
+
payloadRef[key] = userId.uid;
|
|
184
|
+
break;
|
|
185
|
+
default:
|
|
186
|
+
payloadRef[key] = userId;
|
|
202
187
|
}
|
|
203
188
|
});
|
|
204
189
|
}
|
|
@@ -227,7 +212,18 @@ function interpretResponse(serverResponse, request) {
|
|
|
227
212
|
|
|
228
213
|
try {
|
|
229
214
|
results.forEach(result => {
|
|
230
|
-
const {
|
|
215
|
+
const {
|
|
216
|
+
creativeId,
|
|
217
|
+
ad,
|
|
218
|
+
price,
|
|
219
|
+
exp,
|
|
220
|
+
width,
|
|
221
|
+
height,
|
|
222
|
+
currency,
|
|
223
|
+
advertiserDomains,
|
|
224
|
+
metaData,
|
|
225
|
+
mediaType = BANNER
|
|
226
|
+
} = result;
|
|
231
227
|
if (!ad || !price) {
|
|
232
228
|
return;
|
|
233
229
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AD_BREAK_END, AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, SETUP_COMPLETE } from '../../libraries/video/constants/events.js'
|
|
2
|
-
import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
|
|
2
|
+
import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
|
|
3
3
|
|
|
4
4
|
export function AdQueueCoordinator(videoCore, pbEvents) {
|
|
5
5
|
const storage = {};
|
|
@@ -58,6 +58,6 @@ export function AdQueueCoordinator(videoCore, pbEvents) {
|
|
|
58
58
|
|
|
59
59
|
function triggerEvent(eventName, adTagUrl, options) {
|
|
60
60
|
const payload = Object.assign({ adTagUrl }, options);
|
|
61
|
-
pbEvents.emit(getExternalVideoEventName(eventName), payload);
|
|
61
|
+
pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, payload));
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { config } from '../../src/config.js';
|
|
2
2
|
import { find } from '../../src/polyfill.js';
|
|
3
3
|
import * as events from '../../src/events.js';
|
|
4
|
-
import { mergeDeep } from '../../src/utils.js';
|
|
4
|
+
import { mergeDeep, logWarn } from '../../src/utils.js';
|
|
5
5
|
import { getGlobal } from '../../src/prebidGlobal.js';
|
|
6
6
|
import CONSTANTS from '../../src/constants.json';
|
|
7
7
|
import {
|
|
@@ -20,7 +20,7 @@ import { videoCoreFactory } from './coreVideo.js';
|
|
|
20
20
|
import { gamSubmoduleFactory } from './gamAdServerSubmodule.js';
|
|
21
21
|
import { videoImpressionVerifierFactory } from './videoImpressionVerifier.js';
|
|
22
22
|
import { AdQueueCoordinator } from './adQueue.js';
|
|
23
|
-
import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
|
|
23
|
+
import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
|
|
24
24
|
|
|
25
25
|
const allVideoEvents = Object.keys(videoEvents).map(eventKey => videoEvents[eventKey]);
|
|
26
26
|
events.addEvents(allVideoEvents.concat([AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, AUCTION_AD_LOAD_ABORT, BID_IMPRESSION, BID_ERROR]).map(getExternalVideoEventName));
|
|
@@ -54,7 +54,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
54
54
|
adQueueCoordinator.registerProvider(divId);
|
|
55
55
|
videoCore.initProvider(divId);
|
|
56
56
|
videoCore.onEvents(videoEvents, (type, payload) => {
|
|
57
|
-
pbEvents.emit(getExternalVideoEventName(type), payload);
|
|
57
|
+
pbEvents.emit(getExternalVideoEventName(type), getExternalVideoEventPayload(type, payload));
|
|
58
58
|
}, divId);
|
|
59
59
|
|
|
60
60
|
const adServerConfig = provider.adServer;
|
|
@@ -145,6 +145,10 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
145
145
|
video.context = ortbVideo.placement === PLACEMENT.INSTREAM ? 'instream' : 'outstream';
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
+
if (!video.plcmt) {
|
|
149
|
+
logWarn('Video.plcmt has not been set. Failure to set a value may result in loss of bids');
|
|
150
|
+
}
|
|
151
|
+
|
|
148
152
|
const width = ortbVideo.w;
|
|
149
153
|
const height = ortbVideo.h;
|
|
150
154
|
if (!video.playerSize && width && height) {
|
|
@@ -199,7 +203,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
199
203
|
|
|
200
204
|
const highestCpmBids = pbGlobal.getHighestCpmBids(adUnitCode);
|
|
201
205
|
if (!highestCpmBids.length) {
|
|
202
|
-
pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), options);
|
|
206
|
+
pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), getExternalVideoEventPayload(AUCTION_AD_LOAD_ABORT, options));
|
|
203
207
|
return;
|
|
204
208
|
}
|
|
205
209
|
|
|
@@ -223,7 +227,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
223
227
|
}
|
|
224
228
|
|
|
225
229
|
pbGlobal.markWinningBidAsUsed(bid);
|
|
226
|
-
pbEvents.emit(getExternalVideoEventName(eventName), { bid, adEvent: adEventPayload });
|
|
230
|
+
pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, { bid, adEvent: adEventPayload }));
|
|
227
231
|
}
|
|
228
232
|
|
|
229
233
|
function getBid(adPayload) {
|
|
@@ -380,6 +380,7 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
|
|
|
380
380
|
const ortb2Object = bid.ortb2;
|
|
381
381
|
const siteObject = deepAccess(ortb2Object, 'site') || undefined;
|
|
382
382
|
const siteContentObject = deepAccess(siteObject, 'content') || undefined;
|
|
383
|
+
const sitePublisherObject = deepAccess(siteObject, 'publisher') || undefined;
|
|
383
384
|
const siteContentDataArray = deepAccess(siteObject, 'content.data') || undefined;
|
|
384
385
|
const appContentObject = deepAccess(ortb2Object, 'app.content') || undefined;
|
|
385
386
|
const appContentDataArray = deepAccess(ortb2Object, 'app.content.data') || undefined;
|
|
@@ -394,6 +395,11 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
|
|
|
394
395
|
outBoundBidRequest.site = validateAppendObject('object', allowedSiteObjectKeys, siteObject, outBoundBidRequest.site);
|
|
395
396
|
};
|
|
396
397
|
|
|
398
|
+
if (sitePublisherObject && isPlainObject(sitePublisherObject)) {
|
|
399
|
+
const allowedPublisherObjectKeys = ['ext'];
|
|
400
|
+
outBoundBidRequest.site.publisher = validateAppendObject('object', allowedPublisherObjectKeys, sitePublisherObject, outBoundBidRequest.site.publisher);
|
|
401
|
+
}
|
|
402
|
+
|
|
397
403
|
if (siteContentObject && isPlainObject(siteContentObject)) {
|
|
398
404
|
const allowedContentStringKeys = ['id', 'title', 'series', 'season', 'genre', 'contentrating', 'language'];
|
|
399
405
|
const allowedContentNumberkeys = ['episode', 'prodq', 'context', 'livestream', 'len'];
|
|
@@ -435,6 +435,43 @@ pbjs.setConfig({
|
|
|
435
435
|
}
|
|
436
436
|
});
|
|
437
437
|
```
|
|
438
|
+
|
|
439
|
+
Notes: The first party site info is filtered and only the following specific keys are allowed in the bidRequests:
|
|
440
|
+
|
|
441
|
+
| Field | Type |
|
|
442
|
+
|-----------------------------|--------|
|
|
443
|
+
| site.name | String |
|
|
444
|
+
| site.domain | String |
|
|
445
|
+
| site.page | String |
|
|
446
|
+
| site.ref | String |
|
|
447
|
+
| site.keywords | String |
|
|
448
|
+
| site.search | String |
|
|
449
|
+
| site.cat | Array |
|
|
450
|
+
| site.sectioncat | Array |
|
|
451
|
+
| site.pagecat | Array |
|
|
452
|
+
| site.ext | Object |
|
|
453
|
+
| site.publisher.ext | Object |
|
|
454
|
+
| site.content.id | String |
|
|
455
|
+
| site.content.title | String |
|
|
456
|
+
| site.content.series | String |
|
|
457
|
+
| site.content.season | String |
|
|
458
|
+
| site.content.genre | String |
|
|
459
|
+
| site.content.contentrating | String |
|
|
460
|
+
| site.content.language | String |
|
|
461
|
+
| site.content.episode | Number |
|
|
462
|
+
| site.content.prodq | Number |
|
|
463
|
+
| site.content.context | Number |
|
|
464
|
+
| site.content.livestream | Number |
|
|
465
|
+
| site.content.len | Number |
|
|
466
|
+
| site.content.cat | Array |
|
|
467
|
+
| site.content.ext | Object |
|
|
468
|
+
| site.content.data | Array |
|
|
469
|
+
| site.content.data[].id | String |
|
|
470
|
+
| site.content.data[].name | String |
|
|
471
|
+
| site.content.data[].segment | Array |
|
|
472
|
+
| site.content.data[].ext | Object |
|
|
473
|
+
|
|
474
|
+
|
|
438
475
|
### Passing First Party "user" data:
|
|
439
476
|
```javascript
|
|
440
477
|
pbjs.setConfig({
|
|
@@ -184,13 +184,12 @@ export const spec = {
|
|
|
184
184
|
|
|
185
185
|
if (isNative(bidRequest, adType)) {
|
|
186
186
|
// there may be publishers still rely on it
|
|
187
|
-
|
|
188
|
-
bidResponse.adUrl = url;
|
|
187
|
+
bidResponse.adUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`;
|
|
189
188
|
bidResponse.mediaType = NATIVE;
|
|
190
|
-
const nativeImageAssetObj = find(matchedBid.native.assets,
|
|
189
|
+
const nativeImageAssetObj = find(matchedBid.native.assets, asset => isMainImage(asset));
|
|
191
190
|
const nativeImageAsset = nativeImageAssetObj ? nativeImageAssetObj.img : { url: '', w: 0, h: 0 };
|
|
192
|
-
const nativeTitleAsset = find(matchedBid.native.assets,
|
|
193
|
-
const nativeBodyAsset = find(matchedBid.native.assets,
|
|
191
|
+
const nativeTitleAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'title'));
|
|
192
|
+
const nativeBodyAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'data'));
|
|
194
193
|
bidResponse.native = {
|
|
195
194
|
title: nativeTitleAsset ? nativeTitleAsset.title.text : '',
|
|
196
195
|
body: nativeBodyAsset ? nativeBodyAsset.data.value : '',
|
|
@@ -201,6 +200,7 @@ export const spec = {
|
|
|
201
200
|
},
|
|
202
201
|
clickUrl: matchedBid.native.link.url,
|
|
203
202
|
impressionTrackers: matchedBid.native.imptrackers,
|
|
203
|
+
assets: matchedBid.native.assets,
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
|
|
@@ -505,4 +505,26 @@ function getBidFloor(bid, sizes) {
|
|
|
505
505
|
return undefined;
|
|
506
506
|
}
|
|
507
507
|
|
|
508
|
+
/**
|
|
509
|
+
* Checks if an object has a property with a given name and the property value is not null or undefined.
|
|
510
|
+
*
|
|
511
|
+
* @param {Object} obj - The object to check.
|
|
512
|
+
* @param {string} propName - The name of the property to check.
|
|
513
|
+
* @returns {boolean} Returns true if the object has a property with the given name and the property value is not null or undefined, otherwise false.
|
|
514
|
+
*/
|
|
515
|
+
function hasValidProperty(obj, propName) {
|
|
516
|
+
return obj.hasOwnProperty(propName) && obj[propName] != null;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Checks if an asset object is a main image.
|
|
521
|
+
* A main image is defined as an image asset whose type value is 3.
|
|
522
|
+
*
|
|
523
|
+
* @param {Object} asset - The asset object to check.
|
|
524
|
+
* @returns {boolean} Returns true if the object has a property img.type with a value of 3, otherwise false.
|
|
525
|
+
*/
|
|
526
|
+
function isMainImage(asset) {
|
|
527
|
+
return asset?.img?.type === 3
|
|
528
|
+
}
|
|
529
|
+
|
|
508
530
|
registerBidder(spec);
|
package/package.json
CHANGED
package/src/adapterManager.js
CHANGED
|
@@ -612,6 +612,10 @@ adapterManager.callBidWonBidder = function(bidder, bid, adUnits) {
|
|
|
612
612
|
tryCallBidderMethod(bidder, 'onBidWon', bid);
|
|
613
613
|
};
|
|
614
614
|
|
|
615
|
+
adapterManager.callBidBillableBidder = function(bid) {
|
|
616
|
+
tryCallBidderMethod(bid.bidder, 'onBidBillable', bid);
|
|
617
|
+
};
|
|
618
|
+
|
|
615
619
|
adapterManager.callSetTargetingBidder = function(bidder, bid) {
|
|
616
620
|
tryCallBidderMethod(bidder, 'onSetTargeting', bid);
|
|
617
621
|
};
|
package/src/auction.js
CHANGED
|
@@ -367,8 +367,10 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
|
|
|
367
367
|
}
|
|
368
368
|
|
|
369
369
|
function addWinningBid(winningBid) {
|
|
370
|
+
const winningAd = adUnits.find(adUnit => adUnit.transactionId === winningBid.transactionId);
|
|
370
371
|
_winningBids = _winningBids.concat(winningBid);
|
|
371
372
|
adapterManager.callBidWonBidder(winningBid.adapterCode || winningBid.bidder, winningBid, adUnits);
|
|
373
|
+
if (winningAd && !winningAd.deferBilling) adapterManager.callBidBillableBidder(winningBid);
|
|
372
374
|
}
|
|
373
375
|
|
|
374
376
|
function setBidTargeting(bid) {
|
package/src/prebid.js
CHANGED
|
@@ -1001,18 +1001,7 @@ if (FEATURES.VIDEO) {
|
|
|
1001
1001
|
* @alias module:pbjs.markWinningBidAsUsed
|
|
1002
1002
|
*/
|
|
1003
1003
|
pbjsInstance.markWinningBidAsUsed = function (markBidRequest) {
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
if (markBidRequest.adUnitCode && markBidRequest.adId) {
|
|
1007
|
-
bids = auctionManager.getBidsReceived()
|
|
1008
|
-
.filter(bid => bid.adId === markBidRequest.adId && bid.adUnitCode === markBidRequest.adUnitCode);
|
|
1009
|
-
} else if (markBidRequest.adUnitCode) {
|
|
1010
|
-
bids = targeting.getWinningBids(markBidRequest.adUnitCode);
|
|
1011
|
-
} else if (markBidRequest.adId) {
|
|
1012
|
-
bids = auctionManager.getBidsReceived().filter(bid => bid.adId === markBidRequest.adId);
|
|
1013
|
-
} else {
|
|
1014
|
-
logWarn('Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
|
|
1015
|
-
}
|
|
1004
|
+
const bids = fetchReceivedBids(markBidRequest, 'Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
|
|
1016
1005
|
|
|
1017
1006
|
if (bids.length > 0) {
|
|
1018
1007
|
bids[0].status = CONSTANTS.BID_STATUS.RENDERED;
|
|
@@ -1020,6 +1009,23 @@ if (FEATURES.VIDEO) {
|
|
|
1020
1009
|
}
|
|
1021
1010
|
}
|
|
1022
1011
|
|
|
1012
|
+
const fetchReceivedBids = (bidRequest, warningMessage) => {
|
|
1013
|
+
let bids = [];
|
|
1014
|
+
|
|
1015
|
+
if (bidRequest.adUnitCode && bidRequest.adId) {
|
|
1016
|
+
bids = auctionManager.getBidsReceived()
|
|
1017
|
+
.filter(bid => bid.adId === bidRequest.adId && bid.adUnitCode === bidRequest.adUnitCode);
|
|
1018
|
+
} else if (bidRequest.adUnitCode) {
|
|
1019
|
+
bids = targeting.getWinningBids(bidRequest.adUnitCode);
|
|
1020
|
+
} else if (bidRequest.adId) {
|
|
1021
|
+
bids = auctionManager.getBidsReceived().filter(bid => bid.adId === bidRequest.adId);
|
|
1022
|
+
} else {
|
|
1023
|
+
logWarn(warningMessage);
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
return bids;
|
|
1027
|
+
};
|
|
1028
|
+
|
|
1023
1029
|
/**
|
|
1024
1030
|
* Get Prebid config options
|
|
1025
1031
|
* @param {Object} options
|
|
@@ -1097,4 +1103,22 @@ pbjsInstance.processQueue = function () {
|
|
|
1097
1103
|
processQueue(pbjsInstance.cmd);
|
|
1098
1104
|
};
|
|
1099
1105
|
|
|
1106
|
+
/**
|
|
1107
|
+
* @alias module:pbjs.triggerBilling
|
|
1108
|
+
*/
|
|
1109
|
+
pbjsInstance.triggerBilling = (winningBid) => {
|
|
1110
|
+
const bids = fetchReceivedBids(winningBid, 'Improper use of triggerBilling. It requires a bid with at least an adUnitCode or an adId to function.');
|
|
1111
|
+
const triggerBillingBid = bids.find(bid => bid.requestId === winningBid.requestId) || bids[0];
|
|
1112
|
+
|
|
1113
|
+
if (bids.length > 0 && triggerBillingBid) {
|
|
1114
|
+
try {
|
|
1115
|
+
adapterManager.callBidBillableBidder(triggerBillingBid);
|
|
1116
|
+
} catch (e) {
|
|
1117
|
+
logError('Error when triggering billing :', e);
|
|
1118
|
+
}
|
|
1119
|
+
} else {
|
|
1120
|
+
logWarn('The bid provided to triggerBilling did not match any bids received.');
|
|
1121
|
+
}
|
|
1122
|
+
};
|
|
1123
|
+
|
|
1100
1124
|
export default pbjsInstance;
|
package/src/utils/cpm.js
CHANGED
|
@@ -4,7 +4,10 @@ import {logError} from '../utils.js';
|
|
|
4
4
|
|
|
5
5
|
export function adjustCpm(cpm, bidResponse, bidRequest, {index = auctionManager.index, bs = bidderSettings} = {}) {
|
|
6
6
|
bidRequest = bidRequest || index.getBidRequest(bidResponse);
|
|
7
|
-
const
|
|
7
|
+
const adapterCode = bidResponse?.adapterCode;
|
|
8
|
+
const bidderCode = bidResponse?.bidderCode || bidRequest?.bidder;
|
|
9
|
+
const adjustAlternateBids = bs.get(bidResponse?.adapterCode, 'adjustAlternateBids');
|
|
10
|
+
const bidCpmAdjustment = bs.getOwn(bidderCode, 'bidCpmAdjustment') || bs.get(adjustAlternateBids ? adapterCode : bidderCode, 'bidCpmAdjustment');
|
|
8
11
|
|
|
9
12
|
if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
|
|
10
13
|
try {
|
|
@@ -53,7 +53,8 @@ describe('33acrossBidAdapter:', function () {
|
|
|
53
53
|
brand: 'macOS',
|
|
54
54
|
version: ['11', '6', '8']
|
|
55
55
|
},
|
|
56
|
-
model: ''
|
|
56
|
+
model: '',
|
|
57
|
+
mobile: 0
|
|
57
58
|
}
|
|
58
59
|
},
|
|
59
60
|
id: 'r1',
|
|
@@ -337,7 +338,7 @@ describe('33acrossBidAdapter:', function () {
|
|
|
337
338
|
version: ['11', '6', '8']
|
|
338
339
|
},
|
|
339
340
|
model: '',
|
|
340
|
-
mobile:
|
|
341
|
+
mobile: 0
|
|
341
342
|
}
|
|
342
343
|
}
|
|
343
344
|
}
|
|
@@ -369,7 +370,7 @@ describe('33acrossBidAdapter:', function () {
|
|
|
369
370
|
version: ['11', '6', '8']
|
|
370
371
|
},
|
|
371
372
|
model: '',
|
|
372
|
-
mobile:
|
|
373
|
+
mobile: 0
|
|
373
374
|
}
|
|
374
375
|
}
|
|
375
376
|
},
|
|
@@ -144,12 +144,12 @@ describe('AdgenerationAdapter', function () {
|
|
|
144
144
|
}
|
|
145
145
|
};
|
|
146
146
|
const data = {
|
|
147
|
-
banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
148
|
-
bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
149
|
-
native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
150
|
-
bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
151
|
-
bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
152
|
-
bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
147
|
+
banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
148
|
+
bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
149
|
+
native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&tp=https%3A%2F%2Fexample.com`,
|
|
150
|
+
bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
|
|
151
|
+
bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
152
|
+
bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
153
153
|
};
|
|
154
154
|
it('sends bid request to ENDPOINT via GET', function () {
|
|
155
155
|
const request = spec.buildRequests(bidRequests, bidderRequest)[0];
|