prebid.js 8.2.0 → 8.3.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/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adqueryBidAdapter.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adtelligentBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/ajaBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/appierAnalyticsAdapter.js +1 -1
  16. package/dist/appnexusBidAdapter.js +1 -1
  17. package/dist/asoBidAdapter.js +1 -1
  18. package/dist/axonixBidAdapter.js +1 -1
  19. package/dist/beopBidAdapter.js +1 -1
  20. package/dist/bidglassBidAdapter.js +1 -1
  21. package/dist/big-richmediaBidAdapter.js +1 -1
  22. package/dist/bridBidAdapter.js +1 -1
  23. package/dist/bridgewellBidAdapter.js +1 -1
  24. package/dist/brightMountainMediaBidAdapter.js +1 -1
  25. package/dist/carodaBidAdapter.js +1 -1
  26. package/dist/chtnwBidAdapter.js +1 -1
  27. package/dist/concertBidAdapter.js +1 -1
  28. package/dist/connectadBidAdapter.js +1 -1
  29. package/dist/consumableBidAdapter.js +1 -1
  30. package/dist/conversantAnalyticsAdapter.js +1 -1
  31. package/dist/conversantBidAdapter.js +1 -1
  32. package/dist/craftBidAdapter.js +1 -1
  33. package/dist/criteoBidAdapter.js +1 -1
  34. package/dist/cwireBidAdapter.js +1 -1
  35. package/dist/dependencies.json +3 -0
  36. package/dist/discoveryBidAdapter.js +1 -1
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/eplanningBidAdapter.js +1 -1
  39. package/dist/euidIdSystem.js +1 -1
  40. package/dist/feedadBidAdapter.js +1 -1
  41. package/dist/finativeBidAdapter.js +1 -1
  42. package/dist/freewheel-sspBidAdapter.js +1 -1
  43. package/dist/gmosspBidAdapter.js +1 -1
  44. package/dist/goldbachBidAdapter.js +1 -1
  45. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  46. package/dist/greenbidsRtdProvider.js +1 -1
  47. package/dist/gridBidAdapter.js +1 -1
  48. package/dist/gumgumBidAdapter.js +1 -1
  49. package/dist/h12mediaBidAdapter.js +1 -1
  50. package/dist/holidBidAdapter.js +1 -1
  51. package/dist/hypelabBidAdapter.js +1 -1
  52. package/dist/id5IdSystem.js +1 -1
  53. package/dist/imdsBidAdapter.js +1 -1
  54. package/dist/improvedigitalBidAdapter.js +1 -1
  55. package/dist/insticatorBidAdapter.js +1 -1
  56. package/dist/ixBidAdapter.js +1 -1
  57. package/dist/justpremiumBidAdapter.js +1 -1
  58. package/dist/kargoBidAdapter.js +1 -1
  59. package/dist/konduitAnalyticsAdapter.js +1 -1
  60. package/dist/kueezBidAdapter.js +1 -1
  61. package/dist/kueezRtbBidAdapter.js +1 -1
  62. package/dist/kulturemediaBidAdapter.js +1 -1
  63. package/dist/lassoBidAdapter.js +1 -1
  64. package/dist/lifestreetBidAdapter.js +1 -1
  65. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  66. package/dist/logicadBidAdapter.js +1 -1
  67. package/dist/loglyliftBidAdapter.js +1 -1
  68. package/dist/magniteAnalyticsAdapter.js +1 -1
  69. package/dist/malltvAnalyticsAdapter.js +1 -1
  70. package/dist/marsmediaBidAdapter.js +1 -1
  71. package/dist/mediafuseBidAdapter.js +1 -1
  72. package/dist/mediagoBidAdapter.js +1 -1
  73. package/dist/mediasquareBidAdapter.js +1 -1
  74. package/dist/mgidBidAdapter.js +1 -1
  75. package/dist/minutemediaBidAdapter.js +1 -1
  76. package/dist/minutemediaplusBidAdapter.js +1 -1
  77. package/dist/nexx360BidAdapter.js +1 -1
  78. package/dist/not-for-prod/prebid.js +132 -132
  79. package/dist/oguryBidAdapter.js +1 -1
  80. package/dist/onetagBidAdapter.js +1 -1
  81. package/dist/ooloAnalyticsAdapter.js +1 -1
  82. package/dist/optidigitalBidAdapter.js +1 -1
  83. package/dist/outbrainBidAdapter.js +1 -1
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/pixfutureBidAdapter.js +1 -1
  86. package/dist/prebid-core.js +1 -1
  87. package/dist/publinkIdSystem.js +1 -1
  88. package/dist/pubmaticBidAdapter.js +1 -1
  89. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  90. package/dist/pxyzBidAdapter.js +1 -1
  91. package/dist/quantcastBidAdapter.js +1 -1
  92. package/dist/readpeakBidAdapter.js +1 -1
  93. package/dist/relaidoBidAdapter.js +1 -1
  94. package/dist/retailspotBidAdapter.js +1 -1
  95. package/dist/rhythmoneBidAdapter.js +1 -1
  96. package/dist/riseBidAdapter.js +1 -1
  97. package/dist/rubiconBidAdapter.js +1 -1
  98. package/dist/seedingAllianceBidAdapter.js +1 -1
  99. package/dist/seedtagBidAdapter.js +1 -1
  100. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  101. package/dist/sharethroughBidAdapter.js +1 -1
  102. package/dist/shinezBidAdapter.js +1 -1
  103. package/dist/smaatoBidAdapter.js +1 -1
  104. package/dist/smartadserverBidAdapter.js +1 -1
  105. package/dist/smartxBidAdapter.js +1 -1
  106. package/dist/smartyadsBidAdapter.js +1 -1
  107. package/dist/smilewantedBidAdapter.js +1 -1
  108. package/dist/sonobiBidAdapter.js +1 -1
  109. package/dist/sovrnAnalyticsAdapter.js +1 -1
  110. package/dist/sovrnBidAdapter.js +1 -1
  111. package/dist/sspBCBidAdapter.js +1 -1
  112. package/dist/stvBidAdapter.js +1 -1
  113. package/dist/sublimeBidAdapter.js +1 -1
  114. package/dist/targetVideoBidAdapter.js +1 -1
  115. package/dist/teadsBidAdapter.js +1 -1
  116. package/dist/trafficgateBidAdapter.js +1 -1
  117. package/dist/trionBidAdapter.js +1 -1
  118. package/dist/tripleliftBidAdapter.js +1 -1
  119. package/dist/ttdBidAdapter.js +1 -1
  120. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  121. package/dist/uid2IdSystem.js +1 -1
  122. package/dist/underdogmediaBidAdapter.js +1 -1
  123. package/dist/undertoneBidAdapter.js +1 -1
  124. package/dist/vidazooBidAdapter.js +1 -1
  125. package/dist/videobyteBidAdapter.js +1 -1
  126. package/dist/visxBidAdapter.js +1 -1
  127. package/dist/vuukleBidAdapter.js +1 -1
  128. package/dist/widespaceBidAdapter.js +1 -1
  129. package/dist/winrBidAdapter.js +1 -1
  130. package/dist/yahoosspBidAdapter.js +1 -1
  131. package/dist/yieldmoBidAdapter.js +1 -1
  132. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  133. package/modules/adagioBidAdapter.js +2 -1
  134. package/modules/adtelligentBidAdapter.js +8 -0
  135. package/modules/beopBidAdapter.js +6 -6
  136. package/modules/beopBidAdapter.md +35 -1
  137. package/modules/cadentApertureMXBidAdapter.md +2 -2
  138. package/modules/discoveryBidAdapter.js +1 -1
  139. package/modules/holidBidAdapter.js +49 -30
  140. package/modules/ixBidAdapter.js +2 -1
  141. package/modules/livewrappedAnalyticsAdapter.js +33 -33
  142. package/modules/mediagoBidAdapter.js +1 -0
  143. package/modules/smartyadsBidAdapter.js +6 -3
  144. package/modules/sovrnBidAdapter.js +5 -0
  145. package/modules/trafficgateBidAdapter.js +126 -72
  146. package/modules/vidazooBidAdapter.js +68 -16
  147. package/package.json +1 -1
  148. package/test/spec/modules/adagioBidAdapter_spec.js +2 -1
  149. package/test/spec/modules/adtelligentBidAdapter_spec.js +8 -0
  150. package/test/spec/modules/beopBidAdapter_spec.js +18 -2
  151. package/test/spec/modules/cadentApertureMXBidAdapter_spec.js +1 -1
  152. package/test/spec/modules/holidBidAdapter_spec.js +26 -6
  153. package/test/spec/modules/ixBidAdapter_spec.js +12 -6
  154. package/test/spec/modules/smartyadsBidAdapter_spec.js +1 -1
  155. package/test/spec/modules/sovrnBidAdapter_spec.js +34 -0
  156. package/test/spec/modules/trafficgateBidAdapter_spec.js +1349 -199
  157. package/test/spec/modules/vidazooBidAdapter_spec.js +131 -0
