prebid.js 7.24.0 → 7.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/admaticBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.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/captifyRtdProvider.js +1 -0
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/discoveryBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/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/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.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/microadBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +154 -120
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/publinkIdSystem.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/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/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smartytechBidAdapter.js +1 -0
- 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/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.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/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/viqeoBidAdapter.js +1 -0
- 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/dist/zeta_global_sspBidAdapter.js +1 -1
- package/dist/zeusPrimeRtdProvider.js +31 -0
- package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
- package/modules/.submodules.json +3 -1
- package/modules/adagioBidAdapter.js +1 -1
- package/modules/admaticBidAdapter.js +108 -59
- package/modules/admaticBidAdapter.md +2 -2
- package/modules/beopBidAdapter.js +17 -2
- package/modules/captifyRtdProvider.js +146 -0
- package/modules/captifyRtdProvider.md +68 -0
- package/modules/concertBidAdapter.js +17 -3
- package/modules/conversantAnalyticsAdapter.md +12 -13
- package/modules/conversantBidAdapter.md +3 -3
- package/modules/discoveryBidAdapter.js +38 -17
- package/modules/discoveryBidAdapter.md +7 -6
- package/modules/gridBidAdapter.js +440 -22
- package/modules/kargoBidAdapter.js +14 -8
- package/modules/magniteAnalyticsAdapter.js +1 -1
- package/modules/microadBidAdapter.js +22 -11
- package/modules/nextMillenniumBidAdapter.js +20 -24
- package/modules/oguryBidAdapter.js +5 -2
- package/modules/pubmaticBidAdapter.js +1 -1
- package/modules/seedtagBidAdapter.js +9 -4
- package/modules/smartadserverBidAdapter.js +6 -2
- package/modules/smartxBidAdapter.js +10 -7
- package/modules/smartytechBidAdapter.js +78 -0
- package/modules/smartytechBidAdapter.md +44 -0
- package/modules/taboolaBidAdapter.js +3 -3
- package/modules/taboolaBidAdapter.md +0 -2
- package/modules/tappxBidAdapter.js +21 -6
- package/modules/ttdBidAdapter.js +4 -3
- package/modules/userId/index.js +1 -1
- package/modules/vidazooBidAdapter.js +29 -3
- package/modules/viqeoBidAdapter.js +180 -0
- package/modules/viqeoBidAdapter.md +56 -0
- package/modules/yieldlabBidAdapter.js +19 -8
- package/modules/yieldmoBidAdapter.js +22 -8
- package/modules/yieldoneBidAdapter.js +60 -8
- package/modules/yieldoneBidAdapter.md +109 -9
- package/modules/zeta_global_sspBidAdapter.js +4 -0
- package/modules/zeusPrimeRtdProvider.js +357 -0
- package/modules/zeusPrimeRtdProvider.md +60 -0
- package/package.json +1 -1
- package/src/adloader.js +0 -1
- package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
- package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
- package/test/spec/modules/beopBidAdapter_spec.js +52 -0
- package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
- package/test/spec/modules/concertBidAdapter_spec.js +26 -15
- package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
- package/test/spec/modules/gridBidAdapter_spec.js +289 -1
- package/test/spec/modules/kargoBidAdapter_spec.js +76 -4
- package/test/spec/modules/magniteAnalyticsAdapter_spec.js +20 -0
- package/test/spec/modules/microadBidAdapter_spec.js +48 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
- package/test/spec/modules/oguryBidAdapter_spec.js +27 -5
- package/test/spec/modules/pubmaticBidAdapter_spec.js +2 -2
- package/test/spec/modules/seedtagBidAdapter_spec.js +34 -10
- package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
- package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
- package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
- package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
- package/test/spec/modules/ttdBidAdapter_spec.js +13 -0
- package/test/spec/modules/vidazooBidAdapter_spec.js +1 -0
- package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +125 -0
- package/test/spec/modules/yieldmoBidAdapter_spec.js +3 -4
- package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
- package/test/spec/modules/zeusPrimeRtdProvider_spec.js +410 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
2
|
+
import {logError, logInfo, _each, mergeDeep, isFn, isNumber, isPlainObject} from '../src/utils.js'
|
|
3
|
+
import {VIDEO} from '../src/mediaTypes.js';
|
|
4
|
+
import {Renderer} from '../src/Renderer.js';
|
|
5
|
+
|
|
6
|
+
const BIDDER_CODE = 'viqeo';
|
|
7
|
+
const DEFAULT_MIMES = ['application/javascript'];
|
|
8
|
+
const VIQEO_ENDPOINT = 'https://ads.betweendigital.com/openrtb_bid';
|
|
9
|
+
const RENDERER_URL = 'https://cdn.viqeo.tv/js/vq_starter.js';
|
|
10
|
+
const DEFAULT_CURRENCY = 'USD';
|
|
11
|
+
const DEFAULT_SSPID = 44697;
|
|
12
|
+
|
|
13
|
+
function getBidFloor(bid) {
|
|
14
|
+
const {floor, currency} = bid.params;
|
|
15
|
+
const curr = currency || DEFAULT_CURRENCY;
|
|
16
|
+
if (!isFn(bid.getFloor)) {
|
|
17
|
+
return {floor: isNumber(floor) ? floor : 0, currency: curr};
|
|
18
|
+
}
|
|
19
|
+
const floorInfo = bid.getFloor({currency: curr, mediaType: VIDEO, size: '*'});
|
|
20
|
+
if (isPlainObject(floorInfo) && isNumber(floorInfo.floor) && floorInfo.currency === curr) {
|
|
21
|
+
return floorInfo;
|
|
22
|
+
}
|
|
23
|
+
return {floor: floor || 0, currency: currency || DEFAULT_CURRENCY};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function getVideoTargetingParams({mediaTypes: {video}}) {
|
|
27
|
+
const result = {};
|
|
28
|
+
Object.keys(Object(video))
|
|
29
|
+
.forEach(key => {
|
|
30
|
+
if (key === 'playerSize') {
|
|
31
|
+
result.w = video.playerSize[0][0];
|
|
32
|
+
result.h = video.playerSize[0][1];
|
|
33
|
+
} else if (key !== 'context') {
|
|
34
|
+
result[key] = video[key];
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @type {BidderSpec}
|
|
42
|
+
*/
|
|
43
|
+
export const spec = {
|
|
44
|
+
code: BIDDER_CODE,
|
|
45
|
+
supportedMediaTypes: [VIDEO],
|
|
46
|
+
/**
|
|
47
|
+
* @param {BidRequest} bidRequest The bid params to validate.
|
|
48
|
+
* @return boolean True if this is a valid bid, and false otherwise.
|
|
49
|
+
*/
|
|
50
|
+
isBidRequestValid: ({params}) => {
|
|
51
|
+
if (!params) {
|
|
52
|
+
logError('failed validation: params not declared');
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (!params.user && !params.user?.buyeruid) {
|
|
56
|
+
logError('failed validation: user.buyeruid not declared');
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (!params.playerOptions) {
|
|
60
|
+
logError('failed validation: playerOptions not declared');
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const {profileId, videoId, playerId} = params.playerOptions;
|
|
64
|
+
if (!profileId) {
|
|
65
|
+
logError('failed validation: profileId not declared');
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (!videoId && !playerId) {
|
|
69
|
+
logError('failed validation: videoId or playerId not declared');
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
},
|
|
74
|
+
/**
|
|
75
|
+
* @param validBidRequests {BidRequest[]}
|
|
76
|
+
* @returns {ServerRequest[]}
|
|
77
|
+
*/
|
|
78
|
+
buildRequests: (validBidRequests) => {
|
|
79
|
+
logInfo('validBidRequests', validBidRequests);
|
|
80
|
+
const bidRequests = [];
|
|
81
|
+
_each(validBidRequests, (bid, i) => {
|
|
82
|
+
const {
|
|
83
|
+
params: {test, sspId, endpointUrl},
|
|
84
|
+
mediaTypes: {video},
|
|
85
|
+
} = bid;
|
|
86
|
+
const ortb2 = bid.ortb2 || {};
|
|
87
|
+
const user = bid.params.user || {};
|
|
88
|
+
const device = bid.params.device || {};
|
|
89
|
+
const site = bid.params.site || {};
|
|
90
|
+
const w = window;
|
|
91
|
+
const floorInfo = getBidFloor(bid);
|
|
92
|
+
const data = {
|
|
93
|
+
id: bid.bidId,
|
|
94
|
+
test,
|
|
95
|
+
imp: [{
|
|
96
|
+
id: `${i}`,
|
|
97
|
+
tagid: bid.adUnitCode,
|
|
98
|
+
video: {
|
|
99
|
+
...getVideoTargetingParams(bid),
|
|
100
|
+
mimes: video.mimes || DEFAULT_MIMES,
|
|
101
|
+
},
|
|
102
|
+
bidfloor: floorInfo.floor,
|
|
103
|
+
bidfloorcur: floorInfo.currency,
|
|
104
|
+
secure: 1
|
|
105
|
+
}],
|
|
106
|
+
site: test === 1 ? {
|
|
107
|
+
page: 'https://viqeo.tv',
|
|
108
|
+
domain: 'viqeo.tv'
|
|
109
|
+
} : mergeDeep({
|
|
110
|
+
domain: w.location.hostname,
|
|
111
|
+
page: w.location.href
|
|
112
|
+
}, ortb2.site, site),
|
|
113
|
+
device: mergeDeep({
|
|
114
|
+
w: w.screen.width,
|
|
115
|
+
h: w.screen.height,
|
|
116
|
+
ua: w.navigator.userAgent,
|
|
117
|
+
}, ortb2.device, device),
|
|
118
|
+
user: mergeDeep({...user}, ortb2.user),
|
|
119
|
+
app: bid.params.app,
|
|
120
|
+
};
|
|
121
|
+
bidRequests.push({
|
|
122
|
+
url: endpointUrl || `${VIQEO_ENDPOINT}/?sspId=${sspId || DEFAULT_SSPID}`,
|
|
123
|
+
method: 'POST',
|
|
124
|
+
data,
|
|
125
|
+
bids: validBidRequests,
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
return bidRequests;
|
|
129
|
+
},
|
|
130
|
+
/**
|
|
131
|
+
* @param {ServerResponse} serverResponse
|
|
132
|
+
* @param {BidRequest} bidRequests
|
|
133
|
+
* @return {Bid[]}
|
|
134
|
+
*/
|
|
135
|
+
interpretResponse: (serverResponse, bidRequests) => {
|
|
136
|
+
logInfo('serverResponse', serverResponse);
|
|
137
|
+
const bidResponses = [];
|
|
138
|
+
if (!serverResponse || !serverResponse.body) {
|
|
139
|
+
logError('empty response');
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const {id, seatbid, cur} = serverResponse.body;
|
|
144
|
+
_each(seatbid, (sb) => {
|
|
145
|
+
const {bid} = sb;
|
|
146
|
+
_each(bid, (b) => {
|
|
147
|
+
const bidRequest = bidRequests.bids.find(({bidId}) => bidId === id);
|
|
148
|
+
const renderer = Renderer.install({
|
|
149
|
+
url: bidRequest?.params?.renderUrl || RENDERER_URL,
|
|
150
|
+
});
|
|
151
|
+
renderer.setRender((bid) => {
|
|
152
|
+
if (window.VIQEO) {
|
|
153
|
+
window.VIQEO.renderPrebid(bid);
|
|
154
|
+
} else {
|
|
155
|
+
logError('failed get window.VIQEO');
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
bidResponses.push({
|
|
159
|
+
requestId: id,
|
|
160
|
+
currency: cur,
|
|
161
|
+
cpm: b.price,
|
|
162
|
+
ttl: b.exp,
|
|
163
|
+
netRevenue: true,
|
|
164
|
+
creativeId: b.cid,
|
|
165
|
+
width: b.w || bidRequest?.mediaTypes[VIDEO].playerSize[0][0],
|
|
166
|
+
height: b.h || bidRequest?.mediaTypes[VIDEO].playerSize[0][1],
|
|
167
|
+
vastXml: b.adm,
|
|
168
|
+
vastUrl: b.nurl,
|
|
169
|
+
mediaType: VIDEO,
|
|
170
|
+
renderer,
|
|
171
|
+
})
|
|
172
|
+
})
|
|
173
|
+
});
|
|
174
|
+
} catch (error) {
|
|
175
|
+
logError(error);
|
|
176
|
+
}
|
|
177
|
+
return bidResponses;
|
|
178
|
+
},
|
|
179
|
+
}
|
|
180
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
**Module Name**: Viqeo Bidder Adapter
|
|
4
|
+
**Module Type**: Bidder Adapter
|
|
5
|
+
**Maintainer**: muravjovv1@gmail.com
|
|
6
|
+
|
|
7
|
+
# Description
|
|
8
|
+
|
|
9
|
+
Viqeo Bidder Adapter for Prebid.js. About: https://viqeo.tv/
|
|
10
|
+
|
|
11
|
+
### Bid params
|
|
12
|
+
|
|
13
|
+
{: .table .table-bordered .table-striped }
|
|
14
|
+
| Name | Scope | Description | Example | Type |
|
|
15
|
+
|-----------------------------|----------|----------------------------------------------------------------------------------------------------------------------------|--------------------------|-----------|
|
|
16
|
+
| `user` | required | The object containing user data (See OpenRTB spec) | `user: {}` | `object` |
|
|
17
|
+
| `user.buyeruid` | required | User id | `"12345"` | `string` |
|
|
18
|
+
| `playerOptions` | required | The object containing Viqeo player options | `playerOptions: {}` | `object` |
|
|
19
|
+
| `playerOptions.profileId` | required | Viqeo profile id | `1382` | `number` |
|
|
20
|
+
| `playerOptions.videId` | optional | Viqeo video id | `"ed584da454c7205ca7e4"` | `string` |
|
|
21
|
+
| `playerOptions.playerId` | optional | Viqeo player id | `1` | `number` |
|
|
22
|
+
| `device` | optional | The object containing device data (See OpenRTB spec) | `device: {}` | `object` |
|
|
23
|
+
| `site` | optional | The object containing site data (See OpenRTB spec) | `site: {}` | `object` |
|
|
24
|
+
| `app` | optional | The object containing app data (See OpenRTB spec) | `app: {}` | `object` |
|
|
25
|
+
| `floor` | optional | Bid floor price | `0.5` | `number` |
|
|
26
|
+
| `currency` | optional | 3-letter ISO 4217 code defining the currency of the bid. | `EUR` | `string` |
|
|
27
|
+
| `test` | optional | Flag which will induce a sample bid response when true; only set to true for testing purposes (1 = true, 0 = false) | `1` | `integer` |
|
|
28
|
+
| `sspId` | optional | For debug, request id | `1` | `number` |
|
|
29
|
+
| `renderUrl` | optional | For debug, script player url | `"https://viqeo.tv"` | `string` |
|
|
30
|
+
| `endpointUrl` | optional | For debug, api endpoint | `"https://viqeo.tv"` | `string` |
|
|
31
|
+
|
|
32
|
+
# Test Parameters
|
|
33
|
+
```
|
|
34
|
+
var adUnits = [{
|
|
35
|
+
code: 'your-slot', // use exactly the same code as your slot div id.
|
|
36
|
+
mediaTypes: {
|
|
37
|
+
video: {
|
|
38
|
+
context: 'outstream',
|
|
39
|
+
playerSize: [640, 480]
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
bids: [{
|
|
43
|
+
bidder: 'viqeo',
|
|
44
|
+
params: {
|
|
45
|
+
user: {
|
|
46
|
+
buyeruid: '1',
|
|
47
|
+
},
|
|
48
|
+
playerOptions: {
|
|
49
|
+
videoId: 'ed584da454c7205ca7e4',
|
|
50
|
+
profileId: 1382,
|
|
51
|
+
},
|
|
52
|
+
test: 1,
|
|
53
|
+
}
|
|
54
|
+
}]
|
|
55
|
+
}];
|
|
56
|
+
```
|
|
@@ -370,21 +370,32 @@ function getContentObject(bid) {
|
|
|
370
370
|
}
|
|
371
371
|
|
|
372
372
|
/**
|
|
373
|
-
* Creates a string for iab_content object
|
|
373
|
+
* Creates a string for iab_content object by
|
|
374
|
+
* 1. flatten the iab content object
|
|
375
|
+
* 2. encoding the values
|
|
376
|
+
* 3. joining array of defined keys ('keyword', 'cat') into one value seperated with '|'
|
|
377
|
+
* 4. encoding the whole string
|
|
374
378
|
* @param {Object} iabContent
|
|
375
379
|
* @returns {String}
|
|
376
380
|
*/
|
|
377
381
|
function createIabContentString(iabContent) {
|
|
378
382
|
const arrKeys = ['keywords', 'cat']
|
|
379
383
|
const str = []
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
384
|
+
const transformObjToParam = (obj = {}, extraKey = '') => {
|
|
385
|
+
for (const key in obj) {
|
|
386
|
+
if ((arrKeys.indexOf(key) !== -1 && Array.isArray(obj[key]))) {
|
|
387
|
+
// Array of defined keyword which have to be joined into one value from "key: [value1, value2, value3]" to "key:value1|value2|value3"
|
|
388
|
+
str.push(''.concat(key, ':', obj[key].map(node => encodeURIComponent(node)).join('|')))
|
|
389
|
+
} else if (typeof obj[key] !== 'object') {
|
|
390
|
+
str.push(''.concat(extraKey + key, ':', encodeURIComponent(obj[key])))
|
|
391
|
+
} else {
|
|
392
|
+
// Object has to be further flattened
|
|
393
|
+
transformObjToParam(obj[key], ''.concat(extraKey, key, '.'));
|
|
394
|
+
}
|
|
385
395
|
}
|
|
386
|
-
|
|
387
|
-
|
|
396
|
+
return str.join(',');
|
|
397
|
+
};
|
|
398
|
+
return encodeURIComponent(transformObjToParam(iabContent))
|
|
388
399
|
}
|
|
389
400
|
|
|
390
401
|
/**
|
|
@@ -20,12 +20,15 @@ import {find, includes} from '../src/polyfill.js';
|
|
|
20
20
|
import {createEidsArray} from './userId/eids.js';
|
|
21
21
|
|
|
22
22
|
const BIDDER_CODE = 'yieldmo';
|
|
23
|
+
const GVLID = 173;
|
|
23
24
|
const CURRENCY = 'USD';
|
|
24
25
|
const TIME_TO_LIVE = 300;
|
|
25
26
|
const NET_REVENUE = true;
|
|
26
|
-
const BANNER_SERVER_ENDPOINT = 'https://ads.yieldmo.com/exchange/prebid';
|
|
27
|
-
const VIDEO_SERVER_ENDPOINT = 'https://ads.yieldmo.com/exchange/prebidvideo';
|
|
28
27
|
const PB_COOKIE_ASSIST_SYNC_ENDPOINT = `https://ads.yieldmo.com/pbcas`;
|
|
28
|
+
const BANNER_PATH = '/exchange/prebid';
|
|
29
|
+
const VIDEO_PATH = '/exchange/prebidvideo';
|
|
30
|
+
const STAGE_DOMAIN = 'https://ads-stg.yieldmo.com';
|
|
31
|
+
const PROD_DOMAIN = 'https://ads.yieldmo.com';
|
|
29
32
|
const OUTSTREAM_VIDEO_PLAYER_URL = 'https://prebid-outstream.yieldmo.com/bundle.js';
|
|
30
33
|
const OPENRTB_VIDEO_BIDPARAMS = ['mimes', 'startdelay', 'placement', 'startdelay', 'skipafter', 'protocols', 'api',
|
|
31
34
|
'playbackmethod', 'maxduration', 'minduration', 'pos', 'skip', 'skippable'];
|
|
@@ -40,7 +43,7 @@ const BANNER_REQUEST_PROPERTIES_TO_REDUCE = ['description', 'title', 'pr', 'page
|
|
|
40
43
|
export const spec = {
|
|
41
44
|
code: BIDDER_CODE,
|
|
42
45
|
supportedMediaTypes: [BANNER, VIDEO],
|
|
43
|
-
|
|
46
|
+
gvlid: GVLID,
|
|
44
47
|
/**
|
|
45
48
|
* Determines whether or not the given bid request is valid.
|
|
46
49
|
* @param {object} bid, bid to validate
|
|
@@ -59,6 +62,9 @@ export const spec = {
|
|
|
59
62
|
* @return ServerRequest Info describing the request to the server.
|
|
60
63
|
*/
|
|
61
64
|
buildRequests: function (bidRequests, bidderRequest) {
|
|
65
|
+
const stage = isStage(bidderRequest);
|
|
66
|
+
const bannerUrl = getAdserverUrl(BANNER_PATH, stage);
|
|
67
|
+
const videoUrl = getAdserverUrl(VIDEO_PATH, stage);
|
|
62
68
|
const bannerBidRequests = bidRequests.filter(request => hasBannerMediaType(request));
|
|
63
69
|
const videoBidRequests = bidRequests.filter(request => hasVideoMediaType(request));
|
|
64
70
|
let serverRequests = [];
|
|
@@ -122,8 +128,8 @@ export const spec = {
|
|
|
122
128
|
serverRequest.eids = JSON.stringify(eids);
|
|
123
129
|
};
|
|
124
130
|
// check if url exceeded max length
|
|
125
|
-
const
|
|
126
|
-
let extraCharacters =
|
|
131
|
+
const fullUrl = `${bannerUrl}?${parseQueryStringParameters(serverRequest)}`;
|
|
132
|
+
let extraCharacters = fullUrl.length - MAX_BANNER_REQUEST_URL_LENGTH;
|
|
127
133
|
if (extraCharacters > 0) {
|
|
128
134
|
for (let i = 0; i < BANNER_REQUEST_PROPERTIES_TO_REDUCE.length; i++) {
|
|
129
135
|
extraCharacters = shortcutProperty(extraCharacters, serverRequest, BANNER_REQUEST_PROPERTIES_TO_REDUCE[i]);
|
|
@@ -136,7 +142,7 @@ export const spec = {
|
|
|
136
142
|
|
|
137
143
|
serverRequests.push({
|
|
138
144
|
method: 'GET',
|
|
139
|
-
url:
|
|
145
|
+
url: bannerUrl,
|
|
140
146
|
data: serverRequest
|
|
141
147
|
});
|
|
142
148
|
}
|
|
@@ -148,7 +154,7 @@ export const spec = {
|
|
|
148
154
|
};
|
|
149
155
|
serverRequests.push({
|
|
150
156
|
method: 'POST',
|
|
151
|
-
url:
|
|
157
|
+
url: videoUrl,
|
|
152
158
|
data: serverRequest
|
|
153
159
|
});
|
|
154
160
|
}
|
|
@@ -249,7 +255,6 @@ function addPlacement(request) {
|
|
|
249
255
|
if (transactionId) {
|
|
250
256
|
placementInfo.tid = transactionId;
|
|
251
257
|
}
|
|
252
|
-
|
|
253
258
|
if (request.auctionId) {
|
|
254
259
|
placementInfo.auctionId = request.auctionId;
|
|
255
260
|
}
|
|
@@ -676,3 +681,12 @@ function canAccessTopWindow() {
|
|
|
676
681
|
return false;
|
|
677
682
|
}
|
|
678
683
|
}
|
|
684
|
+
|
|
685
|
+
function isStage(bidderRequest) {
|
|
686
|
+
return !!bidderRequest.refererInfo?.referer?.includes('pb_force_a');
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
function getAdserverUrl(path, stage) {
|
|
690
|
+
const domain = stage ? STAGE_DOMAIN : PROD_DOMAIN;
|
|
691
|
+
return `${domain}${path}`;
|
|
692
|
+
}
|
|
@@ -4,6 +4,17 @@ import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
|
4
4
|
import { Renderer } from '../src/Renderer.js';
|
|
5
5
|
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {import('../src/adapters/bidderFactory').Bid} Bid
|
|
9
|
+
* @typedef {import('../src/adapters/bidderFactory').BidRequest} BidRequest
|
|
10
|
+
* @typedef {import('../src/adapters/bidderFactory').BidderSpec} BidderSpec
|
|
11
|
+
* @typedef {import('../src/adapters/bidderFactory').ServerRequest} ServerRequest
|
|
12
|
+
* @typedef {import('../src/adapters/bidderFactory').ServerResponse} ServerResponse
|
|
13
|
+
* @typedef {import('../src/adapters/bidderFactory').SyncOptions} SyncOptions
|
|
14
|
+
* @typedef {import('../src/adapters/bidderFactory').UserSync} UserSync
|
|
15
|
+
* @typedef {import('../src/auction').BidderRequest} BidderRequest
|
|
16
|
+
*/
|
|
17
|
+
|
|
7
18
|
const BIDDER_CODE = 'yieldone';
|
|
8
19
|
const ENDPOINT_URL = 'https://y.one.impact-ad.jp/h_bid';
|
|
9
20
|
const USER_SYNC_URL = 'https://y.one.impact-ad.jp/push_sync';
|
|
@@ -13,13 +24,25 @@ const VIEWABLE_PERCENTAGE_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstvi
|
|
|
13
24
|
|
|
14
25
|
const DEFAULT_VIDEO_SIZE = {w: 640, h: 360};
|
|
15
26
|
|
|
27
|
+
/** @type BidderSpec */
|
|
16
28
|
export const spec = {
|
|
17
29
|
code: BIDDER_CODE,
|
|
18
30
|
aliases: ['y1'],
|
|
19
31
|
supportedMediaTypes: [BANNER, VIDEO],
|
|
32
|
+
/**
|
|
33
|
+
* Determines whether or not the given bid request is valid.
|
|
34
|
+
* @param {BidRequest} bid The bid params to validate.
|
|
35
|
+
* @returns {boolean} True if this is a valid bid, and false otherwise.
|
|
36
|
+
*/
|
|
20
37
|
isBidRequestValid: function(bid) {
|
|
21
38
|
return !!(bid.params.placementId);
|
|
22
39
|
},
|
|
40
|
+
/**
|
|
41
|
+
* Make a server request from the list of BidRequests.
|
|
42
|
+
* @param {Bid[]} validBidRequests - An array of bids.
|
|
43
|
+
* @param {BidderRequest} bidderRequest - bidder request object.
|
|
44
|
+
* @returns {ServerRequest|ServerRequest[]} ServerRequest Info describing the request to the server.
|
|
45
|
+
*/
|
|
23
46
|
buildRequests: function(validBidRequests, bidderRequest) {
|
|
24
47
|
return validBidRequests.map(bidRequest => {
|
|
25
48
|
const params = bidRequest.params;
|
|
@@ -96,6 +119,12 @@ export const spec = {
|
|
|
96
119
|
};
|
|
97
120
|
});
|
|
98
121
|
},
|
|
122
|
+
/**
|
|
123
|
+
* Unpack the response from the server into a list of bids.
|
|
124
|
+
* @param {ServerResponse} serverResponse - A successful response from the server.
|
|
125
|
+
* @param {BidRequest} bidRequests
|
|
126
|
+
* @returns {Bid[]} - An array of bids which were nested inside the server.
|
|
127
|
+
*/
|
|
99
128
|
interpretResponse: function(serverResponse, bidRequest) {
|
|
100
129
|
const bidResponses = [];
|
|
101
130
|
const response = serverResponse.body;
|
|
@@ -188,6 +217,11 @@ export const spec = {
|
|
|
188
217
|
}
|
|
189
218
|
return bidResponses;
|
|
190
219
|
},
|
|
220
|
+
/**
|
|
221
|
+
* Register the user sync pixels which should be dropped after the auction.
|
|
222
|
+
* @param {SyncOptions} syncOptions Which user syncs are allowed?
|
|
223
|
+
* @returns {UserSync[]} The user syncs which should be dropped.
|
|
224
|
+
*/
|
|
191
225
|
getUserSyncs: function(syncOptions) {
|
|
192
226
|
if (syncOptions.iframeEnabled) {
|
|
193
227
|
return [{
|
|
@@ -202,7 +236,7 @@ export const spec = {
|
|
|
202
236
|
* NOTE: server side does not yet support multiple formats.
|
|
203
237
|
* @param {Object} bidRequest -
|
|
204
238
|
* @param {boolean} [enabledOldFormat = true] - default: `true`.
|
|
205
|
-
* @
|
|
239
|
+
* @returns {string|null} - `"banner"` or `"video"` or `null`.
|
|
206
240
|
*/
|
|
207
241
|
function getMediaType(bidRequest, enabledOldFormat = true) {
|
|
208
242
|
let hasBannerType = Boolean(deepAccess(bidRequest, 'mediaTypes.banner'));
|
|
@@ -239,7 +273,7 @@ function getMediaType(bidRequest, enabledOldFormat = true) {
|
|
|
239
273
|
* @param {Object} bidRequest.banner -
|
|
240
274
|
* @param {Array<string>} bidRequest.banner.sizes -
|
|
241
275
|
* @param {boolean} [enabledOldFormat = true] - default: `true`.
|
|
242
|
-
* @
|
|
276
|
+
* @returns {string} - strings like `"300x250"` or `"300x250,728x90"`.
|
|
243
277
|
*/
|
|
244
278
|
function getBannerSizes(bidRequest, enabledOldFormat = true) {
|
|
245
279
|
let sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes');
|
|
@@ -254,10 +288,10 @@ function getBannerSizes(bidRequest, enabledOldFormat = true) {
|
|
|
254
288
|
/**
|
|
255
289
|
* @param {Object} bidRequest -
|
|
256
290
|
* @param {boolean} [enabledOldFormat = true] - default: `true`.
|
|
257
|
-
* @param {boolean} [
|
|
258
|
-
* @
|
|
291
|
+
* @param {boolean} [enabled1x1 = true] - default: `true`.
|
|
292
|
+
* @returns {{w: number, h: number}} -
|
|
259
293
|
*/
|
|
260
|
-
function getVideoSize(bidRequest, enabledOldFormat = true,
|
|
294
|
+
function getVideoSize(bidRequest, enabledOldFormat = true, enabled1x1 = true) {
|
|
261
295
|
/**
|
|
262
296
|
* @param {Array<number, number> | Array<Array<number, number>>} sizes -
|
|
263
297
|
* @return {{w: number, h: number} | null} -
|
|
@@ -287,10 +321,10 @@ function getVideoSize(bidRequest, enabledOldFormat = true, enabledFlux = true) {
|
|
|
287
321
|
playerSize = playerSize || _getPlayerSize(bidRequest.sizes);
|
|
288
322
|
}
|
|
289
323
|
|
|
290
|
-
if (
|
|
291
|
-
// NOTE: `video.playerSize` in
|
|
324
|
+
if (enabled1x1) {
|
|
325
|
+
// NOTE: `video.playerSize` in 1x1 is always [1,1].
|
|
292
326
|
if (playerSize && (playerSize.w === 1 && playerSize.h === 1)) {
|
|
293
|
-
// NOTE: `params.playerSize` is a specific object to support `
|
|
327
|
+
// NOTE: `params.playerSize` is a specific object to support `1x1`.
|
|
294
328
|
playerSize = _getPlayerSize(deepAccess(bidRequest, 'params.playerSize'));
|
|
295
329
|
}
|
|
296
330
|
}
|
|
@@ -298,6 +332,11 @@ function getVideoSize(bidRequest, enabledOldFormat = true, enabledFlux = true) {
|
|
|
298
332
|
return playerSize || DEFAULT_VIDEO_SIZE;
|
|
299
333
|
}
|
|
300
334
|
|
|
335
|
+
/**
|
|
336
|
+
* Create render for outstream video.
|
|
337
|
+
* @param {Object} serverResponse.body -
|
|
338
|
+
* @returns {Renderer} - Prebid Renderer object
|
|
339
|
+
*/
|
|
301
340
|
function newRenderer(response) {
|
|
302
341
|
const renderer = Renderer.install({
|
|
303
342
|
id: response.uid,
|
|
@@ -314,12 +353,21 @@ function newRenderer(response) {
|
|
|
314
353
|
return renderer;
|
|
315
354
|
}
|
|
316
355
|
|
|
356
|
+
/**
|
|
357
|
+
* Handles an outstream response after the library is loaded
|
|
358
|
+
* @param {Object} bid
|
|
359
|
+
*/
|
|
317
360
|
function outstreamRender(bid) {
|
|
318
361
|
bid.renderer.push(() => {
|
|
319
362
|
window.DACIVTPREBID.renderPrebid(bid);
|
|
320
363
|
});
|
|
321
364
|
}
|
|
322
365
|
|
|
366
|
+
/**
|
|
367
|
+
* Create render for cmer outstream video.
|
|
368
|
+
* @param {Object} serverResponse.body -
|
|
369
|
+
* @returns {Renderer} - Prebid Renderer object
|
|
370
|
+
*/
|
|
323
371
|
function newCmerRenderer(response) {
|
|
324
372
|
const renderer = Renderer.install({
|
|
325
373
|
id: response.uid,
|
|
@@ -336,6 +384,10 @@ function newCmerRenderer(response) {
|
|
|
336
384
|
return renderer;
|
|
337
385
|
}
|
|
338
386
|
|
|
387
|
+
/**
|
|
388
|
+
* Handles an outstream response after the library is loaded
|
|
389
|
+
* @param {Object} bid
|
|
390
|
+
*/
|
|
339
391
|
function cmerRender(bid) {
|
|
340
392
|
bid.renderer.push(() => {
|
|
341
393
|
window.CMERYONEPREBID.renderPrebid(bid);
|
|
@@ -13,8 +13,7 @@ Connect to YIELDONE for bids.
|
|
|
13
13
|
THE YIELDONE adapter requires setup and approval from the YIELDONE team.
|
|
14
14
|
Please reach out to your account team or y1s@platform-one.co.jp for more information.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
banner and video are specified as mediatypes, YIELDONE will treat it as a video unit.
|
|
16
|
+
YIELDONE adapter supports Banner, Video and Multi-Format(video, banner) currently.
|
|
18
17
|
|
|
19
18
|
# Test Parameters
|
|
20
19
|
```javascript
|
|
@@ -24,13 +23,16 @@ var adUnits = [
|
|
|
24
23
|
code: 'banner-div',
|
|
25
24
|
mediaTypes: {
|
|
26
25
|
banner: {
|
|
27
|
-
sizes: [
|
|
26
|
+
sizes: [
|
|
27
|
+
[300, 250],
|
|
28
|
+
[336, 280]
|
|
29
|
+
]
|
|
28
30
|
}
|
|
29
31
|
},
|
|
30
32
|
bids: [{
|
|
31
33
|
bidder: 'yieldone',
|
|
32
34
|
params: {
|
|
33
|
-
placementId: '36891'
|
|
35
|
+
placementId: '36891' // required
|
|
34
36
|
}
|
|
35
37
|
}]
|
|
36
38
|
},
|
|
@@ -44,11 +46,109 @@ var adUnits = [
|
|
|
44
46
|
},
|
|
45
47
|
},
|
|
46
48
|
bids: [{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
bidder: "yieldone",
|
|
50
|
+
params: {
|
|
51
|
+
placementId: "36892", // required
|
|
52
|
+
playerParams: { // optional
|
|
53
|
+
wrapperWidth: "320px", // optional
|
|
54
|
+
wrapperHeight: "180px" // optional
|
|
55
|
+
},
|
|
56
|
+
}
|
|
57
|
+
}]
|
|
58
|
+
},
|
|
59
|
+
// Video adUnit(mediaTypes.video.playerSize: [1,1])
|
|
60
|
+
{
|
|
61
|
+
code: 'video-1x1-div',
|
|
62
|
+
mediaTypes: {
|
|
63
|
+
video: {
|
|
64
|
+
playerSize: [[1, 1]],
|
|
65
|
+
context: 'outstream'
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
bids: [{
|
|
69
|
+
bidder: 'yieldone',
|
|
70
|
+
params: {
|
|
71
|
+
placementId: "36892", // required
|
|
72
|
+
playerSize: [640, 360], // required
|
|
73
|
+
playerParams: { // optional
|
|
74
|
+
wrapperWidth: "320px", // optional
|
|
75
|
+
wrapperHeight: "180px" // optional
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
}]
|
|
79
|
+
},
|
|
80
|
+
// Multi-Format adUnit
|
|
81
|
+
{
|
|
82
|
+
code: "multi-format-div",
|
|
83
|
+
mediaTypes: {
|
|
84
|
+
banner: {
|
|
85
|
+
sizes: [
|
|
86
|
+
[300, 250],
|
|
87
|
+
[1, 1]
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
video: {
|
|
91
|
+
playerSize: [640, 360],
|
|
92
|
+
context: "outstream"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
bids: [{
|
|
96
|
+
// * "video" bid object should be placed before "banner" bid object.
|
|
97
|
+
// This bid will request a "video" media type ad.
|
|
98
|
+
bidder: "yieldone",
|
|
99
|
+
params: {
|
|
100
|
+
placementId: "36892", // required
|
|
101
|
+
playerParams: { // required
|
|
102
|
+
wrapperWidth: "320px", // optional
|
|
103
|
+
wrapperHeight: "180px" // optional
|
|
104
|
+
},
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
// This bid will request a "banner" media type ad.
|
|
109
|
+
bidder: "yieldone",
|
|
110
|
+
params: {
|
|
111
|
+
placementId: "36891" // required
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
// Multi-Format adUnit(mediaTypes.video.playerSize: [1,1])
|
|
117
|
+
{
|
|
118
|
+
code: "multi-format-1x1-div",
|
|
119
|
+
mediaTypes: {
|
|
120
|
+
banner: {
|
|
121
|
+
sizes: [
|
|
122
|
+
[300, 250],
|
|
123
|
+
[1, 1]
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
video: {
|
|
127
|
+
playerSize: [1, 1],
|
|
128
|
+
context: "outstream"
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
bids: [{
|
|
132
|
+
// * "video" bid object should be placed before "banner" bid object.
|
|
133
|
+
// This bid will request a "video" media type ad.
|
|
134
|
+
bidder: "yieldone",
|
|
135
|
+
params: {
|
|
136
|
+
placementId: "36892", // required
|
|
137
|
+
playerSize: [640, 360], // required
|
|
138
|
+
playerParams: { // required
|
|
139
|
+
wrapperWidth: "320px", // optional
|
|
140
|
+
wrapperHeight: "180px" // optional
|
|
141
|
+
},
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
// This bid will request a "banner" media type ad.
|
|
146
|
+
bidder: "yieldone",
|
|
147
|
+
params: {
|
|
148
|
+
placementId: "36891" // required
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
]
|
|
52
152
|
}
|
|
53
153
|
```
|
|
54
154
|
|
|
@@ -129,6 +129,10 @@ export const spec = {
|
|
|
129
129
|
deepSetValue(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
if (bidderRequest?.timeout) {
|
|
133
|
+
payload.tmax = bidderRequest.timeout;
|
|
134
|
+
}
|
|
135
|
+
|
|
132
136
|
provideEids(validBidRequests[0], payload);
|
|
133
137
|
const url = params.shortname ? ENDPOINT_URL.concat('?shortname=', params.shortname) : ENDPOINT_URL;
|
|
134
138
|
return {
|