prebid.js 9.5.0 → 9.7.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/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- package/.github/release-drafter.yml +4 -0
- package/README.md +4 -4
- package/dist/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.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/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.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/chunk-core.js +1 -1
- package/dist/cleanmedianetBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/connectionInfo.js +1 -0
- 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/dailymotionBidAdapter.js +1 -1
- package/dist/dependencies.json +31 -2
- package/dist/docereeAdManagerBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gamoshiBidAdapter.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/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/idImportLibrary.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/luceadBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.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/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/mobianRtdProvider.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +174 -170
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openwebBidAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/ortbConverter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/ownadxBidAdapter.js +1 -0
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prismaBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/publirBidAdapter.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.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 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/riseUtils.js +1 -0
- 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/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smarthubBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stnBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/telariaBidAdapter.js +1 -1
- package/dist/teqblazeUtils.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.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/uid2IdSystem_shared.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.js +1 -1
- package/dist/viantOrtbBidAdapter.js +1 -1
- package/dist/vidazooUtils.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/wurflRtdProvider.js +1 -0
- package/dist/yahooAdsBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/wurflRtdProvider_example.html +106 -0
- package/libraries/connectionInfo/connectionUtils.js +33 -0
- package/libraries/ortbConverter/processors/video.js +2 -24
- package/libraries/riseUtils/index.js +331 -0
- package/libraries/teqblazeUtils/bidderUtils.js +15 -11
- package/libraries/vidazooUtils/bidderUtils.js +16 -0
- package/modules/.submodules.json +3 -1
- package/modules/51DegreesRtdProvider.md +11 -7
- package/modules/adagioAnalyticsAdapter.js +101 -84
- package/modules/adagioAnalyticsAdapter.md +4 -0
- package/modules/adagioBidAdapter.js +14 -66
- package/modules/adkernelBidAdapter.js +2 -2
- package/modules/aidemBidAdapter.js +2 -0
- package/modules/appnexusBidAdapter.js +1 -1
- package/modules/cleanmedianetBidAdapter.js +1 -1
- package/modules/connectIdSystem.js +5 -3
- package/modules/dailymotionBidAdapter.js +19 -0
- package/modules/docereeAdManagerBidAdapter.js +9 -12
- package/modules/gamoshiBidAdapter.js +1 -1
- package/modules/greenbidsAnalyticsAdapter.js +7 -4
- package/modules/greenbidsRtdProvider.js +15 -5
- package/modules/id5IdSystem.js +14 -93
- package/modules/idImportLibrary.js +14 -6
- package/modules/insticatorBidAdapter.js +35 -31
- package/modules/kargoBidAdapter.js +11 -14
- package/modules/kimberliteBidAdapter.js +24 -7
- package/modules/kimberliteBidAdapter.md +30 -1
- package/modules/minutemediaBidAdapter.js +21 -398
- package/modules/mobianRtdProvider.js +28 -14
- package/modules/nexx360BidAdapter.js +3 -2
- package/modules/openwebBidAdapter.js +18 -396
- package/modules/ownadxBidAdapter.js +99 -0
- package/modules/prismaBidAdapter.js +1 -27
- package/modules/publirBidAdapter.js +20 -273
- package/modules/pubmaticBidAdapter.js +2 -1
- package/modules/resetdigitalBidAdapter.md +54 -45
- package/modules/riseBidAdapter.js +19 -400
- package/modules/sharethroughBidAdapter.js +5 -0
- package/modules/shinezBidAdapter.js +17 -361
- package/modules/smarthubBidAdapter.js +45 -177
- package/modules/stnBidAdapter.js +22 -398
- package/modules/telariaBidAdapter.js +2 -32
- package/modules/ttdBidAdapter.js +14 -32
- package/modules/uid2IdSystem_shared.js +51 -39
- package/modules/viantOrtbBidAdapter.js +1 -1
- package/modules/wurflRtdProvider.js +213 -0
- package/modules/wurflRtdProvider.md +67 -0
- package/package.json +1 -1
- package/src/adloader.js +1 -0
- package/src/prebid.js +6 -1
- package/src/video.js +78 -1
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +231 -141
- package/test/spec/modules/adagioBidAdapter_spec.js +32 -67
- package/test/spec/modules/appnexusBidAdapter_spec.js +0 -33
- package/test/spec/modules/cleanmedianetBidAdapter_spec.js +1 -1
- package/test/spec/modules/connectIdSystem_spec.js +27 -28
- package/test/spec/modules/dailymotionBidAdapter_spec.js +50 -0
- package/test/spec/modules/docereeAdManagerBidAdapter_spec.js +1 -0
- package/test/spec/modules/gamoshiBidAdapter_spec.js +1 -1
- package/test/spec/modules/id5IdSystem_spec.js +25 -98
- package/test/spec/modules/idImportLibrary_spec.js +14 -0
- package/test/spec/modules/insticatorBidAdapter_spec.js +8 -1
- package/test/spec/modules/kargoBidAdapter_spec.js +7 -8
- package/test/spec/modules/kimberliteBidAdapter_spec.js +137 -65
- package/test/spec/modules/mobianRtdProvider_spec.js +46 -43
- package/test/spec/modules/nexx360BidAdapter_spec.js +1 -1
- package/test/spec/modules/ownadxBidAdapter_spec.js +103 -0
- package/test/spec/modules/pubmaticBidAdapter_spec.js +18 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +35 -0
- package/test/spec/modules/smarthubBidAdapter_spec.js +6 -4
- package/test/spec/modules/ttdBidAdapter_spec.js +10 -1
- package/test/spec/modules/viantOrtbBidAdapter_spec.js +1 -1
- package/test/spec/modules/vidazooBidAdapter_spec.js +12 -4
- package/test/spec/modules/wurflRtdProvider_spec.js +324 -0
- package/test/spec/unit/pbjs_api_spec.js +11 -0
- package/test/spec/video_spec.js +103 -1
|
@@ -2,18 +2,17 @@ import {
|
|
|
2
2
|
logWarn,
|
|
3
3
|
logInfo,
|
|
4
4
|
isArray,
|
|
5
|
-
isFn,
|
|
6
5
|
deepAccess,
|
|
7
|
-
isEmpty,
|
|
8
|
-
contains,
|
|
9
|
-
timestamp,
|
|
10
6
|
triggerPixel,
|
|
11
|
-
isInteger,
|
|
12
|
-
getBidIdParameter
|
|
13
7
|
} from '../src/utils.js';
|
|
14
|
-
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
15
|
-
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
16
|
-
import {
|
|
8
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
9
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
10
|
+
import {
|
|
11
|
+
getEndpoint,
|
|
12
|
+
generateBidsParams,
|
|
13
|
+
generateGeneralParams,
|
|
14
|
+
buildBidResponse,
|
|
15
|
+
} from '../libraries/riseUtils/index.js';
|
|
17
16
|
|
|
18
17
|
const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
|
|
19
18
|
const BIDDER_CODE = 'rise';
|
|
@@ -21,15 +20,11 @@ const ADAPTER_VERSION = '6.0.0';
|
|
|
21
20
|
const TTL = 360;
|
|
22
21
|
const DEFAULT_CURRENCY = 'USD';
|
|
23
22
|
const DEFAULT_GVLID = 1043;
|
|
24
|
-
const
|
|
23
|
+
const BASE_URL = 'https://hb.yellowblue.io/';
|
|
25
24
|
const MODES = {
|
|
26
25
|
PRODUCTION: 'hb-multi',
|
|
27
26
|
TEST: 'hb-multi-test'
|
|
28
|
-
}
|
|
29
|
-
const SUPPORTED_SYNC_METHODS = {
|
|
30
|
-
IFRAME: 'iframe',
|
|
31
|
-
PIXEL: 'pixel'
|
|
32
|
-
}
|
|
27
|
+
};
|
|
33
28
|
|
|
34
29
|
export const spec = {
|
|
35
30
|
code: BIDDER_CODE,
|
|
@@ -59,48 +54,23 @@ export const spec = {
|
|
|
59
54
|
// use data from the first bid, to create the general params for all bids
|
|
60
55
|
const generalObject = validBidRequests[0];
|
|
61
56
|
const testMode = generalObject.params.testMode;
|
|
62
|
-
const rtbDomain = generalObject.params.rtbDomain;
|
|
57
|
+
const rtbDomain = generalObject.params.rtbDomain || BASE_URL;
|
|
63
58
|
|
|
64
59
|
combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest);
|
|
65
60
|
combinedRequestsObject.bids = generateBidsParams(validBidRequests, bidderRequest);
|
|
66
61
|
|
|
67
62
|
return {
|
|
68
63
|
method: 'POST',
|
|
69
|
-
url: getEndpoint(testMode, rtbDomain),
|
|
64
|
+
url: getEndpoint(testMode, rtbDomain, MODES),
|
|
70
65
|
data: combinedRequestsObject
|
|
71
66
|
}
|
|
72
67
|
},
|
|
73
|
-
interpretResponse: function ({body}) {
|
|
68
|
+
interpretResponse: function ({ body }) {
|
|
74
69
|
const bidResponses = [];
|
|
75
70
|
|
|
76
71
|
if (body.bids) {
|
|
77
72
|
body.bids.forEach(adUnit => {
|
|
78
|
-
const bidResponse =
|
|
79
|
-
requestId: adUnit.requestId,
|
|
80
|
-
cpm: adUnit.cpm,
|
|
81
|
-
currency: adUnit.currency || DEFAULT_CURRENCY,
|
|
82
|
-
width: adUnit.width,
|
|
83
|
-
height: adUnit.height,
|
|
84
|
-
ttl: adUnit.ttl || TTL,
|
|
85
|
-
creativeId: adUnit.creativeId,
|
|
86
|
-
netRevenue: adUnit.netRevenue || true,
|
|
87
|
-
nurl: adUnit.nurl,
|
|
88
|
-
mediaType: adUnit.mediaType,
|
|
89
|
-
meta: {
|
|
90
|
-
mediaType: adUnit.mediaType
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
if (adUnit.mediaType === VIDEO) {
|
|
95
|
-
bidResponse.vastXml = adUnit.vastXml;
|
|
96
|
-
} else if (adUnit.mediaType === BANNER) {
|
|
97
|
-
bidResponse.ad = adUnit.ad;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (adUnit.adomain && adUnit.adomain.length) {
|
|
101
|
-
bidResponse.meta.advertiserDomains = adUnit.adomain;
|
|
102
|
-
}
|
|
103
|
-
|
|
73
|
+
const bidResponse = buildBidResponse(adUnit, DEFAULT_CURRENCY, TTL, VIDEO, BANNER);
|
|
104
74
|
bidResponses.push(bidResponse);
|
|
105
75
|
});
|
|
106
76
|
}
|
|
@@ -110,20 +80,20 @@ export const spec = {
|
|
|
110
80
|
getUserSyncs: function (syncOptions, serverResponses) {
|
|
111
81
|
const syncs = [];
|
|
112
82
|
for (const response of serverResponses) {
|
|
113
|
-
if (syncOptions.iframeEnabled && response
|
|
83
|
+
if (syncOptions.iframeEnabled && deepAccess(response, 'body.params.userSyncURL')) {
|
|
114
84
|
syncs.push({
|
|
115
85
|
type: 'iframe',
|
|
116
|
-
url: response
|
|
86
|
+
url: deepAccess(response, 'body.params.userSyncURL')
|
|
117
87
|
});
|
|
118
88
|
}
|
|
119
|
-
if (syncOptions.pixelEnabled && isArray(response
|
|
89
|
+
if (syncOptions.pixelEnabled && isArray(deepAccess(response, 'body.params.userSyncPixels'))) {
|
|
120
90
|
const pixels = response.body.params.userSyncPixels.map(pixel => {
|
|
121
91
|
return {
|
|
122
92
|
type: 'image',
|
|
123
93
|
url: pixel
|
|
124
94
|
}
|
|
125
|
-
})
|
|
126
|
-
syncs.push(...pixels)
|
|
95
|
+
});
|
|
96
|
+
syncs.push(...pixels);
|
|
127
97
|
}
|
|
128
98
|
}
|
|
129
99
|
return syncs;
|
|
@@ -141,354 +111,3 @@ export const spec = {
|
|
|
141
111
|
};
|
|
142
112
|
|
|
143
113
|
registerBidder(spec);
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Get floor price
|
|
147
|
-
* @param bid {bid}
|
|
148
|
-
* @param mediaType {string}
|
|
149
|
-
* @returns {Number}
|
|
150
|
-
*/
|
|
151
|
-
function getFloor(bid, mediaType) {
|
|
152
|
-
if (!isFn(bid.getFloor)) {
|
|
153
|
-
return 0;
|
|
154
|
-
}
|
|
155
|
-
let floorResult = bid.getFloor({
|
|
156
|
-
currency: DEFAULT_CURRENCY,
|
|
157
|
-
mediaType: mediaType,
|
|
158
|
-
size: '*'
|
|
159
|
-
});
|
|
160
|
-
return floorResult.currency === DEFAULT_CURRENCY && floorResult.floor ? floorResult.floor : 0;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Get the the ad sizes array from the bid
|
|
165
|
-
* @param bid {bid}
|
|
166
|
-
* @returns {Array}
|
|
167
|
-
*/
|
|
168
|
-
function getSizesArray(bid, mediaType) {
|
|
169
|
-
let sizesArray = []
|
|
170
|
-
|
|
171
|
-
if (deepAccess(bid, `mediaTypes.${mediaType}.sizes`)) {
|
|
172
|
-
sizesArray = bid.mediaTypes[mediaType].sizes;
|
|
173
|
-
} else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
|
|
174
|
-
sizesArray = bid.sizes;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return sizesArray;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Get schain string value
|
|
182
|
-
* @param schainObject {Object}
|
|
183
|
-
* @returns {string}
|
|
184
|
-
*/
|
|
185
|
-
function getSupplyChain(schainObject) {
|
|
186
|
-
if (isEmpty(schainObject)) {
|
|
187
|
-
return '';
|
|
188
|
-
}
|
|
189
|
-
let scStr = `${schainObject.ver},${schainObject.complete}`;
|
|
190
|
-
schainObject.nodes.forEach((node) => {
|
|
191
|
-
scStr += '!';
|
|
192
|
-
scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
|
|
193
|
-
scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
|
|
194
|
-
scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`;
|
|
195
|
-
scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
|
|
196
|
-
scStr += `${getEncodedValIfNotEmpty(node.name)},`;
|
|
197
|
-
scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
|
|
198
|
-
});
|
|
199
|
-
return scStr;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Get encoded node value
|
|
204
|
-
* @param val {string}
|
|
205
|
-
* @returns {string}
|
|
206
|
-
*/
|
|
207
|
-
function getEncodedValIfNotEmpty(val) {
|
|
208
|
-
return !isEmpty(val) ? encodeURIComponent(val) : '';
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Get preferred user-sync method based on publisher configuration
|
|
213
|
-
* @param bidderCode {string}
|
|
214
|
-
* @returns {string}
|
|
215
|
-
*/
|
|
216
|
-
function getAllowedSyncMethod(filterSettings, bidderCode) {
|
|
217
|
-
const iframeConfigsToCheck = ['all', 'iframe'];
|
|
218
|
-
const pixelConfigToCheck = 'image';
|
|
219
|
-
if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
|
|
220
|
-
return SUPPORTED_SYNC_METHODS.IFRAME;
|
|
221
|
-
}
|
|
222
|
-
if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
|
|
223
|
-
return SUPPORTED_SYNC_METHODS.PIXEL;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Check if sync rule is supported
|
|
229
|
-
* @param syncRule {Object}
|
|
230
|
-
* @param bidderCode {string}
|
|
231
|
-
* @returns {boolean}
|
|
232
|
-
*/
|
|
233
|
-
function isSyncMethodAllowed(syncRule, bidderCode) {
|
|
234
|
-
if (!syncRule) {
|
|
235
|
-
return false;
|
|
236
|
-
}
|
|
237
|
-
const isInclude = syncRule.filter === 'include';
|
|
238
|
-
const bidders = isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
|
|
239
|
-
return isInclude && contains(bidders, bidderCode);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Get the seller endpoint
|
|
244
|
-
* @param testMode {boolean}
|
|
245
|
-
* @param rtbDomain {string}
|
|
246
|
-
* @returns {string}
|
|
247
|
-
*/
|
|
248
|
-
function getEndpoint(testMode, rtbDomain) {
|
|
249
|
-
const SELLER_ENDPOINT = rtbDomain ? `https://${rtbDomain}/` : DEFAULT_SELLER_ENDPOINT;
|
|
250
|
-
return testMode
|
|
251
|
-
? SELLER_ENDPOINT + MODES.TEST
|
|
252
|
-
: SELLER_ENDPOINT + MODES.PRODUCTION;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* get device type
|
|
257
|
-
* @param uad {ua}
|
|
258
|
-
* @returns {string}
|
|
259
|
-
*/
|
|
260
|
-
function getDeviceType(ua) {
|
|
261
|
-
if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i
|
|
262
|
-
.test(ua.toLowerCase())) {
|
|
263
|
-
return '5';
|
|
264
|
-
}
|
|
265
|
-
if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i
|
|
266
|
-
.test(ua.toLowerCase())) {
|
|
267
|
-
return '4';
|
|
268
|
-
}
|
|
269
|
-
if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i
|
|
270
|
-
.test(ua.toLowerCase())) {
|
|
271
|
-
return '3';
|
|
272
|
-
}
|
|
273
|
-
return '1';
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
function generateBidsParams(validBidRequests, bidderRequest) {
|
|
277
|
-
const bidsArray = [];
|
|
278
|
-
|
|
279
|
-
if (validBidRequests.length) {
|
|
280
|
-
validBidRequests.forEach(bid => {
|
|
281
|
-
bidsArray.push(generateBidParameters(bid, bidderRequest));
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
return bidsArray;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Generate bid specific parameters
|
|
290
|
-
* @param {bid} bid
|
|
291
|
-
* @param {bidderRequest} bidderRequest
|
|
292
|
-
* @returns {Object} bid specific params object
|
|
293
|
-
*/
|
|
294
|
-
function generateBidParameters(bid, bidderRequest) {
|
|
295
|
-
const {params} = bid;
|
|
296
|
-
const mediaType = isBanner(bid) ? BANNER : VIDEO;
|
|
297
|
-
const sizesArray = getSizesArray(bid, mediaType);
|
|
298
|
-
// fix floor price in case of NAN
|
|
299
|
-
if (isNaN(params.floorPrice)) {
|
|
300
|
-
params.floorPrice = 0;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
const bidObject = {
|
|
304
|
-
mediaType,
|
|
305
|
-
adUnitCode: getBidIdParameter('adUnitCode', bid),
|
|
306
|
-
sizes: sizesArray,
|
|
307
|
-
floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
|
|
308
|
-
bidId: getBidIdParameter('bidId', bid),
|
|
309
|
-
bidderRequestId: getBidIdParameter('bidderRequestId', bid),
|
|
310
|
-
loop: getBidIdParameter('bidderRequestsCount', bid),
|
|
311
|
-
transactionId: bid.ortb2Imp?.ext?.tid,
|
|
312
|
-
coppa: 0,
|
|
313
|
-
};
|
|
314
|
-
|
|
315
|
-
const pos = deepAccess(bid, `mediaTypes.${mediaType}.pos`);
|
|
316
|
-
if (pos) {
|
|
317
|
-
bidObject.pos = pos;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
const gpid = deepAccess(bid, `ortb2Imp.ext.gpid`);
|
|
321
|
-
if (gpid) {
|
|
322
|
-
bidObject.gpid = gpid;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
const placementId = params.placementId || deepAccess(bid, `mediaTypes.${mediaType}.name`);
|
|
326
|
-
if (placementId) {
|
|
327
|
-
bidObject.placementId = placementId;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
const mimes = deepAccess(bid, `mediaTypes.${mediaType}.mimes`);
|
|
331
|
-
if (mimes) {
|
|
332
|
-
bidObject.mimes = mimes;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
const api = deepAccess(bid, `mediaTypes.${mediaType}.api`);
|
|
336
|
-
if (api) {
|
|
337
|
-
bidObject.api = api;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const sua = deepAccess(bid, `ortb2.device.sua`);
|
|
341
|
-
if (sua) {
|
|
342
|
-
bidObject.sua = sua;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const coppa = deepAccess(bid, `ortb2.regs.coppa`)
|
|
346
|
-
if (coppa) {
|
|
347
|
-
bidObject.coppa = 1;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
if (mediaType === VIDEO) {
|
|
351
|
-
const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
|
|
352
|
-
let playbackMethodValue;
|
|
353
|
-
|
|
354
|
-
// verify playbackMethod is of type integer array, or integer only.
|
|
355
|
-
if (Array.isArray(playbackMethod) && isInteger(playbackMethod[0])) {
|
|
356
|
-
// only the first playbackMethod in the array will be used, according to OpenRTB 2.5 recommendation
|
|
357
|
-
playbackMethodValue = playbackMethod[0];
|
|
358
|
-
} else if (isInteger(playbackMethod)) {
|
|
359
|
-
playbackMethodValue = playbackMethod;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
if (playbackMethodValue) {
|
|
363
|
-
bidObject.playbackMethod = playbackMethodValue;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
const placement = deepAccess(bid, `mediaTypes.video.placement`);
|
|
367
|
-
if (placement) {
|
|
368
|
-
bidObject.placement = placement;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const minDuration = deepAccess(bid, `mediaTypes.video.minduration`);
|
|
372
|
-
if (minDuration) {
|
|
373
|
-
bidObject.minDuration = minDuration;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
const maxDuration = deepAccess(bid, `mediaTypes.video.maxduration`);
|
|
377
|
-
if (maxDuration) {
|
|
378
|
-
bidObject.maxDuration = maxDuration;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
const skip = deepAccess(bid, `mediaTypes.video.skip`);
|
|
382
|
-
if (skip) {
|
|
383
|
-
bidObject.skip = skip;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
const linearity = deepAccess(bid, `mediaTypes.video.linearity`);
|
|
387
|
-
if (linearity) {
|
|
388
|
-
bidObject.linearity = linearity;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
const protocols = deepAccess(bid, `mediaTypes.video.protocols`);
|
|
392
|
-
if (protocols) {
|
|
393
|
-
bidObject.protocols = protocols;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
|
|
397
|
-
if (plcmt) {
|
|
398
|
-
bidObject.plcmt = plcmt;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
return bidObject;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
function isBanner(bid) {
|
|
406
|
-
return bid.mediaTypes && bid.mediaTypes.banner;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
/**
|
|
410
|
-
* Generate params that are common between all bids
|
|
411
|
-
* @param {single bid object} generalObject
|
|
412
|
-
* @param {bidderRequest} bidderRequest
|
|
413
|
-
* @returns {object} the common params object
|
|
414
|
-
*/
|
|
415
|
-
function generateGeneralParams(generalObject, bidderRequest) {
|
|
416
|
-
const domain = window.location.hostname;
|
|
417
|
-
const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
|
|
418
|
-
const {bidderCode} = bidderRequest;
|
|
419
|
-
const generalBidParams = generalObject.params;
|
|
420
|
-
const timeout = bidderRequest.timeout;
|
|
421
|
-
|
|
422
|
-
// these params are snake_case instead of camelCase to allow backwards compatability on the server.
|
|
423
|
-
// in the future, these will be converted to camelCase to match our convention.
|
|
424
|
-
const generalParams = {
|
|
425
|
-
wrapper_type: 'prebidjs',
|
|
426
|
-
wrapper_vendor: '$$PREBID_GLOBAL$$',
|
|
427
|
-
wrapper_version: '$prebid.version$',
|
|
428
|
-
adapter_version: ADAPTER_VERSION,
|
|
429
|
-
auction_start: timestamp(),
|
|
430
|
-
publisher_id: generalBidParams.org,
|
|
431
|
-
publisher_name: domain,
|
|
432
|
-
site_domain: domain,
|
|
433
|
-
dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
|
|
434
|
-
device_type: getDeviceType(navigator.userAgent),
|
|
435
|
-
ua: navigator.userAgent,
|
|
436
|
-
is_wrapper: !!generalBidParams.isWrapper,
|
|
437
|
-
session_id: generalBidParams.sessionId || getBidIdParameter('bidderRequestId', generalObject),
|
|
438
|
-
tmax: timeout
|
|
439
|
-
};
|
|
440
|
-
|
|
441
|
-
const userIdsParam = getBidIdParameter('userId', generalObject);
|
|
442
|
-
if (userIdsParam) {
|
|
443
|
-
generalParams.userIds = JSON.stringify(userIdsParam);
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
const ortb2Metadata = bidderRequest.ortb2 || {};
|
|
447
|
-
if (ortb2Metadata.site) {
|
|
448
|
-
generalParams.site_metadata = JSON.stringify(ortb2Metadata.site);
|
|
449
|
-
}
|
|
450
|
-
if (ortb2Metadata.user) {
|
|
451
|
-
generalParams.user_metadata = JSON.stringify(ortb2Metadata.user);
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
if (syncEnabled) {
|
|
455
|
-
const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
|
|
456
|
-
if (allowedSyncMethod) {
|
|
457
|
-
generalParams.cs_method = allowedSyncMethod;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
if (bidderRequest.uspConsent) {
|
|
462
|
-
generalParams.us_privacy = bidderRequest.uspConsent;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
|
|
466
|
-
generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
|
|
467
|
-
generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
if (bidderRequest && bidderRequest.gppConsent) {
|
|
471
|
-
generalParams.gpp = bidderRequest.gppConsent.gppString;
|
|
472
|
-
generalParams.gpp_sid = bidderRequest.gppConsent.applicableSections;
|
|
473
|
-
} else if (bidderRequest.ortb2?.regs?.gpp) {
|
|
474
|
-
generalParams.gpp = bidderRequest.ortb2.regs.gpp;
|
|
475
|
-
generalParams.gpp_sid = bidderRequest.ortb2.regs.gpp_sid;
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
if (generalBidParams.ifa) {
|
|
479
|
-
generalParams.ifa = generalBidParams.ifa;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
if (generalObject.schain) {
|
|
483
|
-
generalParams.schain = getSupplyChain(generalObject.schain);
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
if (bidderRequest && bidderRequest.refererInfo) {
|
|
487
|
-
// TODO: is 'ref' the right value here?
|
|
488
|
-
generalParams.referrer = deepAccess(bidderRequest, 'refererInfo.ref');
|
|
489
|
-
// TODO: does the fallback make sense here?
|
|
490
|
-
generalParams.page_url = deepAccess(bidderRequest, 'refererInfo.page') || deepAccess(window, 'location.href');
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
return generalParams;
|
|
494
|
-
}
|
|
@@ -68,6 +68,11 @@ export const sharethroughAdapterSpec = {
|
|
|
68
68
|
req.device.ext['cdep'] = bidderRequest.ortb2.device.ext.cdep;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
// if present, merge device object from ortb2 into `req.device`
|
|
72
|
+
if (bidderRequest?.ortb2?.device) {
|
|
73
|
+
mergeDeep(req.device, bidderRequest.ortb2.device);
|
|
74
|
+
}
|
|
75
|
+
|
|
71
76
|
req.user = nullish(firstPartyData.user, {});
|
|
72
77
|
if (!req.user.ext) req.user.ext = {};
|
|
73
78
|
req.user.ext.eids = bidRequests[0].userIdAsEids || [];
|