@@ -1,4 +1,4 @@
1
- import {_each, deepAccess, parseSizesInput, parseUrl, uniques, isFn} from '../src/utils.js';
1
+ import {_each, chunk, deepAccess, isFn, parseSizesInput, parseUrl, uniques, isArray} from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
4
4
  import {getStorageManager} from '../src/storageManager.js';
@@ -48,7 +48,7 @@ function isBidRequestValid(bid) {
48
48
  return !!(extractCID(params) && extractPID(params));
49
49
  }
50
50
 
51
- function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
51
+ function buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
52
52
  const {
53
53
  params,
54
54
  bidId,
@@ -69,9 +69,7 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
69
69
  const dealId = getNextDealId(hashUrl);
70
70
  const uniqueDealId = getUniqueDealId(hashUrl);
71
71
  const sId = getVidazooSessionId();
72
- const cId = extractCID(params);
73
72
  const pId = extractPID(params);
74
- const subDomain = extractSubDomain(params);
75
73
  const ptrace = getCacheOpt();
76
74
  const isStorageAllowed = bidderSettings.get(BIDDER_CODE, 'storageAllowed');
77
75
 
@@ -153,17 +151,46 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
153
151
  data.gppSid = bidderRequest.ortb2.regs.gpp_sid;
154
152
  }
