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.
Files changed (191) 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/admaticBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/adxcgBidAdapter.js +1 -1
  9. package/dist/ajaBidAdapter.js +1 -1
  10. package/dist/amxBidAdapter.js +1 -1
  11. package/dist/amxIdSystem.js +1 -1
  12. package/dist/appierAnalyticsAdapter.js +1 -1
  13. package/dist/appnexusBidAdapter.js +1 -1
  14. package/dist/asoBidAdapter.js +1 -1
  15. package/dist/axonixBidAdapter.js +1 -1
  16. package/dist/beopBidAdapter.js +1 -1
  17. package/dist/bidglassBidAdapter.js +1 -1
  18. package/dist/big-richmediaBidAdapter.js +1 -1
  19. package/dist/bridgewellBidAdapter.js +1 -1
  20. package/dist/brightMountainMediaBidAdapter.js +1 -1
  21. package/dist/captifyRtdProvider.js +1 -0
  22. package/dist/carodaBidAdapter.js +1 -1
  23. package/dist/chtnwBidAdapter.js +1 -1
  24. package/dist/concertBidAdapter.js +1 -1
  25. package/dist/connectadBidAdapter.js +1 -1
  26. package/dist/consumableBidAdapter.js +1 -1
  27. package/dist/conversantBidAdapter.js +1 -1
  28. package/dist/craftBidAdapter.js +1 -1
  29. package/dist/criteoBidAdapter.js +1 -1
  30. package/dist/discoveryBidAdapter.js +1 -1
  31. package/dist/dspxBidAdapter.js +1 -1
  32. package/dist/eplanningBidAdapter.js +1 -1
  33. package/dist/finativeBidAdapter.js +1 -1
  34. package/dist/glimpseBidAdapter.js +1 -1
  35. package/dist/gmosspBidAdapter.js +1 -1
  36. package/dist/goldbachBidAdapter.js +1 -1
  37. package/dist/gridBidAdapter.js +1 -1
  38. package/dist/gridNMBidAdapter.js +1 -1
  39. package/dist/gumgumBidAdapter.js +1 -1
  40. package/dist/h12mediaBidAdapter.js +1 -1
  41. package/dist/id5IdSystem.js +1 -1
  42. package/dist/improvedigitalBidAdapter.js +1 -1
  43. package/dist/inmarBidAdapter.js +1 -1
  44. package/dist/insticatorBidAdapter.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/kueezRtbBidAdapter.js +1 -1
  51. package/dist/lassoBidAdapter.js +1 -1
  52. package/dist/lifestreetBidAdapter.js +1 -1
  53. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  54. package/dist/logicadBidAdapter.js +1 -1
  55. package/dist/loglyliftBidAdapter.js +1 -1
  56. package/dist/magniteAnalyticsAdapter.js +1 -1
  57. package/dist/malltvAnalyticsAdapter.js +1 -1
  58. package/dist/marsmediaBidAdapter.js +1 -1
  59. package/dist/mediafuseBidAdapter.js +1 -1
  60. package/dist/mediasquareBidAdapter.js +1 -1
  61. package/dist/mgidBidAdapter.js +1 -1
  62. package/dist/microadBidAdapter.js +1 -1
  63. package/dist/minutemediaBidAdapter.js +1 -1
  64. package/dist/nextMillenniumBidAdapter.js +1 -1
  65. package/dist/not-for-prod/prebid.js +154 -120
  66. package/dist/oguryBidAdapter.js +1 -1
  67. package/dist/onetagBidAdapter.js +1 -1
  68. package/dist/ooloAnalyticsAdapter.js +1 -1
  69. package/dist/outbrainBidAdapter.js +1 -1
  70. package/dist/parrableIdSystem.js +1 -1
  71. package/dist/pixfutureBidAdapter.js +1 -1
  72. package/dist/prebid-core.js +1 -1
  73. package/dist/publinkIdSystem.js +1 -1
  74. package/dist/pubmaticBidAdapter.js +1 -1
  75. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  76. package/dist/pxyzBidAdapter.js +1 -1
  77. package/dist/quantcastBidAdapter.js +1 -1
  78. package/dist/readpeakBidAdapter.js +1 -1
  79. package/dist/relaidoBidAdapter.js +1 -1
  80. package/dist/rhythmoneBidAdapter.js +1 -1
  81. package/dist/riseBidAdapter.js +1 -1
  82. package/dist/rubiconAnalyticsAdapter.js +1 -1
  83. package/dist/rubiconBidAdapter.js +1 -1
  84. package/dist/seedingAllianceBidAdapter.js +1 -1
  85. package/dist/seedtagBidAdapter.js +1 -1
  86. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  87. package/dist/sharethroughBidAdapter.js +1 -1
  88. package/dist/shinezBidAdapter.js +1 -1
  89. package/dist/smaatoBidAdapter.js +1 -1
  90. package/dist/smartadserverBidAdapter.js +1 -1
  91. package/dist/smartxBidAdapter.js +1 -1
  92. package/dist/smartytechBidAdapter.js +1 -0
  93. package/dist/smilewantedBidAdapter.js +1 -1
  94. package/dist/sonobiBidAdapter.js +1 -1
  95. package/dist/sovrnAnalyticsAdapter.js +1 -1
  96. package/dist/sovrnBidAdapter.js +1 -1
  97. package/dist/sspBCBidAdapter.js +1 -1
  98. package/dist/sublimeBidAdapter.js +1 -1
  99. package/dist/synacormediaBidAdapter.js +1 -1
  100. package/dist/taboolaBidAdapter.js +1 -1
  101. package/dist/tappxBidAdapter.js +1 -1
  102. package/dist/targetVideoBidAdapter.js +1 -1
  103. package/dist/teadsBidAdapter.js +1 -1
  104. package/dist/trionBidAdapter.js +1 -1
  105. package/dist/tripleliftBidAdapter.js +1 -1
  106. package/dist/ttdBidAdapter.js +1 -1
  107. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  108. package/dist/underdogmediaBidAdapter.js +1 -1
  109. package/dist/undertoneBidAdapter.js +1 -1
  110. package/dist/userId.js +1 -1
  111. package/dist/vidazooBidAdapter.js +1 -1
  112. package/dist/videobyteBidAdapter.js +1 -1
  113. package/dist/viqeoBidAdapter.js +1 -0
  114. package/dist/visxBidAdapter.js +1 -1
  115. package/dist/vuukleBidAdapter.js +1 -1
  116. package/dist/widespaceBidAdapter.js +1 -1
  117. package/dist/winrBidAdapter.js +1 -1
  118. package/dist/yahoosspBidAdapter.js +1 -1
  119. package/dist/yieldlabBidAdapter.js +1 -1
  120. package/dist/yieldmoBidAdapter.js +1 -1
  121. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  122. package/dist/zeta_global_sspBidAdapter.js +1 -1
  123. package/dist/zeusPrimeRtdProvider.js +31 -0
  124. package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
  125. package/modules/.submodules.json +3 -1
  126. package/modules/adagioBidAdapter.js +1 -1
  127. package/modules/admaticBidAdapter.js +108 -59
  128. package/modules/admaticBidAdapter.md +2 -2
  129. package/modules/beopBidAdapter.js +17 -2
  130. package/modules/captifyRtdProvider.js +146 -0
  131. package/modules/captifyRtdProvider.md +68 -0
  132. package/modules/concertBidAdapter.js +17 -3
  133. package/modules/conversantAnalyticsAdapter.md +12 -13
  134. package/modules/conversantBidAdapter.md +3 -3
  135. package/modules/discoveryBidAdapter.js +38 -17
  136. package/modules/discoveryBidAdapter.md +7 -6
  137. package/modules/gridBidAdapter.js +440 -22
  138. package/modules/kargoBidAdapter.js +14 -8
  139. package/modules/magniteAnalyticsAdapter.js +1 -1
  140. package/modules/microadBidAdapter.js +22 -11
  141. package/modules/nextMillenniumBidAdapter.js +20 -24
  142. package/modules/oguryBidAdapter.js +5 -2
  143. package/modules/pubmaticBidAdapter.js +1 -1
  144. package/modules/seedtagBidAdapter.js +9 -4
  145. package/modules/smartadserverBidAdapter.js +6 -2
  146. package/modules/smartxBidAdapter.js +10 -7
  147. package/modules/smartytechBidAdapter.js +78 -0
  148. package/modules/smartytechBidAdapter.md +44 -0
  149. package/modules/taboolaBidAdapter.js +3 -3
  150. package/modules/taboolaBidAdapter.md +0 -2
  151. package/modules/tappxBidAdapter.js +21 -6
  152. package/modules/ttdBidAdapter.js +4 -3
  153. package/modules/userId/index.js +1 -1
  154. package/modules/vidazooBidAdapter.js +29 -3
  155. package/modules/viqeoBidAdapter.js +180 -0
  156. package/modules/viqeoBidAdapter.md +56 -0
  157. package/modules/yieldlabBidAdapter.js +19 -8
  158. package/modules/yieldmoBidAdapter.js +22 -8
  159. package/modules/yieldoneBidAdapter.js +60 -8
  160. package/modules/yieldoneBidAdapter.md +109 -9
  161. package/modules/zeta_global_sspBidAdapter.js +4 -0
  162. package/modules/zeusPrimeRtdProvider.js +357 -0
  163. package/modules/zeusPrimeRtdProvider.md +60 -0
  164. package/package.json +1 -1
  165. package/src/adloader.js +0 -1
  166. package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
  167. package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
  168. package/test/spec/modules/beopBidAdapter_spec.js +52 -0
  169. package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
  170. package/test/spec/modules/concertBidAdapter_spec.js +26 -15
  171. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
  172. package/test/spec/modules/gridBidAdapter_spec.js +289 -1
  173. package/test/spec/modules/kargoBidAdapter_spec.js +76 -4
  174. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +20 -0
  175. package/test/spec/modules/microadBidAdapter_spec.js +48 -0
  176. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
  177. package/test/spec/modules/oguryBidAdapter_spec.js +27 -5
  178. package/test/spec/modules/pubmaticBidAdapter_spec.js +2 -2
  179. package/test/spec/modules/seedtagBidAdapter_spec.js +34 -10
  180. package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
  181. package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
  182. package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
  183. package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
  184. package/test/spec/modules/ttdBidAdapter_spec.js +13 -0
  185. package/test/spec/modules/vidazooBidAdapter_spec.js +1 -0
  186. package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
  187. package/test/spec/modules/yieldlabBidAdapter_spec.js +125 -0
  188. package/test/spec/modules/yieldmoBidAdapter_spec.js +3 -4
  189. package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
  190. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
  191. 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
