prebid.js 5.16.0 → 5.20.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/.devcontainer/Dockerfile +11 -0
- package/.devcontainer/devcontainer.json +27 -0
- package/.devcontainer/postCreate.sh +6 -0
- package/browsers.json +1 -0
- package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
- package/modules/.submodules.json +1 -0
- package/modules/adfBidAdapter.js +21 -16
- package/modules/adgenerationBidAdapter.js +28 -4
- package/modules/adkernelBidAdapter.js +3 -1
- package/modules/admixerBidAdapter.js +11 -0
- package/modules/adnuntiusBidAdapter.js +1 -0
- package/modules/adtelligentBidAdapter.js +2 -1
- package/modules/airgridRtdProvider.js +1 -1
- package/modules/akamaiDapRtdProvider.js +474 -0
- package/modules/akamaiDapRtdProvider.md +47 -0
- package/modules/aolBidAdapter.js +2 -1
- package/modules/appnexusBidAdapter.js +5 -3
- package/modules/atsAnalyticsAdapter.js +89 -63
- package/modules/atsAnalyticsAdapter.md +1 -0
- package/modules/betweenBidAdapter.js +20 -3
- package/modules/bliinkBidAdapter.js +58 -32
- package/modules/bliinkBidAdapter.md +29 -6
- package/modules/browsiRtdProvider.js +106 -18
- package/modules/cleanioRtdProvider.js +192 -0
- package/modules/cleanioRtdProvider.md +59 -0
- package/modules/codefuelBidAdapter.js +183 -0
- package/modules/codefuelBidAdapter.md +111 -0
- package/modules/connectIdSystem.js +104 -0
- package/modules/connectIdSystem.md +33 -0
- package/modules/cwireBidAdapter.js +272 -0
- package/modules/cwireBidAdapter.md +43 -0
- package/modules/deepintentBidAdapter.js +106 -9
- package/modules/deepintentBidAdapter.md +36 -1
- package/modules/deltaprojectsBidAdapter.js +252 -0
- package/modules/deltaprojectsBidAdapter.md +32 -0
- package/modules/dgkeywordRtdProvider.js +0 -1
- package/modules/engageyaBidAdapter.js +157 -0
- package/modules/glimpseBidAdapter.js +160 -48
- package/modules/glimpseBidAdapter.md +11 -74
- package/modules/gridBidAdapter.js +1 -0
- package/modules/gridNMBidAdapter.js +7 -6
- package/modules/gumgumBidAdapter.js +16 -2
- package/modules/iasRtdProvider.js +83 -67
- package/modules/inskinBidAdapter.js +7 -3
- package/modules/ixBidAdapter.js +8 -1
- package/modules/jixieBidAdapter.js +8 -2
- package/modules/justpremiumBidAdapter.js +6 -1
- package/modules/kargoBidAdapter.js +14 -7
- package/modules/kargoBidAdapter.md +20 -0
- package/modules/limelightDigitalBidAdapter.js +22 -2
- package/modules/livewrappedAnalyticsAdapter.js +53 -3
- package/modules/mediakeysBidAdapter.js +405 -14
- package/modules/mediakeysBidAdapter.md +108 -0
- package/modules/multibid/index.js +3 -3
- package/modules/mytargetBidAdapter.js +112 -0
- package/modules/nativoBidAdapter.js +48 -29
- package/modules/nativoBidAdapter.md +0 -1
- package/modules/nextMillenniumBidAdapter.js +12 -3
- package/modules/nextrollBidAdapter.js +375 -0
- package/modules/nobidBidAdapter.js +2 -1
- package/modules/oguryBidAdapter.js +36 -7
- package/modules/openxBidAdapter.js +34 -22
- package/modules/operaadsBidAdapter.js +21 -1
- package/modules/otmBidAdapter.js +146 -0
- package/modules/otmBidAdapter.md +27 -26
- package/modules/outbrainBidAdapter.js +5 -0
- package/modules/pixfutureBidAdapter.js +24 -4
- package/modules/pixfutureBidAdapter.md +127 -0
- package/modules/playwireBidAdapter.md +61 -0
- package/modules/prebidServerBidAdapter/index.js +1 -1
- package/modules/proxistoreBidAdapter.js +4 -6
- package/modules/publinkIdSystem.js +17 -7
- package/modules/publinkIdSystem.md +7 -2
- package/modules/pubmaticBidAdapter.js +22 -6
- package/modules/pubmaticBidAdapter.md +1 -1
- package/modules/relaidoBidAdapter.js +8 -2
- package/modules/rtdModule/index.js +2 -2
- package/modules/sharethroughBidAdapter.js +12 -19
- package/modules/slimcutBidAdapter.js +121 -0
- package/modules/sonobiBidAdapter.js +7 -0
- package/modules/sortableBidAdapter.js +1 -0
- package/modules/spotxBidAdapter.js +15 -1
- package/modules/sspBCBidAdapter.js +207 -12
- package/modules/sspBCBidAdapter.md +1 -1
- package/modules/talkadsBidAdapter.js +129 -0
- package/modules/talkadsBidAdapter.md +60 -0
- package/modules/tappxBidAdapter.js +6 -5
- package/modules/teadsBidAdapter.js +3 -0
- package/modules/tripleliftBidAdapter.js +22 -5
- package/modules/trustxBidAdapter.js +17 -11
- package/modules/undertoneBidAdapter.js +9 -5
- package/modules/undertoneBidAdapter.md +5 -1
- package/modules/unicornBidAdapter.js +3 -3
- package/modules/userId/eids.js +18 -0
- package/modules/userId/eids.md +7 -0
- package/modules/userId/userId.md +12 -0
- package/modules/ventesBidAdapter.js +370 -0
- package/modules/ventesBidAdapter.md +94 -0
- package/modules/videobyteBidAdapter.js +13 -6
- package/modules/videobyteBidAdapter.md +49 -0
- package/modules/vidoomyBidAdapter.js +20 -12
- package/modules/visxBidAdapter.js +15 -22
- package/modules/yahoosspBidAdapter.js +637 -0
- package/modules/yahoosspBidAdapter.md +795 -0
- package/modules/yieldlabBidAdapter.js +48 -3
- package/modules/yieldlabBidAdapter.md +16 -1
- package/modules/yieldmoBidAdapter.js +20 -6
- package/modules/yieldmoSyntheticInventoryModule.js +46 -0
- package/modules/yieldmoSyntheticInventoryModule.md +68 -0
- package/package.json +1 -1
- package/src/adapterManager.js +5 -0
- package/src/adapters/bidderFactory.js +4 -3
- package/src/auction.js +11 -11
- package/src/constants.json +1 -0
- package/src/secureCreatives.js +6 -7
- package/src/targeting.js +11 -9
- package/test/.eslintrc.js +2 -1
- package/test/spec/modules/adfBidAdapter_spec.js +83 -29
- package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +77 -9
- package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
- package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
- package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
- package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
- package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
- package/test/spec/modules/connectIdSystem_spec.js +189 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
- package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
- package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
- package/test/spec/modules/gridNMBidAdapter_spec.js +40 -1
- package/test/spec/modules/gumgumBidAdapter_spec.js +23 -6
- package/test/spec/modules/iasRtdProvider_spec.js +71 -6
- package/test/spec/modules/ixBidAdapter_spec.js +13 -3
- package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
- package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
- package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
- package/test/spec/modules/multibid_spec.js +31 -31
- package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
- package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
- package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
- package/test/spec/modules/openxBidAdapter_spec.js +85 -13
- package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
- package/test/spec/modules/otmBidAdapter_spec.js +67 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
- package/test/spec/modules/publinkIdSystem_spec.js +34 -15
- package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
- package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
- package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
- package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
- package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
- package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
- package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
- package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
- package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +38 -5
- package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
- package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
- package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
- package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
- package/test/spec/modules/visxBidAdapter_spec.js +48 -4
- package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
- package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
- package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
- package/test/spec/unit/core/adapterManager_spec.js +32 -0
- package/test/spec/unit/core/bidderFactory_spec.js +61 -1
- package/test/spec/unit/pbjs_api_spec.js +37 -2
- package/test/spec/unit/secureCreatives_spec.js +54 -25
- package/modules/turktelekomBidAdapter.md +0 -49
|
@@ -256,27 +256,14 @@ function buildCommonQueryParamsFromBids(bids, bidderRequest) {
|
|
|
256
256
|
nocache: new Date().getTime()
|
|
257
257
|
};
|
|
258
258
|
|
|
259
|
-
const
|
|
260
|
-
if (
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
data.name.length > 0)
|
|
268
|
-
)
|
|
269
|
-
.reduce((acc, data) => {
|
|
270
|
-
const name = typeof data.ext === 'object' && data.ext.segtax ? `${data.name}/${data.ext.segtax}` : data.name;
|
|
271
|
-
acc[name] = (acc[name] || []).concat(data.segment.map(seg => seg.id));
|
|
272
|
-
return acc;
|
|
273
|
-
}, {})
|
|
274
|
-
const sm = Object.keys(fpd)
|
|
275
|
-
.map((name, _) => name + ':' + fpd[name].join('|'))
|
|
276
|
-
.join(',')
|
|
277
|
-
if (sm.length > 0) {
|
|
278
|
-
defaultParams.sm = encodeURIComponent(sm);
|
|
279
|
-
}
|
|
259
|
+
const userDataSegments = buildFpdQueryParams('ortb2.user.data');
|
|
260
|
+
if (userDataSegments.length > 0) {
|
|
261
|
+
defaultParams.sm = userDataSegments;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const siteContentDataSegments = buildFpdQueryParams('ortb2.site.content.data');
|
|
265
|
+
if (siteContentDataSegments.length > 0) {
|
|
266
|
+
defaultParams.scsm = siteContentDataSegments;
|
|
280
267
|
}
|
|
281
268
|
|
|
282
269
|
if (bids[0].params.platform) {
|
|
@@ -317,12 +304,37 @@ function buildCommonQueryParamsFromBids(bids, bidderRequest) {
|
|
|
317
304
|
return defaultParams;
|
|
318
305
|
}
|
|
319
306
|
|
|
307
|
+
function buildFpdQueryParams(fpdPath) {
|
|
308
|
+
const firstPartyData = config.getConfig(fpdPath);
|
|
309
|
+
if (!Array.isArray(firstPartyData) || !firstPartyData.length) {
|
|
310
|
+
return '';
|
|
311
|
+
}
|
|
312
|
+
const fpd = firstPartyData
|
|
313
|
+
.filter(
|
|
314
|
+
data => (Array.isArray(data.segment) &&
|
|
315
|
+
data.segment.length > 0 &&
|
|
316
|
+
data.name !== undefined &&
|
|
317
|
+
data.name.length > 0)
|
|
318
|
+
)
|
|
319
|
+
.reduce((acc, data) => {
|
|
320
|
+
const name = typeof data.ext === 'object' && data.ext.segtax ? `${data.name}/${data.ext.segtax}` : data.name;
|
|
321
|
+
acc[name] = (acc[name] || []).concat(data.segment.map(seg => seg.id));
|
|
322
|
+
return acc;
|
|
323
|
+
}, {})
|
|
324
|
+
return Object.keys(fpd)
|
|
325
|
+
.map((name, _) => name + ':' + fpd[name].join('|'))
|
|
326
|
+
.join(',')
|
|
327
|
+
}
|
|
328
|
+
|
|
320
329
|
function appendUserIdsToQueryParams(queryParams, userIds) {
|
|
321
330
|
_each(userIds, (userIdObjectOrValue, userIdProviderKey) => {
|
|
322
331
|
const key = USER_ID_CODE_TO_QUERY_ARG[userIdProviderKey];
|
|
323
332
|
|
|
324
333
|
if (USER_ID_CODE_TO_QUERY_ARG.hasOwnProperty(userIdProviderKey)) {
|
|
325
334
|
switch (userIdProviderKey) {
|
|
335
|
+
case 'merkleId':
|
|
336
|
+
queryParams[key] = userIdObjectOrValue.id;
|
|
337
|
+
break;
|
|
326
338
|
case 'flocId':
|
|
327
339
|
queryParams[key] = userIdObjectOrValue.id;
|
|
328
340
|
break;
|
|
@@ -333,7 +345,7 @@ function appendUserIdsToQueryParams(queryParams, userIds) {
|
|
|
333
345
|
queryParams[key] = userIdObjectOrValue.lipbid;
|
|
334
346
|
if (Array.isArray(userIdObjectOrValue.segments) && userIdObjectOrValue.segments.length > 0) {
|
|
335
347
|
const liveIntentSegments = 'liveintent:' + userIdObjectOrValue.segments.join('|')
|
|
336
|
-
queryParams.sm = `${queryParams.sm ? queryParams.sm +
|
|
348
|
+
queryParams.sm = `${queryParams.sm ? queryParams.sm + ',' : ''}${liveIntentSegments}`;
|
|
337
349
|
}
|
|
338
350
|
break;
|
|
339
351
|
case 'parrableId':
|
|
@@ -8,6 +8,7 @@ import { OUTSTREAM } from '../src/video.js';
|
|
|
8
8
|
const BIDDER_CODE = 'operaads';
|
|
9
9
|
|
|
10
10
|
const ENDPOINT = 'https://s.adx.opera.com/ortb/v2/';
|
|
11
|
+
const USER_SYNC_ENDPOINT = 'https://s.adx.opera.com/usersync/page';
|
|
11
12
|
|
|
12
13
|
const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
|
|
13
14
|
|
|
@@ -137,6 +138,25 @@ export const spec = {
|
|
|
137
138
|
* @return {UserSync[]} The user syncs which should be dropped.
|
|
138
139
|
*/
|
|
139
140
|
getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) {
|
|
141
|
+
if ('iframeEnabled' in syncOptions && syncOptions.iframeEnabled) {
|
|
142
|
+
return [{
|
|
143
|
+
type: 'iframe',
|
|
144
|
+
url: USER_SYNC_ENDPOINT
|
|
145
|
+
}];
|
|
146
|
+
}
|
|
147
|
+
if ('pixelEnabled' in syncOptions && syncOptions.pixelEnabled) {
|
|
148
|
+
const pixels = deepAccess(serverResponses, '0.body.pixels')
|
|
149
|
+
if (Array.isArray(pixels)) {
|
|
150
|
+
const userSyncPixels = []
|
|
151
|
+
for (const pixel of pixels) {
|
|
152
|
+
userSyncPixels.push({
|
|
153
|
+
type: 'image',
|
|
154
|
+
url: pixel
|
|
155
|
+
})
|
|
156
|
+
}
|
|
157
|
+
return userSyncPixels;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
140
160
|
return [];
|
|
141
161
|
},
|
|
142
162
|
|
|
@@ -212,7 +232,7 @@ function buildOpenRtbBidRequest(bidRequest, bidderRequest) {
|
|
|
212
232
|
ext: {}
|
|
213
233
|
},
|
|
214
234
|
user: {
|
|
215
|
-
|
|
235
|
+
buyeruid: getUserId(bidRequest)
|
|
216
236
|
}
|
|
217
237
|
}
|
|
218
238
|
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
2
|
+
import {logInfo, logError, getBidIdParameter, _each, getValue, isFn, isPlainObject} from '../src/utils.js';
|
|
3
|
+
import { BANNER } from '../src/mediaTypes.js';
|
|
4
|
+
|
|
5
|
+
const BIDDER_CODE = 'otm';
|
|
6
|
+
const OTM_BID_URL = 'https://ssp.otm-r.com/adjson';
|
|
7
|
+
const DEF_CUR = 'RUB'
|
|
8
|
+
|
|
9
|
+
export const spec = {
|
|
10
|
+
|
|
11
|
+
code: BIDDER_CODE,
|
|
12
|
+
url: OTM_BID_URL,
|
|
13
|
+
supportedMediaTypes: [ BANNER ],
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Determines whether or not the given bid request is valid.
|
|
17
|
+
*
|
|
18
|
+
* @param {object} bid The bid to validate.
|
|
19
|
+
* @return boolean True if this is a valid bid, and false otherwise.
|
|
20
|
+
*/
|
|
21
|
+
isBidRequestValid: function (bid) {
|
|
22
|
+
return !!bid.params.tid;
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Build bidder requests.
|
|
27
|
+
*
|
|
28
|
+
* @param validBidRequests
|
|
29
|
+
* @param bidderRequest
|
|
30
|
+
* @returns {[]}
|
|
31
|
+
*/
|
|
32
|
+
buildRequests: function (validBidRequests, bidderRequest) {
|
|
33
|
+
logInfo('validBidRequests', validBidRequests);
|
|
34
|
+
|
|
35
|
+
const bidRequests = [];
|
|
36
|
+
let tz = new Date().getTimezoneOffset()
|
|
37
|
+
let referrer = '';
|
|
38
|
+
if (bidderRequest && bidderRequest.refererInfo) {
|
|
39
|
+
referrer = bidderRequest.refererInfo.referer;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_each(validBidRequests, (bid) => {
|
|
43
|
+
let domain = getValue(bid.params, 'domain') || ''
|
|
44
|
+
let tid = getValue(bid.params, 'tid')
|
|
45
|
+
let cur = getValue(bid.params, 'currency') || DEF_CUR
|
|
46
|
+
let bidid = getBidIdParameter('bidId', bid)
|
|
47
|
+
let transactionid = getBidIdParameter('transactionId', bid)
|
|
48
|
+
let auctionid = getBidIdParameter('auctionId', bid)
|
|
49
|
+
let bidfloor = _getBidFloor(bid)
|
|
50
|
+
|
|
51
|
+
_each(bid.sizes, size => {
|
|
52
|
+
let width = 0;
|
|
53
|
+
let height = 0;
|
|
54
|
+
if (size.length && typeof size[0] === 'number' && typeof size[1] === 'number') {
|
|
55
|
+
width = size[0];
|
|
56
|
+
height = size[1];
|
|
57
|
+
}
|
|
58
|
+
bidRequests.push({
|
|
59
|
+
method: 'GET',
|
|
60
|
+
url: OTM_BID_URL,
|
|
61
|
+
data: {
|
|
62
|
+
tz: tz,
|
|
63
|
+
w: width,
|
|
64
|
+
h: height,
|
|
65
|
+
domain: domain,
|
|
66
|
+
l: referrer,
|
|
67
|
+
s: tid,
|
|
68
|
+
cur: cur,
|
|
69
|
+
bidid: bidid,
|
|
70
|
+
transactionid: transactionid,
|
|
71
|
+
auctionid: auctionid,
|
|
72
|
+
bidfloor: bidfloor,
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
return bidRequests;
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Generate response.
|
|
82
|
+
*
|
|
83
|
+
* @param serverResponse
|
|
84
|
+
* @param request
|
|
85
|
+
* @returns {[]|*[]}
|
|
86
|
+
*/
|
|
87
|
+
interpretResponse: function (serverResponse, request) {
|
|
88
|
+
logInfo('serverResponse', serverResponse.body);
|
|
89
|
+
|
|
90
|
+
const responsesBody = serverResponse ? serverResponse.body : {};
|
|
91
|
+
const bidResponses = [];
|
|
92
|
+
try {
|
|
93
|
+
if (responsesBody.length === 0) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
_each(responsesBody, (bid) => {
|
|
98
|
+
if (bid.ad) {
|
|
99
|
+
bidResponses.push({
|
|
100
|
+
requestId: bid.bidid,
|
|
101
|
+
cpm: bid.cpm,
|
|
102
|
+
width: bid.w,
|
|
103
|
+
height: bid.h,
|
|
104
|
+
creativeId: bid.creativeid,
|
|
105
|
+
currency: bid.currency || 'RUB',
|
|
106
|
+
netRevenue: true,
|
|
107
|
+
ad: bid.ad,
|
|
108
|
+
ttl: bid.ttl,
|
|
109
|
+
transactionId: bid.transactionid,
|
|
110
|
+
meta: {
|
|
111
|
+
advertiserDomains: bid.adDomain ? [bid.adDomain] : []
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
} catch (error) {
|
|
117
|
+
logError(error);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return bidResponses;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get floor value
|
|
126
|
+
* @param bid
|
|
127
|
+
* @returns {null|*}
|
|
128
|
+
* @private
|
|
129
|
+
*/
|
|
130
|
+
function _getBidFloor(bid) {
|
|
131
|
+
if (!isFn(bid.getFloor)) {
|
|
132
|
+
return bid.params.bidfloor ? bid.params.bidfloor : 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
let floor = bid.getFloor({
|
|
136
|
+
currency: DEF_CUR,
|
|
137
|
+
mediaType: '*',
|
|
138
|
+
size: '*'
|
|
139
|
+
});
|
|
140
|
+
if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === DEF_CUR) {
|
|
141
|
+
return floor.floor;
|
|
142
|
+
}
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
registerBidder(spec);
|
package/modules/otmBidAdapter.md
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
# Overview
|
|
2
2
|
|
|
3
|
-
Module Name
|
|
4
|
-
Module Type
|
|
5
|
-
Maintainer
|
|
3
|
+
**Module Name**: OTM Bidder Adapter
|
|
4
|
+
**Module Type**: Bidder Adapter
|
|
5
|
+
**Maintainer**: e.kretsu@otm-r.com
|
|
6
6
|
|
|
7
7
|
# Description
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
OTM Bidder Adapter for Prebid.js. About: https://otm-r.com
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Use `otm` as bidder:
|
|
12
12
|
|
|
13
|
+
# Params
|
|
14
|
+
- `tid` required, specific id AdUnit slot.
|
|
15
|
+
- `domain` optional, specific custom domain.
|
|
16
|
+
- `bidfloor` optional.
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
```javascript
|
|
16
|
-
var adUnits = [
|
|
17
|
-
{
|
|
18
|
-
code: 'div-otm-example',
|
|
19
|
-
sizes: [[320, 480]],
|
|
20
|
-
bids: [
|
|
21
|
-
{
|
|
22
|
-
bidder: "otm",
|
|
23
|
-
params: {
|
|
24
|
-
tid: "99",
|
|
25
|
-
bidfloor: 20
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
]
|
|
29
|
-
}
|
|
30
|
-
];
|
|
18
|
+
## AdUnits configuration example
|
|
31
19
|
```
|
|
20
|
+
var adUnits = [{
|
|
21
|
+
code: 'your-slot', //use exactly the same code as your slot div id.
|
|
22
|
+
mediaTypes: {
|
|
23
|
+
banner: {
|
|
24
|
+
sizes: [[320, 480]]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
bids: [{
|
|
28
|
+
bidder: 'otm',
|
|
29
|
+
params: {
|
|
30
|
+
tid: 'XXXXX',
|
|
31
|
+
domain: 'specific custom domain, if needed',
|
|
32
|
+
bidfloor: 20
|
|
33
|
+
}
|
|
34
|
+
}]
|
|
35
|
+
}];
|
|
32
36
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* tid - A tag id (should have low cardinality)
|
|
36
|
-
* bidfloor - Floor price
|
|
37
|
+
```
|
|
@@ -40,6 +40,7 @@ export const spec = {
|
|
|
40
40
|
const publisher = setOnAny(validBidRequests, 'params.publisher');
|
|
41
41
|
const bcat = setOnAny(validBidRequests, 'params.bcat');
|
|
42
42
|
const badv = setOnAny(validBidRequests, 'params.badv');
|
|
43
|
+
const eids = setOnAny(validBidRequests, 'userIdAsEids')
|
|
43
44
|
const cur = CURRENCY;
|
|
44
45
|
const endpointUrl = config.getConfig('outbrain.bidderUrl');
|
|
45
46
|
const timeout = bidderRequest.timeout;
|
|
@@ -105,6 +106,10 @@ export const spec = {
|
|
|
105
106
|
deepSetValue(request, 'regs.coppa', config.getConfig('coppa') & 1)
|
|
106
107
|
}
|
|
107
108
|
|
|
109
|
+
if (eids) {
|
|
110
|
+
deepSetValue(request, 'user.ext.eids', eids);
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
return {
|
|
109
114
|
method: 'POST',
|
|
110
115
|
url: endpointUrl,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { convertCamelToUnderscore, isArray, isNumber, isPlainObject, deepAccess, isEmpty, transformBidderParamKeywords, isFn } from '../src/utils.js';
|
|
2
1
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
3
2
|
import { getStorageManager } from '../src/storageManager.js';
|
|
4
3
|
import { BANNER } from '../src/mediaTypes.js';
|
|
5
4
|
import { config } from '../src/config.js';
|
|
6
5
|
import includes from 'core-js-pure/features/array/includes.js';
|
|
6
|
+
import { convertCamelToUnderscore, isArray, isNumber, isPlainObject, deepAccess, isEmpty, transformBidderParamKeywords, isFn } from '../src/utils.js';
|
|
7
7
|
import { auctionManager } from '../src/auctionManager.js';
|
|
8
8
|
import find from 'core-js-pure/features/array/find.js';
|
|
9
9
|
|
|
@@ -12,7 +12,7 @@ const storageManager = getStorageManager();
|
|
|
12
12
|
const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
|
|
13
13
|
export const spec = {
|
|
14
14
|
code: 'pixfuture',
|
|
15
|
-
hostname: 'https://
|
|
15
|
+
hostname: 'https://gosrv.pixfuture.com',
|
|
16
16
|
|
|
17
17
|
getHostname() {
|
|
18
18
|
let ret = this.hostname;
|
|
@@ -77,7 +77,7 @@ export const spec = {
|
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
if (bidderRequest && bidderRequest.uspConsent) {
|
|
80
|
-
payload.us_privacy = bidderRequest.uspConsent
|
|
80
|
+
payload.us_privacy = bidderRequest.uspConsent;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
if (bidderRequest && bidderRequest.refererInfo) {
|
|
@@ -112,7 +112,7 @@ export const spec = {
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
const ret = {
|
|
115
|
-
url: `${hostname}
|
|
115
|
+
url: `${hostname}/pixservices`,
|
|
116
116
|
method: 'POST',
|
|
117
117
|
options: {withCredentials: false},
|
|
118
118
|
data: {
|
|
@@ -153,6 +153,16 @@ export const spec = {
|
|
|
153
153
|
|
|
154
154
|
return bids;
|
|
155
155
|
},
|
|
156
|
+
getUserSyncs: function (syncOptions, bid, gdprConsent) {
|
|
157
|
+
var pixid = '';
|
|
158
|
+
if (typeof bid[0] === 'undefined' || bid[0] === null) { pixid = '0'; } else { pixid = bid[0].body.pix_id; }
|
|
159
|
+
if (syncOptions.iframeEnabled && hasPurpose1Consent({gdprConsent})) {
|
|
160
|
+
return [{
|
|
161
|
+
type: 'iframe',
|
|
162
|
+
url: 'https://gosrv.pixfuture.com/cookiesync?adsync=' + gdprConsent.consentString + '&pixid=' + pixid + '&gdprconcent=' + gdprConsent.gdprApplies
|
|
163
|
+
}];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
156
166
|
};
|
|
157
167
|
|
|
158
168
|
function newBid(serverBid, rtbBid, placementId, uuid) {
|
|
@@ -179,6 +189,16 @@ function newBid(serverBid, rtbBid, placementId, uuid) {
|
|
|
179
189
|
return bid;
|
|
180
190
|
}
|
|
181
191
|
|
|
192
|
+
function hasPurpose1Consent(bidderRequest) {
|
|
193
|
+
let result = true;
|
|
194
|
+
if (bidderRequest && bidderRequest.gdprConsent) {
|
|
195
|
+
if (bidderRequest.gdprConsent.gdprApplies && bidderRequest.gdprConsent.apiVersion === 2) {
|
|
196
|
+
result = !!(deepAccess(bidderRequest.gdprConsent, 'vendorData.purpose.consents.1') === true);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
|
|
182
202
|
// Functions related optional parameters
|
|
183
203
|
function bidToTag(bid) {
|
|
184
204
|
const tag = {};
|
|
@@ -25,3 +25,130 @@ var adUnits = [{
|
|
|
25
25
|
"pix_id": "Abc123"
|
|
26
26
|
}];
|
|
27
27
|
```
|
|
28
|
+
|
|
29
|
+
# Test Example
|
|
30
|
+
...
|
|
31
|
+
<html>
|
|
32
|
+
|
|
33
|
+
<head>
|
|
34
|
+
<link rel="icon" type="image/png" href="/favicon.ico">
|
|
35
|
+
<script async src="//www.googletagservices.com/tag/js/gpt.js"></script>
|
|
36
|
+
<script async src="https://cdn.pixfuture.com/pixfuture_prebidjs/prebid.js"></script>
|
|
37
|
+
<script>
|
|
38
|
+
var div_1_sizes = [
|
|
39
|
+
[300, 250],
|
|
40
|
+
[300, 600]
|
|
41
|
+
];
|
|
42
|
+
var div_2_sizes = [
|
|
43
|
+
[728, 90],
|
|
44
|
+
[970, 250]
|
|
45
|
+
];
|
|
46
|
+
var PREBID_TIMEOUT = 1000;
|
|
47
|
+
var FAILSAFE_TIMEOUT = 3000;
|
|
48
|
+
|
|
49
|
+
var adUnits = [
|
|
50
|
+
{
|
|
51
|
+
code: '/19968336/header-bid-tag-0',
|
|
52
|
+
mediaTypes: {
|
|
53
|
+
banner: {
|
|
54
|
+
sizes: div_1_sizes
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
bids: [{
|
|
58
|
+
bidder: 'pixfuture',
|
|
59
|
+
params: {
|
|
60
|
+
"pix_id": "777"
|
|
61
|
+
}
|
|
62
|
+
}]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
code: '/19968336/header-bid-tag-1',
|
|
66
|
+
mediaTypes: {
|
|
67
|
+
banner: {
|
|
68
|
+
sizes: div_2_sizes
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
bids: [{
|
|
72
|
+
bidder: 'appnexus',
|
|
73
|
+
params: {
|
|
74
|
+
placementId: 13144370
|
|
75
|
+
}
|
|
76
|
+
}]
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
// ======== DO NOT EDIT BELOW THIS LINE =========== //
|
|
81
|
+
var googletag = googletag || {};
|
|
82
|
+
googletag.cmd = googletag.cmd || [];
|
|
83
|
+
googletag.cmd.push(function() {
|
|
84
|
+
googletag.pubads().disableInitialLoad();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
var pbjs = pbjs || {};
|
|
88
|
+
pbjs.que = pbjs.que || [];
|
|
89
|
+
|
|
90
|
+
pbjs.que.push(function() {
|
|
91
|
+
pbjs.addAdUnits(adUnits);
|
|
92
|
+
pbjs.requestBids({
|
|
93
|
+
bidsBackHandler: initAdserver,
|
|
94
|
+
timeout: PREBID_TIMEOUT
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
function initAdserver() {
|
|
99
|
+
if (pbjs.initAdserverSet) return;
|
|
100
|
+
pbjs.initAdserverSet = true;
|
|
101
|
+
googletag.cmd.push(function() {
|
|
102
|
+
pbjs.que.push(function() {
|
|
103
|
+
pbjs.setTargetingForGPTAsync();
|
|
104
|
+
googletag.pubads().refresh();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// in case PBJS doesn't load
|
|
109
|
+
setTimeout(function() {
|
|
110
|
+
initAdserver();
|
|
111
|
+
}, FAILSAFE_TIMEOUT);
|
|
112
|
+
|
|
113
|
+
googletag.cmd.push(function() {
|
|
114
|
+
googletag.defineSlot('/19968336/header-bid-tag-0', div_1_sizes, 'div-1').addService(googletag.pubads());
|
|
115
|
+
googletag.pubads().enableSingleRequest();
|
|
116
|
+
googletag.enableServices();
|
|
117
|
+
});
|
|
118
|
+
googletag.cmd.push(function() {
|
|
119
|
+
googletag.defineSlot('/19968336/header-bid-tag-1', div_2_sizes, 'div-2').addService(googletag.pubads());
|
|
120
|
+
googletag.pubads().enableSingleRequest();
|
|
121
|
+
googletag.enableServices();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
</script>
|
|
125
|
+
|
|
126
|
+
</head>
|
|
127
|
+
|
|
128
|
+
<body>
|
|
129
|
+
<h2>Basic Prebid.js Example</h2>
|
|
130
|
+
<h5>Div-1</h5>
|
|
131
|
+
<div id='div-1'>
|
|
132
|
+
<script type='text/javascript'>
|
|
133
|
+
googletag.cmd.push(function() {
|
|
134
|
+
googletag.display('div-1');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
</script>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<br>
|
|
141
|
+
|
|
142
|
+
<h5>Div-2</h5>
|
|
143
|
+
<div id='div-2'>
|
|
144
|
+
<script type='text/javascript'>
|
|
145
|
+
googletag.cmd.push(function() {
|
|
146
|
+
googletag.display('div-2');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
</script>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
</body>
|
|
153
|
+
|
|
154
|
+
</html>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: Playwire Bidder Adapter
|
|
4
|
+
Module Type: Bidder Adapter
|
|
5
|
+
Maintainer: grid-tech@themediagrid.com
|
|
6
|
+
|
|
7
|
+
# Description
|
|
8
|
+
|
|
9
|
+
Module that connects to Grid demand source to fetch bids.
|
|
10
|
+
The adapter is GDPR compliant and supports banner and video (instream and outstream).
|
|
11
|
+
|
|
12
|
+
# Test Parameters
|
|
13
|
+
```
|
|
14
|
+
var adUnits = [
|
|
15
|
+
{
|
|
16
|
+
code: 'test-div',
|
|
17
|
+
sizes: [[300, 250]],
|
|
18
|
+
bids: [
|
|
19
|
+
{
|
|
20
|
+
bidder: "playwire",
|
|
21
|
+
params: {
|
|
22
|
+
uid: '1',
|
|
23
|
+
bidFloor: 0.5
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},{
|
|
28
|
+
code: 'test-div',
|
|
29
|
+
sizes: [[728, 90]],
|
|
30
|
+
bids: [
|
|
31
|
+
{
|
|
32
|
+
bidder: "playwire",
|
|
33
|
+
params: {
|
|
34
|
+
uid: 2,
|
|
35
|
+
keywords: {
|
|
36
|
+
brandsafety: ['disaster'],
|
|
37
|
+
topic: ['stress', 'fear']
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
code: 'test-div',
|
|
45
|
+
sizes: [[728, 90]],
|
|
46
|
+
mediaTypes: { video: {
|
|
47
|
+
context: 'instream',
|
|
48
|
+
playerSize: [728, 90],
|
|
49
|
+
mimes: ['video/mp4']
|
|
50
|
+
},
|
|
51
|
+
bids: [
|
|
52
|
+
{
|
|
53
|
+
bidder: "playwire",
|
|
54
|
+
params: {
|
|
55
|
+
uid: 11
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
```
|
|
@@ -799,7 +799,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
799
799
|
if (requestedBidders && isArray(requestedBidders)) {
|
|
800
800
|
eidPermissions.forEach(i => {
|
|
801
801
|
if (i.bidders) {
|
|
802
|
-
i.bidders = i.bidders.filter(bidder =>
|
|
802
|
+
i.bidders = i.bidders.filter(bidder => includes(requestedBidders, bidder))
|
|
803
803
|
}
|
|
804
804
|
});
|
|
805
805
|
}
|
|
@@ -4,7 +4,8 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
|
4
4
|
const BIDDER_CODE = 'proxistore';
|
|
5
5
|
const PROXISTORE_VENDOR_ID = 418;
|
|
6
6
|
const COOKIE_BASE_URL = 'https://abs.proxistore.com/v3/rtb/prebid/multi';
|
|
7
|
-
const COOKIE_LESS_URL =
|
|
7
|
+
const COOKIE_LESS_URL =
|
|
8
|
+
'https://abs.cookieless-proxistore.com/v3/rtb/prebid/multi';
|
|
8
9
|
|
|
9
10
|
function _createServerRequest(bidRequests, bidderRequest) {
|
|
10
11
|
var sizeIds = [];
|
|
@@ -181,11 +182,7 @@ function _assignFloor(bid) {
|
|
|
181
182
|
size: '*',
|
|
182
183
|
});
|
|
183
184
|
|
|
184
|
-
if (
|
|
185
|
-
isPlainObject(floor) &&
|
|
186
|
-
!isNaN(floor.floor) &&
|
|
187
|
-
floor.currency === 'EUR'
|
|
188
|
-
) {
|
|
185
|
+
if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') {
|
|
189
186
|
return floor.floor;
|
|
190
187
|
}
|
|
191
188
|
return null;
|
|
@@ -196,6 +193,7 @@ export const spec = {
|
|
|
196
193
|
isBidRequestValid: isBidRequestValid,
|
|
197
194
|
buildRequests: buildRequests,
|
|
198
195
|
interpretResponse: interpretResponse,
|
|
196
|
+
gvlid: PROXISTORE_VENDOR_ID,
|
|
199
197
|
};
|
|
200
198
|
|
|
201
199
|
registerBidder(spec);
|