155
153
 
154
+ _each(ext, (value, key) => {
155
+ data['ext.' + key] = value;
156
+ });
157
+
158
+ return data;
159
+ }
160
+
161
+ function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
162
+ const {params} = bid;
163
+ const cId = extractCID(params);
164
+ const subDomain = extractSubDomain(params);
165
+ const data = buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout);
156
166
  const dto = {
157
167
  method: 'POST',
158
168
  url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
159
169
  data: data
160
170
  };
171
+ return dto;
172
+ }
161
173
 
162
- _each(ext, (value, key) => {
163
- dto.data['ext.' + key] = value;
174
+ function buildSingleRequest(bidRequests, bidderRequest, topWindowUrl, bidderTimeout) {
175
+ const {params} = bidRequests[0];
176
+ const cId = extractCID(params);
177
+ const subDomain = extractSubDomain(params);
178
+ const data = bidRequests.map(bid => {
179
+ const sizes = parseSizesInput(bid.sizes);
180
+ return buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout)
181
+ });
182
+ const CHUNK_SIZE = Math.min(10, config.getConfig('vidazoo.chunkSize') || 10);
183
+
184
+ const chunkedData = chunk(data, CHUNK_SIZE);
185
+ return chunkedData.map(chunk => {
186
+ return {
187
+ method: 'POST',
188
+ url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
189
+ data: {
190
+ bids: chunk
191
+ }
192
+ };
164
193
  });
165
-
166
- return dto;
167
194
  }
168
195
 
169
196
  function appendUserIdsToRequestPayload(payloadRef, userIds) {
@@ -193,12 +220,33 @@ function buildRequests(validBidRequests, bidderRequest) {
193
220
  // TODO: does the fallback make sense here?
194
221
  const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
195
222
  const bidderTimeout = config.getConfig('bidderTimeout');
223
+
224
+ const singleRequestMode = config.getConfig('vidazoo.singleRequest');
225
+
196
226
  const requests = [];
197
- validBidRequests.forEach(validBidRequest => {
198
- const sizes = parseSizesInput(validBidRequest.sizes);
199
- const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
200
- requests.push(request);
201
- });
227
+
228
+ if (singleRequestMode) {
229
+ // We need to split the requests into banner and video requests
230
+ const bannerBidRequests = validBidRequests.filter(bid => isArray(bid.mediaTypes) ? bid.mediaTypes.includes(BANNER) : bid.mediaTypes[BANNER] !== undefined);
231
+ if (bannerBidRequests.length > 0) {
232
+ const singleRequests = buildSingleRequest(bannerBidRequests, bidderRequest, topWindowUrl, bidderTimeout);
233
+ requests.push(...singleRequests);
234
+ }
235
+
236
+ // Video Logic
237
+ const videoBidRequests = validBidRequests.filter(bid => bid.mediaTypes[VIDEO] !== undefined);
238
+ videoBidRequests.forEach(validBidRequest => {
239
+ const sizes = parseSizesInput(validBidRequest.sizes);
240
+ const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
241
+ requests.push(request);
242
+ });
243
+ } else {
244
+ validBidRequests.forEach(validBidRequest => {
245
+ const sizes = parseSizesInput(validBidRequest.sizes);
246
+ const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
247
+ requests.push(request);
248
+ });
249
+ }
202
250
  return requests;
203
251
  }
204
252
 
@@ -206,13 +254,15 @@ function interpretResponse(serverResponse, request) {
206
254
  if (!serverResponse || !serverResponse.body) {
207
255
  return [];
208
256
  }
209
- const {bidId} = request.data;
257
+
258
+ const singleRequestMode = config.getConfig('vidazoo.singleRequest');
259
+ const reqBidId = deepAccess(request, 'data.bidId');
210
260
  const {results} = serverResponse.body;
211
261
 
212
262
  let output = [];
213
263
 
214
264
  try {
215
- results.forEach(result => {
265
+ results.forEach((result, i) => {
216
266
  const {
217
267
  creativeId,
218
268
  ad,
@@ -221,6 +271,7 @@ function interpretResponse(serverResponse, request) {
221
271
  width,
222
272
  height,
223
273
  currency,
274
+ bidId,
224
275
  advertiserDomains,
225
276
  metaData,
226
277
  mediaType = BANNER
@@ -230,7 +281,7 @@ function interpretResponse(serverResponse, request) {
230
281
  }
231
282
 
232
283
  const response = {
233
- requestId: bidId,
284
+ requestId: (singleRequestMode && bidId) ? bidId : reqBidId,
234
285
  cpm: price,
235
286
  width: width,
236
287
  height: height,
@@ -264,6 +315,7 @@ function interpretResponse(serverResponse, request) {
264
315
  }
265
316
  output.push(response);
266
317
  });
318
+
267
319
  return output;
268
320
  } catch (e) {
269
321
  return [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "8.2.0",
3
+ "version": "8.3.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
@@ -269,7 +269,8 @@ describe('Adagio bid adapter', () => {
269
269
  'prebidVersion',
270
270
  'featuresVersion',
271
271
  'data',
272
- 'usIfr'
272
+ 'usIfr',
273
+ 'adgjs',
273
274
  ];
274
275
 
275
276
  it('groups requests by organizationId', function() {
@@ -156,6 +156,10 @@ const displayBidderRequestWithConsents = {
156
156
  gdprApplies: true,
157
157
  consentString: 'test'
158
158
  },
159
+ gppConsent: {
160
+ gppString: 'abc12345234',
161
+ applicableSections: [7, 8]
162
+ },
159
163
  uspConsent: 'iHaveIt'
160
164
  };
161
165
 
@@ -364,6 +368,10 @@ describe('adtelligentBidAdapter', () => {
364
368
  expect(bidRequestWithPubSettingsData.GDPR).to.be.equal(1);
365
369
  expect(bidRequestWithPubSettingsData.GDPRConsent).to.be.equal(displayBidderRequestWithConsents.gdprConsent.consentString);
366
370
  });
371
+ it('sets GPP flags', () => {
372
+ expect(bidRequestWithPubSettingsData.GPP).to.be.equal(displayBidderRequestWithConsents.gppConsent.gppString);
373
+ expect(bidRequestWithPubSettingsData.GPPSid).to.be.equal('7,8');
374
+ });
367
375
  it('sets USP', () => {
368
376
  expect(bidRequestWithPubSettingsData.USP).to.be.equal(displayBidderRequestWithConsents.uspConsent);
369
377
  })
@@ -130,15 +130,15 @@ describe('BeOp Bid Adapter tests', () => {
130
130
  expect(payload.url).to.exist;
131
131
  // check that the protocol is added correctly
132
132
  expect(payload.url).to.equal('http://test.te');
133
- expect(payload.psegs).to.not.exist;
134
133
  });
135
134
 
136
- it('should call the endpoint with psegs data if any', function () {
135
+ it('should call the endpoint with psegs and bpsegs (stringified) data if any or [] if none', function () {
137
136
  let bidderRequest =
138
137
  {
139
138
  'ortb2': {
140
139
  'user': {
141
140
  'ext': {
141
+ 'bpsegs': ['axed', 'axec', 1234],
142
142
  'data': {
143
143
  'permutive': [1234, 5678, 910]
144
144
  }
@@ -154,6 +154,22 @@ describe('BeOp Bid Adapter tests', () => {
154
154
  expect(payload.psegs).to.include(5678);
155
155
  expect(payload.psegs).to.include(910);
156
156
  expect(payload.psegs).to.not.include(1);
157
+ expect(payload.bpsegs).to.exist;
158
+ expect(payload.bpsegs).to.include('axed');
159
+ expect(payload.bpsegs).to.include('axec');
160
+ expect(payload.bpsegs).to.include('1234');
161
+
162
+ let bidderRequest2 =
163
+ {
164
+ 'ortb2': {}
165
+ };
166
+
167
+ const request2 = spec.buildRequests(bidRequests, bidderRequest2);
168
+ const payload2 = JSON.parse(request2.data);
169
+ expect(payload2.psegs).to.exist;
170
+ expect(payload2.psegs).to.be.empty;
171
+ expect(payload2.bpsegs).to.exist;
172
+ expect(payload2.bpsegs).to.be.empty;
157
173
  });
158
174
 
159
175
  it('should not prepend the protocol in page url if already present', function () {
@@ -699,7 +699,7 @@ describe('cadent_aperture_mx Adapter', function () {
699
699
 
700
700
  it('should not throw an error when decoding an improperly encoded adm', function () {
701
701
  const badAdmServerResponse = utils.deepClone(serverResponse);
702
- badAdmServerResponse.seatbid[0].bid[0].adm = '<script\\ src\\=\\\"https\\:\\/\\/nym1\\-ib\\.adnxs\\.com\\/ab\\?an_audit\\=0\\&referrer=https%3A%2F%2Fwww.emxdigital.com%3Ftest%3DhAiE3%VVl%26prebid%3D%25123%25\\&e\\=wqT_3QLPCfBDzwQAAAMA1gAFAQj2iaPtBRCdw\\-qeto72gkEYlNWN2smGoJhTKjYJzGJi83G9KkARzGJi83G9KkAZAAAAgD0KEkAhzGIJGwApESTIMQAAAGBmZu4_MMvWgAc4zApAzApIAlDo\\-YEUWNbsR2AAaIrFCnjOpQWAAQGKAQNVU0SSBQbwQJgB2AWgAVqoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKAjp1ZignYScsIDI4OTEwMSwgMTU3MTM0MTU1OCk7ARwscicsIDQxOTc1MDE2Nh4A9DQBkgLhAiE3VVlCWndpQmpwOEpFT2o1Z1JRWUFDRFc3RWN3QURnQVFBUkl6QXBReTlhQUIxZ0FZTHdFYUFCd0NuZ0FnQUZFaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFGS1I2cF9jYjBxUU1FQlNrZXFmM0c5S2tESkFaR1JfRy1UVnRNXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFJQUNBSWdDcVlMWEJaQUNBWmdDQUtBQ0FLZ0NBTFVDQUFBQUFMMENBQUFBQU9BQ0FPZ0NBUGdDQUlBREFaZ0RBYWdEZ1k2ZkNib0RDVTVaVFRJNk5ESTRNdUFEOHhQNEE0NnV2Z3lJQkFDUUJBQ1lCQUd5QkFvSXFZTFhCUkNPcnI0TXdRUUFBQUFBQUFBQUFNa0VBQUFBBXgMQURSQgkJLEF3Q0ZBMkFRQThRUQ0SYEFBQVBnRUFJZ0Z1aUUumgKJASE2eElrelE2ZQGgMXV4SElBUW9BREU5Q3RlamNMMHFRRG9KVGxsTk1qbzBNamd5UVBNVFMRWAxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYw0MAaXwi2VBQS7YAqwD4AK30UbqAlxodHRwczovL3d3dy5jZWxlYnV6ei5jb20vZy90YXlsb3Itc3dpZnQtZGVidXRzLXJlZC1oYWlyLWluLXN1Z2FybGFuZC12aWRlby8_YmlkZHJfZGVidWc9dHJ1ZfICEwoPQ1VTVE9NX01PREVMX0lEEgDyAhoKFkNVU1RPERY8TEVBRl9OQU1FEgDyAh4KGjYdAPQqAUFTVF9NT0RJRklFRBIAgAMAiAMBkAMAmAMUoAMBqgMAwAOsAsgDANgDlCHgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACiBA8xNDQuMTIxLjIzMy4yMzeoBIkWsgQMCAAQABgAIAAwADgAuAQAwAQAyASxgoIB0gQOMTM1NiNOWU0yOjQyODLaBAIIAeAEAPAE6PmBFPoEEgkAAAAAZqdHQBEAAAAgWpRewIgFAZgFAKAF____________AaoFFjQ5MTgxNTcxMzQxNTU2NTI2OTQ5ZTHABQDJBQAAAAAAAPA_0gUJCQAAAAAAAAAA2AUB4AUB8AXW7gr6BQQIABAAkAYAmAYAuAYAwQYAAAAAAADwP8gGANAGwgTaBhYKEAAAAAAAAAAAAAAABQpQEAAYAOAGAfIGAggAgAcBiAcAoAcB\\&s\\=630dbbd55f593c7bfd9e7bccc4dbaa28203daaed\\&pp\\=\\$\\{EMX_MACRO\\}\\\"\\>\\<\\/script\\>';
702
+ badAdmServerResponse.seatbid[0].bid[0].adm = '<script\\ src\\=\\\"https\\:\\/\\/nym1\\-ib\\.adnxs\\.com\\/ab\\?an_audit\\=0\\&referrer=https%3A%2F%2Fwww.cadent.tv%3Ftest%3DhAiE3%VVl%26prebid%3D%25123%25\\&e\\=wqT_3QLPCfBDzwQAAAMA1gAFAQj2iaPtBRCdw\\-qeto72gkEYlNWN2smGoJhTKjYJzGJi83G9KkARzGJi83G9KkAZAAAAgD0KEkAhzGIJGwApESTIMQAAAGBmZu4_MMvWgAc4zApAzApIAlDo\\-YEUWNbsR2AAaIrFCnjOpQWAAQGKAQNVU0SSBQbwQJgB2AWgAVqoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKAjp1ZignYScsIDI4OTEwMSwgMTU3MTM0MTU1OCk7ARwscicsIDQxOTc1MDE2Nh4A9DQBkgLhAiE3VVlCWndpQmpwOEpFT2o1Z1JRWUFDRFc3RWN3QURnQVFBUkl6QXBReTlhQUIxZ0FZTHdFYUFCd0NuZ0FnQUZFaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFGS1I2cF9jYjBxUU1FQlNrZXFmM0c5S2tESkFaR1JfRy1UVnRNXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFJQUNBSWdDcVlMWEJaQUNBWmdDQUtBQ0FLZ0NBTFVDQUFBQUFMMENBQUFBQU9BQ0FPZ0NBUGdDQUlBREFaZ0RBYWdEZ1k2ZkNib0RDVTVaVFRJNk5ESTRNdUFEOHhQNEE0NnV2Z3lJQkFDUUJBQ1lCQUd5QkFvSXFZTFhCUkNPcnI0TXdRUUFBQUFBQUFBQUFNa0VBQUFBBXgMQURSQgkJLEF3Q0ZBMkFRQThRUQ0SYEFBQVBnRUFJZ0Z1aUUumgKJASE2eElrelE2ZQGgMXV4SElBUW9BREU5Q3RlamNMMHFRRG9KVGxsTk1qbzBNamd5UVBNVFMRWAxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYw0MAaXwi2VBQS7YAqwD4AK30UbqAlxodHRwczovL3d3dy5jZWxlYnV6ei5jb20vZy90YXlsb3Itc3dpZnQtZGVidXRzLXJlZC1oYWlyLWluLXN1Z2FybGFuZC12aWRlby8_YmlkZHJfZGVidWc9dHJ1ZfICEwoPQ1VTVE9NX01PREVMX0lEEgDyAhoKFkNVU1RPERY8TEVBRl9OQU1FEgDyAh4KGjYdAPQqAUFTVF9NT0RJRklFRBIAgAMAiAMBkAMAmAMUoAMBqgMAwAOsAsgDANgDlCHgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACiBA8xNDQuMTIxLjIzMy4yMzeoBIkWsgQMCAAQABgAIAAwADgAuAQAwAQAyASxgoIB0gQOMTM1NiNOWU0yOjQyODLaBAIIAeAEAPAE6PmBFPoEEgkAAAAAZqdHQBEAAAAgWpRewIgFAZgFAKAF____________AaoFFjQ5MTgxNTcxMzQxNTU2NTI2OTQ5ZTHABQDJBQAAAAAAAPA_0gUJCQAAAAAAAAAA2AUB4AUB8AXW7gr6BQQIABAAkAYAmAYAuAYAwQYAAAAAAADwP8gGANAGwgTaBhYKEAAAAAAAAAAAAAAABQpQEAAYAOAGAfIGAggAgAcBiAcAoAcB\\&s\\=630dbbd55f593c7bfd9e7bccc4dbaa28203daaed\\&pp\\=\\$\\{EMX_MACRO\\}\\\"\\>\\<\\/script\\>';
703
703
  badAdmServerResponse.seatbid[1].bid[0].adm = '%3F%%3Dcadent%3C3prebid';
704
704
 
705
705
  assert.doesNotThrow(() => spec.interpretResponse({
@@ -2,11 +2,14 @@ import { expect } from 'chai'
2
2
  import { spec } from 'modules/holidBidAdapter.js'
3
3
 
4
4
  describe('holidBidAdapterTests', () => {
5
+ const bidderRequest = {
6
+ bidderRequestId: 'test-id'
7
+ }
8
+
5
9
  const bidRequestData = {
6
10
  bidder: 'holid',
7
11
  adUnitCode: 'test-div',
8
12
  bidId: 'bid-id',
9
- auctionId: 'test-id',
10
13
  params: { adUnitID: '12345' },
11
14
  mediaTypes: { banner: {} },
12
15
  sizes: [[300, 250]],
@@ -48,18 +51,26 @@ describe('holidBidAdapterTests', () => {
48
51
 
49
52
  describe('buildRequests', () => {
50
53
  const bid = JSON.parse(JSON.stringify(bidRequestData))
51
- const request = spec.buildRequests([bid], bid)
54
+ const request = spec.buildRequests([bid], bidderRequest)
52
55
  const payload = JSON.parse(request[0].data)
53
56
 
57
+ it('should include id in request', () => {
58
+ expect(payload.id).to.equal('test-id')
59
+ })
60
+
54
61
  it('should include ext in imp', () => {
55
- expect(payload.imp[0].ext).to.exist
56
62
  expect(payload.imp[0].ext).to.deep.equal({
57
63
  prebid: { storedrequest: { id: '12345' } },
58
64
  })
59
65
  })
60
66
 
67
+ it('should include ext in request', () => {
68
+ expect(payload.ext).to.deep.equal({
69
+ prebid: { storedrequest: { id: '12345' } },
70
+ })
71
+ })
72
+
61
73
  it('should include banner format in imp', () => {
62
- expect(payload.imp[0].banner).to.exist
63
74
  expect(payload.imp[0].banner).to.deep.equal({
64
75
  format: [{ w: 300, h: 250 }],
65
76
  })
@@ -146,6 +157,10 @@ describe('holidBidAdapterTests', () => {
146
157
  }
147
158
  const uspConsent = 'mkjvbiniwot4827obfoy8sdg8203gb'
148
159
  const expectedUserSyncs = [
160
+ {
161
+ type: 'image',
162
+ url: 'https://track.adform.net/Serving/TrackPoint/?pm=2992097&lid=132720821',
163
+ },
149
164
  {
150
165
  type: 'iframe',
151
166
  url: 'https://null.holid.io/sync.html?bidders=%5B%22test%20seat%201%22%2C%22test%20seat%202%22%5D&gdpr=1&gdpr_consent=dkj49Sjmfjuj34as:12jaf90123hufabidfy9u23brfpoig&usp_consent=mkjvbiniwot4827obfoy8sdg8203gb&type=iframe',
@@ -162,7 +177,7 @@ describe('holidBidAdapterTests', () => {
162
177
  expect(userSyncs).to.deep.equal(expectedUserSyncs)
163
178
  })
164
179
 
165
- it('should return empty user syncs when responsetimemillis is not defined', () => {
180
+ it('should return base user syncs when responsetimemillis is not defined', () => {
166
181
  const optionsType = {
167
182
  iframeEnabled: true,
168
183
  pixelEnabled: true,
@@ -179,7 +194,12 @@ describe('holidBidAdapterTests', () => {
179
194
  consentString: 'dkj49Sjmfjuj34as:12jaf90123hufabidfy9u23brfpoig',
180
195
  }
181
196
  const uspConsent = 'mkjvbiniwot4827obfoy8sdg8203gb'
182
- const expectedUserSyncs = []
197
+ const expectedUserSyncs = [
198
+ {
199
+ type: 'image',
200
+ url: 'https://track.adform.net/Serving/TrackPoint/?pm=2992097&lid=132720821',
201
+ }
202
+ ]
183
203
 
184
204
  const userSyncs = spec.getUserSyncs(
185
205
  optionsType,
@@ -759,7 +759,8 @@ describe('IndexexchangeAdapter', function () {
759
759
  uid2: { id: 'testuid2' }, // UID 2.0
760
760
  // similar to uid2, but id5's getValue takes .uid
761
761
  id5id: { uid: 'testid5id' }, // ID5
762
- imuid: 'testimuid'
762
+ imuid: 'testimuid',
763
+ '33acrossId': { envelope: 'v1.5fs.1000.fjdiosmclds' }
763
764
  };
764
765
 
765
766
  const DEFAULT_USERIDASEIDS_DATA = createEidsArray(DEFAULT_USERID_DATA);
@@ -813,7 +814,12 @@ describe('IndexexchangeAdapter', function () {
813
814
  }, {
814
815
  source: 'intimatemerger.com',
815
816
  uids: [{
816
- id: DEFAULT_USERID_DATA.imuid,
817
+ id: DEFAULT_USERID_DATA.imuid
818
+ }]
819
+ }, {
820
+ source: '33across.com',
821
+ uids: [{
822
+ id: DEFAULT_USERID_DATA['33acrossId'].envelope
817
823
  }]
818
824
  }
819
825
  ];
@@ -1219,7 +1225,7 @@ describe('IndexexchangeAdapter', function () {
1219
1225
  const payload = extractPayload(request[0]);
1220
1226
  expect(request).to.be.an('array');
1221
1227
  expect(request).to.have.lengthOf.above(0); // should be 1 or more
1222
- expect(payload.user.eids).to.have.lengthOf(7);
1228
+ expect(payload.user.eids).to.have.lengthOf(8);
1223
1229
  expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
1224
1230
  });
1225
1231
  });
@@ -1407,7 +1413,7 @@ describe('IndexexchangeAdapter', function () {
1407
1413
  cloneValidBid[0].userIdAsEids = utils.deepClone(DEFAULT_USERIDASEIDS_DATA);
1408
1414
  const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
1409
1415
  const payload = extractPayload(request);
1410
- expect(payload.user.eids).to.have.lengthOf(7);
1416
+ expect(payload.user.eids).to.have.lengthOf(8);
1411
1417
  expect(payload.user.eids).to.have.deep.members(DEFAULT_USERID_PAYLOAD);
1412
1418
  });
1413
1419
 
@@ -1540,7 +1546,7 @@ describe('IndexexchangeAdapter', function () {
1540
1546
  })
1541
1547
 
1542
1548
  expect(payload.user).to.exist;
1543
- expect(payload.user.eids).to.have.lengthOf(9);
1549
+ expect(payload.user.eids).to.have.lengthOf(10);
1544
1550
 
1545
1551
  expect(payload.user.eids).to.have.deep.members(validUserIdPayload);
1546
1552
  });
@@ -1582,7 +1588,7 @@ describe('IndexexchangeAdapter', function () {
1582
1588
  });
1583
1589
 
1584
1590
  const payload = extractPayload(request);
1585
- expect(payload.user.eids).to.have.lengthOf(8);
1591
+ expect(payload.user.eids).to.have.lengthOf(9);
1586
1592
  expect(payload.user.eids).to.have.deep.members(validUserIdPayload);
1587
1593
  });
1588
1594
  });
@@ -243,7 +243,7 @@ describe('SmartyadsAdapter', function () {
243
243
  });
244
244
  });
245
245
  describe('getUserSyncs', function () {
246
- const syncUrl = 'https://as.ck-ie.com/prebidjs?p=7c47322e527cf8bdeb7facc1bb03387a&gdpr=0&gdpr_consent=&type=iframe&us_privacy=';
246
+ const syncUrl = 'https://as.ck-ie.com/prebidjs?p=7c47322e527cf8bdeb7facc1bb03387a&gdpr=0&gdpr_consent=&type=iframe&us_privacy=&gpp=';
247
247
  const syncOptions = {
248
248
  iframeEnabled: true
249
249
  };
@@ -183,6 +183,40 @@ describe('sovrnBidAdapter', function() {
183
183
  expect(payload.tmax).to.equal(3000)
184
184
  })
185
185
 
186
+ it('forwards auction level tid', function() {
187
+ const bidderRequest = {
188
+ ...baseBidderRequest,
189
+ ortb2: {
190
+ source: {
191
+ tid: '1d1a030790a475'
192
+ }
193
+ },
194
+ bids: [baseBidRequest]
195
+ }
196
+
197
+ const payload = JSON.parse(spec.buildRequests([baseBidRequest], bidderRequest).data)
198
+ expect(payload.source?.tid).to.equal('1d1a030790a475')
199
+ })
200
+
201
+ it('forwards impression level tid', function() {
202
+ const bidRequest = {
203
+ ...baseBidRequest,
204
+ ortb2Imp: {
205
+ ext: {
206
+ tid: '1a2c032473f4983'
207
+ }
208
+ },
209
+ }
210
+
211
+ const bidderRequest = {
212
+ ...baseBidderRequest,
213
+ bids: [bidRequest]
214
+ }
215
+
216
+ const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequest).data)
217
+ expect(payload.imp[0]?.ext?.tid).to.equal('1a2c032473f4983')
218
+ })
219
+
186
220
  it('includes the ad unit code in the request', function() {
187
221
  const impression = payload.imp[0]
188
222
  expect(impression.adunitcode).to.equal('adunit-code')