- for (const key in iabContent) {
381
- if (iabContent.hasOwnProperty(key)) {
382
- const value = (arrKeys.indexOf(key) !== -1 && Array.isArray(iabContent[key]))
383
- ? iabContent[key].map(node => encodeURIComponent(node)).join('|') : encodeURIComponent(iabContent[key])
384
- str.push(''.concat(key, ':', value))
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
- return encodeURIComponent(str.join(','))
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 url = `${BANNER_SERVER_ENDPOINT}?${parseQueryStringParameters(serverRequest)}`;
126
- let extraCharacters = url.length - MAX_BANNER_REQUEST_URL_LENGTH;
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: BANNER_SERVER_ENDPOINT,
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: VIDEO_SERVER_ENDPOINT,
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
- * @return {string|null} - `"banner"` or `"video"` or `null`.
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
- * @return {string} - strings like `"300x250"` or `"300x250,728x90"`.
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} [enabledFlux = true] - default: `true`.
258
- * @return {{w: number, h: number}} -
291
+ * @param {boolean} [enabled1x1 = true] - default: `true`.
292
+ * @returns {{w: number, h: number}} -
259
293
  */
260
- function getVideoSize(bidRequest, enabledOldFormat = true, enabledFlux = 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 (enabledFlux) {
291
- // NOTE: `video.playerSize` in Flux is always [1,1].
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 `FLUX`.
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
- Note: THE YIELDONE adapter do not support "multi-format" scenario... if both
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: [[300, 250], [336, 280]]
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
- bidder: 'yieldone',
48
- params: {
49
- placementId: '41993'
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 {