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.
Files changed (157) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adgenerationBidAdapter.js +1 -1
  5. package/dist/adrelevantisBidAdapter.js +1 -1
  6. package/dist/adrinoBidAdapter.js +1 -1
  7. package/dist/adtelligentBidAdapter.js +1 -1
  8. package/dist/adtrgtmeBidAdapter.js +1 -1
  9. package/dist/adxcgBidAdapter.js +1 -1
  10. package/dist/ajaBidAdapter.js +1 -1
  11. package/dist/amxBidAdapter.js +1 -1
  12. package/dist/amxIdSystem.js +1 -1
  13. package/dist/appierAnalyticsAdapter.js +1 -1
  14. package/dist/appnexusBidAdapter.js +1 -1
  15. package/dist/asoBidAdapter.js +1 -1
  16. package/dist/axonixBidAdapter.js +1 -1
  17. package/dist/bidglassBidAdapter.js +1 -1
  18. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  19. package/dist/big-richmediaBidAdapter.js +1 -1
  20. package/dist/bridgewellBidAdapter.js +1 -1
  21. package/dist/brightMountainMediaBidAdapter.js +1 -1
  22. package/dist/concertBidAdapter.js +1 -1
  23. package/dist/connectadBidAdapter.js +1 -1
  24. package/dist/consumableBidAdapter.js +1 -1
  25. package/dist/conversantBidAdapter.js +1 -1
  26. package/dist/craftBidAdapter.js +1 -1
  27. package/dist/criteoBidAdapter.js +1 -1
  28. package/dist/discoveryBidAdapter.js +1 -0
  29. package/dist/dspxBidAdapter.js +1 -1
  30. package/dist/eplanningBidAdapter.js +1 -1
  31. package/dist/finativeBidAdapter.js +1 -1
  32. package/dist/fledgeForGpt.js +1 -0
  33. package/dist/glimpseBidAdapter.js +1 -1
  34. package/dist/gmosspBidAdapter.js +1 -1
  35. package/dist/goldbachBidAdapter.js +1 -1
  36. package/dist/gridBidAdapter.js +1 -1
  37. package/dist/gridNMBidAdapter.js +1 -1
  38. package/dist/gumgumBidAdapter.js +1 -1
  39. package/dist/h12mediaBidAdapter.js +1 -1
  40. package/dist/id5IdSystem.js +1 -1
  41. package/dist/improvedigitalBidAdapter.js +1 -1
  42. package/dist/inmarBidAdapter.js +1 -1
  43. package/dist/insticatorBidAdapter.js +1 -1
  44. package/dist/invibesBidAdapter.js +1 -1
  45. package/dist/ixBidAdapter.js +1 -1
  46. package/dist/justpremiumBidAdapter.js +1 -1
  47. package/dist/kargoBidAdapter.js +1 -1
  48. package/dist/konduitAnalyticsAdapter.js +1 -1
  49. package/dist/kueezBidAdapter.js +1 -1
  50. package/dist/lassoBidAdapter.js +1 -1
  51. package/dist/lifestreetBidAdapter.js +1 -1
  52. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  53. package/dist/logicadBidAdapter.js +1 -1
  54. package/dist/loglyliftBidAdapter.js +1 -1
  55. package/dist/malltvAnalyticsAdapter.js +1 -1
  56. package/dist/marsmediaBidAdapter.js +1 -1
  57. package/dist/mediafuseBidAdapter.js +1 -1
  58. package/dist/mediasquareBidAdapter.js +1 -1
  59. package/dist/mgidBidAdapter.js +1 -1
  60. package/dist/minutemediaBidAdapter.js +1 -1
  61. package/dist/not-for-prod/prebid.js +117 -114
  62. package/dist/oguryBidAdapter.js +1 -1
  63. package/dist/onetagBidAdapter.js +1 -1
  64. package/dist/ooloAnalyticsAdapter.js +1 -1
  65. package/dist/openxOrtbBidAdapter.js +1 -1
  66. package/dist/outbrainBidAdapter.js +1 -1
  67. package/dist/parrableIdSystem.js +1 -1
  68. package/dist/pixfutureBidAdapter.js +1 -1
  69. package/dist/prebid-core.js +1 -1
  70. package/dist/publinkIdSystem.js +1 -1
  71. package/dist/pubmaticBidAdapter.js +1 -1
  72. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  73. package/dist/pxyzBidAdapter.js +1 -1
  74. package/dist/quantcastBidAdapter.js +1 -1
  75. package/dist/readpeakBidAdapter.js +1 -1
  76. package/dist/relaidoBidAdapter.js +1 -1
  77. package/dist/rhythmoneBidAdapter.js +1 -1
  78. package/dist/riseBidAdapter.js +1 -1
  79. package/dist/rubiconAnalyticsAdapter.js +1 -1
  80. package/dist/rubiconBidAdapter.js +1 -1
  81. package/dist/seedingAllianceBidAdapter.js +1 -1
  82. package/dist/seedtagBidAdapter.js +1 -1
  83. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  84. package/dist/sharethroughBidAdapter.js +1 -1
  85. package/dist/shinezBidAdapter.js +1 -1
  86. package/dist/smaatoBidAdapter.js +1 -1
  87. package/dist/smartadserverBidAdapter.js +1 -1
  88. package/dist/smartxBidAdapter.js +1 -1
  89. package/dist/smilewantedBidAdapter.js +1 -1
  90. package/dist/sonobiBidAdapter.js +1 -1
  91. package/dist/sovrnAnalyticsAdapter.js +1 -1
  92. package/dist/sovrnBidAdapter.js +1 -1
  93. package/dist/spotxBidAdapter.js +1 -1
  94. package/dist/sspBCBidAdapter.js +1 -1
  95. package/dist/sublimeBidAdapter.js +1 -1
  96. package/dist/synacormediaBidAdapter.js +1 -1
  97. package/dist/taboolaBidAdapter.js +1 -1
  98. package/dist/targetVideoBidAdapter.js +1 -1
  99. package/dist/teadsBidAdapter.js +1 -1
  100. package/dist/trionBidAdapter.js +1 -1
  101. package/dist/tripleliftBidAdapter.js +1 -1
  102. package/dist/ttdBidAdapter.js +1 -1
  103. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  104. package/dist/underdogmediaBidAdapter.js +1 -1
  105. package/dist/undertoneBidAdapter.js +1 -1
  106. package/dist/vidazooBidAdapter.js +1 -1
  107. package/dist/videobyteBidAdapter.js +1 -1
  108. package/dist/visxBidAdapter.js +1 -1
  109. package/dist/vuukleBidAdapter.js +1 -1
  110. package/dist/widespaceBidAdapter.js +1 -1
  111. package/dist/winrBidAdapter.js +1 -1
  112. package/dist/xeBidAdapter.js +1 -0
  113. package/dist/yahoosspBidAdapter.js +1 -1
  114. package/dist/yieldlabBidAdapter.js +1 -1
  115. package/dist/yieldmoBidAdapter.js +1 -1
  116. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  117. package/modules/adrinoBidAdapter.js +1 -1
  118. package/modules/adtelligentBidAdapter.js +1 -1
  119. package/modules/bidwatchAnalyticsAdapter.js +10 -2
  120. package/modules/discoveryBidAdapter.js +467 -0
  121. package/modules/discoveryBidAdapter.md +60 -0
  122. package/modules/fledgeForGpt.js +52 -0
  123. package/modules/fledgeForGpt.md +60 -0
  124. package/modules/invibesBidAdapter.js +22 -11
  125. package/modules/kargoBidAdapter.js +7 -0
  126. package/modules/onetagBidAdapter.js +2 -3
  127. package/modules/openxOrtbBidAdapter.js +28 -2
  128. package/modules/outbrainBidAdapter.js +6 -3
  129. package/modules/spotxBidAdapter.js +10 -26
  130. package/modules/taboolaBidAdapter.js +2 -2
  131. package/modules/taboolaBidAdapter.md +10 -8
  132. package/modules/xeBidAdapter.js +206 -0
  133. package/modules/xeBidAdapter.md +54 -0
  134. package/modules/yieldlabBidAdapter.js +34 -3
  135. package/modules/yieldmoBidAdapter.js +16 -1
  136. package/package.json +2 -2
  137. package/src/adapterManager.js +8 -0
  138. package/src/adapters/bidderFactory.js +34 -4
  139. package/src/debugging.js +14 -6
  140. package/src/refererDetection.js +1 -12
  141. package/src/utils.js +10 -2
  142. package/test/spec/modules/adrinoBidAdapter_spec.js +10 -0
  143. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +2 -0
  144. package/test/spec/modules/discoveryBidAdapter_spec.js +92 -0
  145. package/test/spec/modules/enrichmentFpdModule_spec.js +1 -2
  146. package/test/spec/modules/fledge_spec.js +37 -0
  147. package/test/spec/modules/fpdModule_spec.js +1 -2
  148. package/test/spec/modules/invibesBidAdapter_spec.js +31 -2
  149. package/test/spec/modules/openxOrtbBidAdapter_spec.js +132 -18
  150. package/test/spec/modules/outbrainBidAdapter_spec.js +21 -0
  151. package/test/spec/modules/spotxBidAdapter_spec.js +30 -8
  152. package/test/spec/modules/taboolaBidAdapter_spec.js +77 -0
  153. package/test/spec/modules/xeBidAdapter_spec.js +450 -0
  154. package/test/spec/modules/yieldlabBidAdapter_spec.js +37 -0
  155. package/test/spec/modules/yieldmoBidAdapter_spec.js +43 -3
  156. package/test/spec/unit/core/adapterManager_spec.js +58 -0
  157. 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
+ ```