prebid.js 7.13.0 → 7.14.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/adrelevantisBidAdapter.js +1 -1
- package/dist/adrinoBidAdapter.js +1 -1
- package/dist/adtelligentBidAdapter.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/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.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 -0
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fledgeForGpt.js +1 -0
- 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/invibesBidAdapter.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/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/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +117 -114
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxOrtbBidAdapter.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/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/spotxBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.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/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/xeBidAdapter.js +1 -0
- 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/modules/adrinoBidAdapter.js +1 -1
- package/modules/adtelligentBidAdapter.js +1 -1
- package/modules/bidwatchAnalyticsAdapter.js +10 -2
- package/modules/discoveryBidAdapter.js +467 -0
- package/modules/discoveryBidAdapter.md +60 -0
- package/modules/fledgeForGpt.js +52 -0
- package/modules/fledgeForGpt.md +60 -0
- package/modules/invibesBidAdapter.js +22 -11
- package/modules/kargoBidAdapter.js +7 -0
- package/modules/onetagBidAdapter.js +2 -3
- package/modules/openxOrtbBidAdapter.js +28 -2
- package/modules/outbrainBidAdapter.js +6 -3
- package/modules/spotxBidAdapter.js +10 -26
- package/modules/taboolaBidAdapter.js +2 -2
- package/modules/taboolaBidAdapter.md +10 -8
- package/modules/xeBidAdapter.js +206 -0
- package/modules/xeBidAdapter.md +54 -0
- package/modules/yieldlabBidAdapter.js +34 -3
- package/modules/yieldmoBidAdapter.js +16 -1
- package/package.json +2 -2
- package/src/adapterManager.js +8 -0
- package/src/adapters/bidderFactory.js +34 -4
- package/src/debugging.js +14 -6
- package/src/refererDetection.js +1 -12
- package/src/utils.js +10 -2
- package/test/spec/modules/adrinoBidAdapter_spec.js +10 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +2 -0
- package/test/spec/modules/discoveryBidAdapter_spec.js +92 -0
- package/test/spec/modules/enrichmentFpdModule_spec.js +1 -2
- package/test/spec/modules/fledge_spec.js +37 -0
- package/test/spec/modules/fpdModule_spec.js +1 -2
- package/test/spec/modules/invibesBidAdapter_spec.js +31 -2
- package/test/spec/modules/openxOrtbBidAdapter_spec.js +132 -18
- package/test/spec/modules/outbrainBidAdapter_spec.js +21 -0
- package/test/spec/modules/spotxBidAdapter_spec.js +30 -8
- package/test/spec/modules/taboolaBidAdapter_spec.js +77 -0
- package/test/spec/modules/xeBidAdapter_spec.js +450 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +37 -0
- package/test/spec/modules/yieldmoBidAdapter_spec.js +43 -3
- package/test/spec/unit/core/adapterManager_spec.js +58 -0
- package/test/spec/unit/core/bidderFactory_spec.js +64 -0
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import * as utils from '../src/utils.js';
|
|
2
|
+
import { getStorageManager } from '../src/storageManager.js';
|
|
3
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
4
|
+
import { BANNER, NATIVE } from '../src/mediaTypes.js';
|
|
5
|
+
|
|
6
|
+
const BIDDER_CODE = 'discovery';
|
|
7
|
+
const ENDPOINT_URL = 'https://rtb-jp.mediago.io/api/bid?tn=';
|
|
8
|
+
const TIME_TO_LIVE = 500;
|
|
9
|
+
const storage = getStorageManager();
|
|
10
|
+
let globals = {};
|
|
11
|
+
let itemMaps = {};
|
|
12
|
+
const MEDIATYPE = [BANNER, NATIVE];
|
|
13
|
+
|
|
14
|
+
/* ----- _ss_pp_id:start ------ */
|
|
15
|
+
const COOKIE_KEY_MGUID = '_ss_pp_id';
|
|
16
|
+
|
|
17
|
+
const NATIVERET = {
|
|
18
|
+
id: 'id',
|
|
19
|
+
bidfloor: 0,
|
|
20
|
+
// TODO Dynamic parameters
|
|
21
|
+
native: {
|
|
22
|
+
ver: '1.2',
|
|
23
|
+
plcmtcnt: 1,
|
|
24
|
+
assets: [
|
|
25
|
+
{
|
|
26
|
+
id: 1,
|
|
27
|
+
required: 1,
|
|
28
|
+
img: {
|
|
29
|
+
type: 3,
|
|
30
|
+
w: 300,
|
|
31
|
+
wmin: 300,
|
|
32
|
+
h: 174,
|
|
33
|
+
hmin: 174,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 2,
|
|
38
|
+
required: 1,
|
|
39
|
+
title: {
|
|
40
|
+
len: 75,
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
plcmttype: 1,
|
|
45
|
+
privacy: 1,
|
|
46
|
+
eventtrackers: [
|
|
47
|
+
{
|
|
48
|
+
event: 1,
|
|
49
|
+
methods: [1, 2],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
ext: {},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 获取用户id
|
|
58
|
+
* @return {string}
|
|
59
|
+
*/
|
|
60
|
+
const getUserID = () => {
|
|
61
|
+
const i = storage.getCookie(COOKIE_KEY_MGUID);
|
|
62
|
+
|
|
63
|
+
if (i === null) {
|
|
64
|
+
const uuid = utils.generateUUID();
|
|
65
|
+
storage.setCookie(COOKIE_KEY_MGUID, uuid);
|
|
66
|
+
return uuid;
|
|
67
|
+
}
|
|
68
|
+
return i;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/* ----- _ss_pp_id:end ------ */
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* get object key -> value
|
|
75
|
+
* @param {Object} obj 对象
|
|
76
|
+
* @param {...string} keys 键名
|
|
77
|
+
* @return {any}
|
|
78
|
+
*/
|
|
79
|
+
function getKv(obj, ...keys) {
|
|
80
|
+
let o = obj;
|
|
81
|
+
|
|
82
|
+
for (let key of keys) {
|
|
83
|
+
// console.log(key, o);
|
|
84
|
+
if (o && o[key]) {
|
|
85
|
+
o = o[key];
|
|
86
|
+
} else {
|
|
87
|
+
return '';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return o;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* get device
|
|
95
|
+
* @return {boolean}
|
|
96
|
+
*/
|
|
97
|
+
function getDevice() {
|
|
98
|
+
let check = false;
|
|
99
|
+
(function (a) {
|
|
100
|
+
let reg1 = new RegExp(
|
|
101
|
+
[
|
|
102
|
+
'(android|bbd+|meego)',
|
|
103
|
+
'.+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)',
|
|
104
|
+
'|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone',
|
|
105
|
+
'|p(ixi|re)/|plucker|pocket|psp|series(4|6)0|symbian|treo|up.(browser|link)|vodafone|wap',
|
|
106
|
+
'|windows ce|xda|xiino|android|ipad|playbook|silk',
|
|
107
|
+
].join(''),
|
|
108
|
+
'i'
|
|
109
|
+
);
|
|
110
|
+
let reg2 = new RegExp(
|
|
111
|
+
[
|
|
112
|
+
'1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)',
|
|
113
|
+
'|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )',
|
|
114
|
+
'|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55/|capi|ccwa|cdm-|cell',
|
|
115
|
+
'|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)',
|
|
116
|
+
'|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene',
|
|
117
|
+
'|gf-5|g-mo|go(.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c',
|
|
118
|
+
'|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|/)|ibro|idea|ig01|ikom',
|
|
119
|
+
'|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |/)|klon|kpt |kwc-|kyo(c|k)',
|
|
120
|
+
'|le(no|xi)|lg( g|/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50/|ma(te|ui|xo)|mc(01|21|ca)',
|
|
121
|
+
'|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]',
|
|
122
|
+
'|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)',
|
|
123
|
+
'|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio',
|
|
124
|
+
'|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55/|sa(ge|ma|mm|ms',
|
|
125
|
+
'|ny|va)|sc(01|h-|oo|p-)|sdk/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al',
|
|
126
|
+
'|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)',
|
|
127
|
+
'|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(.b|g1|si)|utst|',
|
|
128
|
+
'v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)',
|
|
129
|
+
'|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-',
|
|
130
|
+
'|your|zeto|zte-',
|
|
131
|
+
].join(''),
|
|
132
|
+
'i'
|
|
133
|
+
);
|
|
134
|
+
if (reg1.test(a) || reg2.test(a.substr(0, 4))) {
|
|
135
|
+
check = true;
|
|
136
|
+
}
|
|
137
|
+
})(navigator.userAgent || navigator.vendor || window.opera);
|
|
138
|
+
return check;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* get BidFloor
|
|
143
|
+
* @param {*} bid
|
|
144
|
+
* @param {*} mediaType
|
|
145
|
+
* @param {*} sizes
|
|
146
|
+
* @returns
|
|
147
|
+
*/
|
|
148
|
+
function getBidFloor(bid) {
|
|
149
|
+
if (!utils.isFn(bid.getFloor)) {
|
|
150
|
+
return utils.deepAccess(bid, 'params.bidfloor', 0);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const bidFloor = bid.getFloor({
|
|
155
|
+
currency: 'USD',
|
|
156
|
+
mediaType: '*',
|
|
157
|
+
size: '*',
|
|
158
|
+
});
|
|
159
|
+
return bidFloor.floor;
|
|
160
|
+
} catch (_) {
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* get sizes for rtb
|
|
167
|
+
* @param {Array|Object} requestSizes
|
|
168
|
+
* @return {Object}
|
|
169
|
+
*/
|
|
170
|
+
function transformSizes(requestSizes) {
|
|
171
|
+
let sizes = [];
|
|
172
|
+
let sizeObj = {};
|
|
173
|
+
|
|
174
|
+
if (
|
|
175
|
+
utils.isArray(requestSizes) &&
|
|
176
|
+
requestSizes.length === 2 &&
|
|
177
|
+
!utils.isArray(requestSizes[0])
|
|
178
|
+
) {
|
|
179
|
+
sizeObj.width = parseInt(requestSizes[0], 10);
|
|
180
|
+
sizeObj.height = parseInt(requestSizes[1], 10);
|
|
181
|
+
sizes.push(sizeObj);
|
|
182
|
+
} else if (typeof requestSizes === 'object') {
|
|
183
|
+
for (let i = 0; i < requestSizes.length; i++) {
|
|
184
|
+
let size = requestSizes[i];
|
|
185
|
+
sizeObj = {};
|
|
186
|
+
sizeObj.width = parseInt(size[0], 10);
|
|
187
|
+
sizeObj.height = parseInt(size[1], 10);
|
|
188
|
+
sizes.push(sizeObj);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return sizes;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Support sizes
|
|
196
|
+
const popInAdSize = [
|
|
197
|
+
{ w: 300, h: 250 },
|
|
198
|
+
{ w: 300, h: 600 },
|
|
199
|
+
{ w: 728, h: 90 },
|
|
200
|
+
{ w: 970, h: 250 },
|
|
201
|
+
{ w: 320, h: 50 },
|
|
202
|
+
{ w: 160, h: 600 },
|
|
203
|
+
{ w: 320, h: 180 },
|
|
204
|
+
{ w: 320, h: 100 },
|
|
205
|
+
{ w: 336, h: 280 },
|
|
206
|
+
];
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* get aditem setting
|
|
210
|
+
* @param {Array} validBidRequests an an array of bids
|
|
211
|
+
* @param {Object} bidderRequest The master bidRequest object
|
|
212
|
+
* @return {Object}
|
|
213
|
+
*/
|
|
214
|
+
function getItems(validBidRequests, bidderRequest) {
|
|
215
|
+
let items = [];
|
|
216
|
+
items = validBidRequests.map((req, i) => {
|
|
217
|
+
let ret = {};
|
|
218
|
+
// eslint-disable-next-line no-debugger
|
|
219
|
+
let mediaTypes = getKv(req, 'mediaTypes');
|
|
220
|
+
|
|
221
|
+
const bidFloor = getBidFloor(req);
|
|
222
|
+
let id = '' + (i + 1);
|
|
223
|
+
|
|
224
|
+
if (mediaTypes.native) {
|
|
225
|
+
ret = {...NATIVERET, ...{id, bidFloor}}
|
|
226
|
+
}
|
|
227
|
+
// banner
|
|
228
|
+
if (mediaTypes.banner) {
|
|
229
|
+
let sizes = transformSizes(getKv(req, 'sizes'));
|
|
230
|
+
let matchSize;
|
|
231
|
+
|
|
232
|
+
for (let size of sizes) {
|
|
233
|
+
matchSize = popInAdSize.find(
|
|
234
|
+
(item) => size.width === item.w && size.height === item.h
|
|
235
|
+
);
|
|
236
|
+
if (matchSize) {
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (!matchSize) {
|
|
241
|
+
return {};
|
|
242
|
+
}
|
|
243
|
+
ret = {
|
|
244
|
+
id: id,
|
|
245
|
+
bidfloor: bidFloor,
|
|
246
|
+
banner: {
|
|
247
|
+
h: matchSize.h,
|
|
248
|
+
w: matchSize.w,
|
|
249
|
+
pos: 1,
|
|
250
|
+
},
|
|
251
|
+
ext: {},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
itemMaps[id] = {
|
|
255
|
+
req,
|
|
256
|
+
ret,
|
|
257
|
+
};
|
|
258
|
+
return ret;
|
|
259
|
+
});
|
|
260
|
+
return items;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* get rtb qequest params
|
|
265
|
+
*
|
|
266
|
+
* @param {Array} validBidRequests an an array of bids
|
|
267
|
+
* @param {Object} bidderRequest The master bidRequest object
|
|
268
|
+
* @return {Object}
|
|
269
|
+
*/
|
|
270
|
+
function getParam(validBidRequests, bidderRequest) {
|
|
271
|
+
const pubcid = utils.deepAccess(validBidRequests[0], 'crumbs.pubcid');
|
|
272
|
+
let isMobile = getDevice() ? 1 : 0;
|
|
273
|
+
let auctionId = getKv(bidderRequest, 'auctionId');
|
|
274
|
+
let items = getItems(validBidRequests, bidderRequest);
|
|
275
|
+
|
|
276
|
+
const location = utils.deepAccess(bidderRequest, 'refererInfo.referer');
|
|
277
|
+
|
|
278
|
+
const timeout = bidderRequest.timeout || 2000;
|
|
279
|
+
|
|
280
|
+
if (items && items.length) {
|
|
281
|
+
let c = {
|
|
282
|
+
id: 'pp_hbjs_' + auctionId,
|
|
283
|
+
at: 1,
|
|
284
|
+
cur: ['USD'],
|
|
285
|
+
device: {
|
|
286
|
+
connectiontype: 0,
|
|
287
|
+
js: 1,
|
|
288
|
+
os: navigator.platform || '',
|
|
289
|
+
ua: navigator.userAgent,
|
|
290
|
+
language: /en/.test(navigator.language) ? 'en' : navigator.language,
|
|
291
|
+
},
|
|
292
|
+
user: {
|
|
293
|
+
buyeruid: getUserID(),
|
|
294
|
+
id: pubcid,
|
|
295
|
+
},
|
|
296
|
+
tmax: timeout,
|
|
297
|
+
site: {
|
|
298
|
+
name: globals['media'],
|
|
299
|
+
domain: globals['media'],
|
|
300
|
+
page: location,
|
|
301
|
+
ref: location,
|
|
302
|
+
mobile: isMobile,
|
|
303
|
+
cat: [], // todo
|
|
304
|
+
publisher: {
|
|
305
|
+
// todo
|
|
306
|
+
id: globals['media'],
|
|
307
|
+
name: globals['media'],
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
imp: items,
|
|
311
|
+
};
|
|
312
|
+
return c;
|
|
313
|
+
} else {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export const spec = {
|
|
319
|
+
code: BIDDER_CODE,
|
|
320
|
+
supportedMediaTypes: MEDIATYPE,
|
|
321
|
+
// aliases: ['ex'], // short code
|
|
322
|
+
/**
|
|
323
|
+
* Determines whether or not the given bid request is valid.
|
|
324
|
+
*
|
|
325
|
+
* @param {BidRequest} bid The bid params to validate.
|
|
326
|
+
* @return boolean True if this is a valid bid, and false otherwise.
|
|
327
|
+
*/
|
|
328
|
+
isBidRequestValid: function (bid) {
|
|
329
|
+
if (bid.params.token) {
|
|
330
|
+
globals['token'] = bid.params.token;
|
|
331
|
+
}
|
|
332
|
+
if (bid.params.media) {
|
|
333
|
+
globals['media'] = bid.params.media;
|
|
334
|
+
}
|
|
335
|
+
return !!(bid.params.token && bid.params.media);
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Make a server request from the list of BidRequests.
|
|
340
|
+
*
|
|
341
|
+
* @param {Array} validBidRequests an an array of bids
|
|
342
|
+
* @param {Object} bidderRequest The master bidRequest object
|
|
343
|
+
* @return ServerRequest Info describing the request to the server.
|
|
344
|
+
*/
|
|
345
|
+
buildRequests: function (validBidRequests, bidderRequest) {
|
|
346
|
+
let payload = getParam(validBidRequests, bidderRequest);
|
|
347
|
+
|
|
348
|
+
const payloadString = JSON.stringify(payload);
|
|
349
|
+
return {
|
|
350
|
+
method: 'POST',
|
|
351
|
+
url: ENDPOINT_URL + globals['token'],
|
|
352
|
+
data: payloadString,
|
|
353
|
+
};
|
|
354
|
+
},
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Unpack the response from the server into a list of bids.
|
|
358
|
+
* @param {ServerResponse} serverResponse A successful response from the server.
|
|
359
|
+
* @return {Bid[]} An array of bids which were nested inside the server.
|
|
360
|
+
*/
|
|
361
|
+
interpretResponse: function (serverResponse, bidRequest) {
|
|
362
|
+
const bids = getKv(serverResponse, 'body', 'seatbid', 0, 'bid');
|
|
363
|
+
const cur = getKv(serverResponse, 'body', 'cur');
|
|
364
|
+
const bidResponses = [];
|
|
365
|
+
for (let bid of bids) {
|
|
366
|
+
let impid = getKv(bid, 'impid');
|
|
367
|
+
if (itemMaps[impid]) {
|
|
368
|
+
let bidId = getKv(itemMaps[impid], 'req', 'bidId');
|
|
369
|
+
const mediaType = getKv(bid, 'w') ? 'banner' : 'native';
|
|
370
|
+
let bidResponse = {
|
|
371
|
+
requestId: bidId,
|
|
372
|
+
cpm: getKv(bid, 'price'),
|
|
373
|
+
creativeId: getKv(bid, 'cid'),
|
|
374
|
+
mediaType,
|
|
375
|
+
currency: cur,
|
|
376
|
+
netRevenue: true,
|
|
377
|
+
nurl: getKv(bid, 'nurl'),
|
|
378
|
+
ttl: TIME_TO_LIVE,
|
|
379
|
+
meta: {
|
|
380
|
+
advertiserDomains: getKv(bid, 'adomain') || []
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
if (mediaType === 'native') {
|
|
384
|
+
const adm = getKv(bid, 'adm');
|
|
385
|
+
const admObj = JSON.parse(adm);
|
|
386
|
+
var native = {};
|
|
387
|
+
admObj.assets.forEach((asset) => {
|
|
388
|
+
if (asset.title) {
|
|
389
|
+
native.title = asset.title.text;
|
|
390
|
+
} else if (asset.data) {
|
|
391
|
+
native.data = asset.data.value;
|
|
392
|
+
} else if (asset.img) {
|
|
393
|
+
switch (asset.img.type) {
|
|
394
|
+
case 1:
|
|
395
|
+
native.icon = {
|
|
396
|
+
url: asset.img.url,
|
|
397
|
+
width: asset.img.w,
|
|
398
|
+
height: asset.img.h,
|
|
399
|
+
};
|
|
400
|
+
break;
|
|
401
|
+
default:
|
|
402
|
+
native.image = {
|
|
403
|
+
url: asset.img.url,
|
|
404
|
+
width: asset.img.w,
|
|
405
|
+
height: asset.img.h,
|
|
406
|
+
};
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
if (admObj.link) {
|
|
412
|
+
if (admObj.link.url) {
|
|
413
|
+
native.clickUrl = admObj.link.url;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (Array.isArray(admObj.eventtrackers)) {
|
|
417
|
+
native.impressionTrackers = [];
|
|
418
|
+
admObj.eventtrackers.forEach((tracker) => {
|
|
419
|
+
if (tracker.event !== 1) {
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
switch (tracker.method) {
|
|
423
|
+
case 1:
|
|
424
|
+
native.impressionTrackers.push(tracker.url);
|
|
425
|
+
break;
|
|
426
|
+
// case 2:
|
|
427
|
+
// native.javascriptTrackers = `<script src=\"${tracker.url}\"></script>`;
|
|
428
|
+
// break;
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
if (admObj.purl) {
|
|
433
|
+
native.purl = admObj.purl;
|
|
434
|
+
}
|
|
435
|
+
bidResponse['native'] = native;
|
|
436
|
+
} else {
|
|
437
|
+
bidResponse['width'] = getKv(bid, 'w');
|
|
438
|
+
bidResponse['height'] = getKv(bid, 'h');
|
|
439
|
+
bidResponse['ad'] = getKv(bid, 'adm');
|
|
440
|
+
}
|
|
441
|
+
bidResponses.push(bidResponse);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return bidResponses;
|
|
446
|
+
},
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Register bidder specific code, which will execute if bidder timed out after an auction
|
|
450
|
+
* @param {data} Containing timeout specific data
|
|
451
|
+
*/
|
|
452
|
+
onTimeout: function (data) {
|
|
453
|
+
utils.logError('DiscoveryDSP adapter timed out for the auction.');
|
|
454
|
+
// TODO send request timeout to serve, the interface is not ready
|
|
455
|
+
},
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Register bidder specific code, which will execute if a bid from this bidder won the auction
|
|
459
|
+
* @param {Bid} The bid that won the auction
|
|
460
|
+
*/
|
|
461
|
+
onBidWon: function (bid) {
|
|
462
|
+
if (bid['nurl']) {
|
|
463
|
+
utils.triggerPixel(bid['nurl'])
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: DiscoveryDSP Bid Adapter
|
|
5
|
+
Module Type: Bidder Adapter
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
# Description
|
|
9
|
+
|
|
10
|
+
Module that connects to popIn's demand sources
|
|
11
|
+
|
|
12
|
+
The DiscoveryDSP Bidding adapter requires setup before beginning. Please contact us at <media-support@popin.cc>
|
|
13
|
+
|
|
14
|
+
# Test Parameters
|
|
15
|
+
```
|
|
16
|
+
var adUnits = [
|
|
17
|
+
// native
|
|
18
|
+
{
|
|
19
|
+
code: "test-div-1",
|
|
20
|
+
mediaTypes: {
|
|
21
|
+
native: {
|
|
22
|
+
title: {
|
|
23
|
+
required: true
|
|
24
|
+
},
|
|
25
|
+
image: {
|
|
26
|
+
required: true
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
bids: [
|
|
31
|
+
{
|
|
32
|
+
bidder: "discovery",
|
|
33
|
+
params: {
|
|
34
|
+
token: "a1b067897e4ae093d1f94261e0ddc6c9",
|
|
35
|
+
media: 'test_media' // your media host
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
// banner
|
|
41
|
+
{
|
|
42
|
+
code: "test-div-2",
|
|
43
|
+
mediaTypes: {
|
|
44
|
+
banner: {
|
|
45
|
+
sizes: [[300, 250]],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
// Replace this object to test a new adapter!
|
|
49
|
+
bids: [
|
|
50
|
+
{
|
|
51
|
+
bidder: "discovery",
|
|
52
|
+
params: {
|
|
53
|
+
token: "d0f4902b616cc5c38cbe0a08676d0ed9",
|
|
54
|
+
media: 'test_media' // your media host
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fledge modules is responsible for registering fledged auction configs into the GPT slot;
|
|
3
|
+
* GPT is resposible to run the fledge auction.
|
|
4
|
+
*/
|
|
5
|
+
import { config } from '../src/config.js';
|
|
6
|
+
import { getHook } from '../src/hook.js';
|
|
7
|
+
import { getGptSlotForAdUnitCode, logInfo, logWarn } from '../src/utils.js';
|
|
8
|
+
|
|
9
|
+
const MODULE = 'fledgeForGpt'
|
|
10
|
+
|
|
11
|
+
export let isEnabled = false;
|
|
12
|
+
|
|
13
|
+
config.getConfig('fledgeForGpt', config => init(config.fledgeForGpt));
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Module init.
|
|
17
|
+
*/
|
|
18
|
+
export function init(cfg) {
|
|
19
|
+
if (cfg && cfg.enabled === true) {
|
|
20
|
+
if (!isEnabled) {
|
|
21
|
+
getHook('addComponentAuction').before(addComponentAuctionHook);
|
|
22
|
+
isEnabled = true;
|
|
23
|
+
}
|
|
24
|
+
logInfo(MODULE, `isEnabled`, cfg);
|
|
25
|
+
} else {
|
|
26
|
+
if (isEnabled) {
|
|
27
|
+
getHook('addComponentAuction').getHooks({hook: addComponentAuctionHook}).remove();
|
|
28
|
+
isEnabled = false;
|
|
29
|
+
}
|
|
30
|
+
logInfo(MODULE, `isDisabled`, cfg);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function addComponentAuctionHook(next, bidRequest, componentAuctionConfig) {
|
|
35
|
+
const seller = componentAuctionConfig.seller;
|
|
36
|
+
const adUnitCode = bidRequest.adUnitCode;
|
|
37
|
+
const gptSlot = getGptSlotForAdUnitCode(adUnitCode);
|
|
38
|
+
if (gptSlot && gptSlot.setConfig) {
|
|
39
|
+
delete componentAuctionConfig.bidId;
|
|
40
|
+
gptSlot.setConfig({
|
|
41
|
+
componentAuction: [{
|
|
42
|
+
configKey: seller,
|
|
43
|
+
auctionConfig: componentAuctionConfig
|
|
44
|
+
}]
|
|
45
|
+
});
|
|
46
|
+
logInfo(MODULE, `register component auction config for: ${adUnitCode} x ${seller}: ${gptSlot.getAdUnitPath()}`, componentAuctionConfig);
|
|
47
|
+
} else {
|
|
48
|
+
logWarn(MODULE, `unable to register component auction config for: ${adUnitCode} x ${seller}.`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
next(bidRequest, componentAuctionConfig);
|
|
52
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
|
|
3
|
+
This module enables the handling of fledge auction by GPT.
|
|
4
|
+
Bid adapters can now return component auction configs in addition to bids.
|
|
5
|
+
|
|
6
|
+
Those component auction configs will be registered to the GPT ad slot,
|
|
7
|
+
and GPT will be responsible to run fledge auction and render the winning fledge ad.
|
|
8
|
+
|
|
9
|
+
Find out more [here](https://github.com/WICG/turtledove/blob/main/FLEDGE.md).
|
|
10
|
+
|
|
11
|
+
## Integration
|
|
12
|
+
|
|
13
|
+
Build the fledge module into the Prebid.js package with:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
gulp build --modules=fledgeForGpt,...
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Module Configuration Parameters
|
|
20
|
+
|
|
21
|
+
|Name |Type |Description |Notes |
|
|
22
|
+
| :------------ | :------------ | :------------ |:------------ |
|
|
23
|
+
|enabled | Boolean |Enable/disable the module |Defaults to `false` |
|
|
24
|
+
|
|
25
|
+
## Configuration
|
|
26
|
+
|
|
27
|
+
Fledge support need to be enabled at 3 levels:
|
|
28
|
+
- `fledgeForGpt` module
|
|
29
|
+
- bidder
|
|
30
|
+
- adunit
|
|
31
|
+
### enabling the fledgeForGpt module
|
|
32
|
+
```js
|
|
33
|
+
pbjs.que.push(function() {
|
|
34
|
+
pbjs.setConfig({
|
|
35
|
+
fledgeForGpt: {
|
|
36
|
+
enabled: true
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### enablingthe bidder
|
|
43
|
+
```js
|
|
44
|
+
pbjs.setBidderConfig({
|
|
45
|
+
bidders: ["openx"],
|
|
46
|
+
config: {
|
|
47
|
+
fledgeEnabled: true
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### enabling the adunit
|
|
53
|
+
ortb2Imp.ext.ae on the adunit must be set 1
|
|
54
|
+
```js
|
|
55
|
+
ortb2Imp: {
|
|
56
|
+
ext: {
|
|
57
|
+
ae: 1
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|