prebid.js 7.45.0 → 7.47.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 (204) 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/admaticBidAdapter.js +1 -1
  7. package/dist/adnuntiusBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.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/bidglassBidAdapter.js +1 -1
  20. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  21. package/dist/big-richmediaBidAdapter.js +1 -1
  22. package/dist/bridgewellBidAdapter.js +1 -1
  23. package/dist/brightMountainMediaBidAdapter.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/chtnwBidAdapter.js +1 -1
  26. package/dist/concertBidAdapter.js +1 -1
  27. package/dist/connectadBidAdapter.js +1 -1
  28. package/dist/consumableBidAdapter.js +1 -1
  29. package/dist/conversantAnalyticsAdapter.js +1 -1
  30. package/dist/conversantBidAdapter.js +1 -1
  31. package/dist/craftBidAdapter.js +1 -1
  32. package/dist/criteoBidAdapter.js +1 -1
  33. package/dist/criteoIdSystem.js +1 -1
  34. package/dist/cwireBidAdapter.js +1 -1
  35. package/dist/debugging-standalone.js +1 -1
  36. package/dist/dependencies.json +3 -0
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/emtvBidAdapter.js +1 -0
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/eskimiBidAdapter.js +1 -0
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freewheel-sspBidAdapter.js +1 -1
  44. package/dist/glimpseBidAdapter.js +1 -1
  45. package/dist/gmosspBidAdapter.js +1 -1
  46. package/dist/goldbachBidAdapter.js +1 -1
  47. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  48. package/dist/gridBidAdapter.js +1 -1
  49. package/dist/gumgumBidAdapter.js +1 -1
  50. package/dist/h12mediaBidAdapter.js +1 -1
  51. package/dist/id5IdSystem.js +1 -1
  52. package/dist/improvedigitalBidAdapter.js +1 -1
  53. package/dist/inmarBidAdapter.js +1 -1
  54. package/dist/insticatorBidAdapter.js +1 -1
  55. package/dist/ixBidAdapter.js +1 -1
  56. package/dist/justpremiumBidAdapter.js +1 -1
  57. package/dist/kargoBidAdapter.js +1 -1
  58. package/dist/konduitAnalyticsAdapter.js +1 -1
  59. package/dist/kueezBidAdapter.js +1 -1
  60. package/dist/kueezRtbBidAdapter.js +1 -1
  61. package/dist/kulturemediaBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  65. package/dist/logicadBidAdapter.js +1 -1
  66. package/dist/loglyliftBidAdapter.js +1 -1
  67. package/dist/magniteAnalyticsAdapter.js +1 -1
  68. package/dist/malltvAnalyticsAdapter.js +1 -1
  69. package/dist/marsmediaBidAdapter.js +1 -1
  70. package/dist/mediafuseBidAdapter.js +1 -1
  71. package/dist/mediasquareBidAdapter.js +1 -1
  72. package/dist/mgidBidAdapter.js +1 -1
  73. package/dist/minutemediaBidAdapter.js +1 -1
  74. package/dist/minutemediaplusBidAdapter.js +1 -1
  75. package/dist/missenaBidAdapter.js +1 -1
  76. package/dist/nativoBidAdapter.js +1 -1
  77. package/dist/neuwoRtdProvider.js +1 -1
  78. package/dist/nextMillenniumBidAdapter.js +1 -1
  79. package/dist/nexx360BidAdapter.js +1 -1
  80. package/dist/not-for-prod/prebid.js +137 -135
  81. package/dist/oguryBidAdapter.js +1 -1
  82. package/dist/onetagBidAdapter.js +1 -1
  83. package/dist/ooloAnalyticsAdapter.js +1 -1
  84. package/dist/optidigitalBidAdapter.js +1 -1
  85. package/dist/ortbConverter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/pairIdSystem.js +1 -0
  88. package/dist/parrableIdSystem.js +1 -1
  89. package/dist/pixfutureBidAdapter.js +1 -1
  90. package/dist/prebid-core.js +1 -1
  91. package/dist/publinkIdSystem.js +1 -1
  92. package/dist/pubmaticBidAdapter.js +1 -1
  93. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.js +1 -1
  98. package/dist/rhythmoneBidAdapter.js +1 -1
  99. package/dist/riseBidAdapter.js +1 -1
  100. package/dist/rtbhouseBidAdapter.js +1 -1
  101. package/dist/rubiconAnalyticsAdapter.js +1 -1
  102. package/dist/rubiconBidAdapter.js +1 -1
  103. package/dist/seedingAllianceBidAdapter.js +1 -1
  104. package/dist/seedtagBidAdapter.js +1 -1
  105. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  106. package/dist/sharethroughBidAdapter.js +1 -1
  107. package/dist/shinezBidAdapter.js +1 -1
  108. package/dist/smaatoBidAdapter.js +1 -1
  109. package/dist/smartadserverBidAdapter.js +1 -1
  110. package/dist/smartxBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/sspBCBidAdapter.js +1 -1
  116. package/dist/stvBidAdapter.js +1 -1
  117. package/dist/sublimeBidAdapter.js +1 -1
  118. package/dist/synacormediaBidAdapter.js +1 -1
  119. package/dist/targetVideoBidAdapter.js +1 -1
  120. package/dist/teadsBidAdapter.js +1 -1
  121. package/dist/trionBidAdapter.js +1 -1
  122. package/dist/tripleliftBidAdapter.js +1 -1
  123. package/dist/ttdBidAdapter.js +1 -1
  124. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  125. package/dist/uid2IdSystem.js +1 -1
  126. package/dist/underdogmediaBidAdapter.js +1 -1
  127. package/dist/undertoneBidAdapter.js +1 -1
  128. package/dist/userId.js +1 -1
  129. package/dist/vidazooBidAdapter.js +1 -1
  130. package/dist/videobyteBidAdapter.js +1 -1
  131. package/dist/vidoomyBidAdapter.js +1 -1
  132. package/dist/visxBidAdapter.js +1 -1
  133. package/dist/vuukleBidAdapter.js +1 -1
  134. package/dist/widespaceBidAdapter.js +1 -1
  135. package/dist/winrBidAdapter.js +1 -1
  136. package/dist/yahoosspBidAdapter.js +1 -1
  137. package/dist/yieldmoBidAdapter.js +1 -1
  138. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  139. package/integrationExamples/gpt/fledge_example.html +103 -0
  140. package/integrationExamples/gpt/prebidServer_fledge_example.html +111 -0
  141. package/libraries/ortbConverter/processors/video.js +1 -0
  142. package/modules/admaticBidAdapter.js +7 -2
  143. package/modules/adnuntiusBidAdapter.js +3 -1
  144. package/modules/appnexusBidAdapter.js +108 -102
  145. package/modules/bidwatchAnalyticsAdapter.js +2 -0
  146. package/modules/conversantBidAdapter.js +3 -0
  147. package/modules/criteoBidAdapter.js +5 -1
  148. package/modules/criteoIdSystem.js +27 -14
  149. package/modules/emtvBidAdapter.js +211 -0
  150. package/modules/emtvBidAdapter.md +79 -0
  151. package/modules/eskimiBidAdapter.js +72 -0
  152. package/modules/eskimiBidAdapter.md +34 -0
  153. package/modules/gridBidAdapter.js +42 -19
  154. package/modules/ixBidAdapter.js +30 -0
  155. package/modules/kargoBidAdapter.js +473 -246
  156. package/modules/kueezRtbBidAdapter.js +16 -4
  157. package/modules/mediasquareBidAdapter.js +2 -1
  158. package/modules/minutemediaplusBidAdapter.js +16 -4
  159. package/modules/missenaBidAdapter.js +1 -1
  160. package/modules/nativoBidAdapter.js +110 -21
  161. package/modules/neuwoRtdProvider.js +0 -2
  162. package/modules/nextMillenniumBidAdapter.js +2 -0
  163. package/modules/pairIdSystem.js +79 -0
  164. package/modules/pubmaticBidAdapter.js +12 -9
  165. package/modules/rtbhouseBidAdapter.js +3 -3
  166. package/modules/userId/eids.js +6 -0
  167. package/modules/vidoomyBidAdapter.js +30 -9
  168. package/modules/vidoomyBidAdapter.md +12 -2
  169. package/modules/yieldmoBidAdapter.js +15 -5
  170. package/package.json +1 -1
  171. package/src/config.js +78 -127
  172. package/test/spec/modules/1plusXRtdProvider_spec.js +8 -7
  173. package/test/spec/modules/adagioBidAdapter_spec.js +0 -25
  174. package/test/spec/modules/admaticBidAdapter_spec.js +1 -1
  175. package/test/spec/modules/adnuntiusBidAdapter_spec.js +2 -1
  176. package/test/spec/modules/appnexusBidAdapter_spec.js +464 -448
  177. package/test/spec/modules/axonixBidAdapter_spec.js +0 -27
  178. package/test/spec/modules/big-richmediaBidAdapter_spec.js +68 -64
  179. package/test/spec/modules/conversantBidAdapter_spec.js +1 -0
  180. package/test/spec/modules/criteoBidAdapter_spec.js +33 -1
  181. package/test/spec/modules/criteoIdSystem_spec.js +99 -9
  182. package/test/spec/modules/emtvBidAdapter_spec.js +400 -0
  183. package/test/spec/modules/eskimiBidAdapter_spec.js +155 -0
  184. package/test/spec/modules/gridBidAdapter_spec.js +8 -0
  185. package/test/spec/modules/ixBidAdapter_spec.js +57 -0
  186. package/test/spec/modules/kargoBidAdapter_spec.js +297 -140
  187. package/test/spec/modules/kueezRtbBidAdapter_spec.js +22 -2
  188. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +22 -2
  189. package/test/spec/modules/nativoBidAdapter_spec.js +101 -0
  190. package/test/spec/modules/neuwoRtdProvider_spec.js +0 -1
  191. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
  192. package/test/spec/modules/pairIdSystem_spec.js +68 -0
  193. package/test/spec/modules/pubCommonId_spec.js +0 -17
  194. package/test/spec/modules/pubmaticBidAdapter_spec.js +868 -867
  195. package/test/spec/modules/realvuAnalyticsAdapter_spec.js +0 -5
  196. package/test/spec/modules/rtbhouseBidAdapter_spec.js +2 -2
  197. package/test/spec/modules/vidoomyBidAdapter_spec.js +72 -0
  198. package/test/spec/modules/yieldmoBidAdapter_spec.js +19 -1
  199. package/test/spec/unit/pbjs_api_spec.js +19 -3
  200. package/test/test_index.js +13 -3
  201. package/dist/gridNMBidAdapter.js +0 -1
  202. package/modules/gridNMBidAdapter.js +0 -422
  203. package/modules/gridNMBidAdapter.md +0 -39
  204. package/test/spec/modules/gridNMBidAdapter_spec.js +0 -636
@@ -81,11 +81,6 @@ describe('RealVu', function() {
81
81
  result = realvuAnalyticsAdapter.checkIn(bid, ''); // test invalid partnerId ''
82
82
  });
83
83
 
84
- it.skip('isInView returns "yes"', () => {
85
- let inview = realvuAnalyticsAdapter.isInView('ad1');
86
- expect(inview).to.equal('yes');
87
- });
88
-
89
84
  it('isInView return "NA"', function () {
90
85
  const adUnitCode = '1234';
91
86
  let result = realvuAnalyticsAdapter.isInView(adUnitCode);
@@ -631,10 +631,10 @@ describe('RTBHouseAdapter', () => {
631
631
  expect(bids[0].meta.advertiserDomains).to.deep.equal(['rtbhouse.com']);
632
632
  expect(bids[0].native).to.deep.equal({
633
633
  title: 'Title text',
634
- clickUrl: encodeURIComponent('https://example.com'),
634
+ clickUrl: encodeURI('https://example.com'),
635
635
  impressionTrackers: ['https://example.com/imptracker'],
636
636
  image: {
637
- url: encodeURIComponent('https://example.com/image.jpg'),
637
+ url: encodeURI('https://example.com/image.jpg'),
638
638
  width: 150,
639
639
  height: 50
640
640
  },
@@ -162,6 +162,29 @@ describe('vidoomyBidAdapter', function() {
162
162
  expect(request[0].data.schain).to.eq(serializedForm);
163
163
  });
164
164
 
165
+ it('should return standard json formated eids', function () {
166
+ const eids = [{
167
+ source: 'pubcid.org',
168
+ uids: [
169
+ {
170
+ id: 'some-random-id-value-1',
171
+ atype: 1
172
+ }
173
+ ]
174
+ },
175
+ {
176
+ source: 'adserver.org',
177
+ uids: [{
178
+ id: 'some-random-id-value-2',
179
+ atype: 1
180
+ }]
181
+ }]
182
+ bidRequests[0].userIdAsEids = eids
183
+ const bidRequest = spec.buildRequests(bidRequests, bidderRequest);
184
+ expect(bidRequest[0].data).to.include.any.keys('eids');
185
+ expect(JSON.parse(bidRequest[0].data.eids)).to.eql(eids);
186
+ });
187
+
165
188
  it('should set the bidfloor if getFloor module is undefined but static bidfloor is present', function () {
166
189
  const request = { ...bidRequests[0], params: { bidfloor: 2.5 } }
167
190
  const req = spec.buildRequests([request], bidderRequest)[0];
@@ -196,6 +219,55 @@ describe('vidoomyBidAdapter', function() {
196
219
  expect(bidRequest.data.bidfloor).to.equal(bidfloor);
197
220
  });
198
221
  });
222
+
223
+ describe('badv, bcat, bapp, btype, battr', function () {
224
+ const bidderRequestNew = {
225
+ ...bidderRequest,
226
+ bcat: ['EX1', 'EX2', 'EX3'],
227
+ badv: ['site.com'],
228
+ bapp: ['app.com'],
229
+ btype: [1, 2, 3],
230
+ battr: [1, 2, 3]
231
+ }
232
+ const request = spec.buildRequests(bidRequests, bidderRequestNew);
233
+ it('should have badv, bcat, bapp, btype, battr in request', function () {
234
+ expect(request[0].data).to.include.any.keys('badv');
235
+ expect(request[0].data).to.include.any.keys('bcat');
236
+ expect(request[0].data).to.include.any.keys('bapp');
237
+ expect(request[0].data).to.include.any.keys('btype');
238
+ expect(request[0].data).to.include.any.keys('battr');
239
+ })
240
+
241
+ it('should have equal badv, bcat, bapp, btype, battr in request', function () {
242
+ expect(request[0].badv).to.deep.equal(bidderRequest.refererInfo.badv);
243
+ expect(request[0].bcat).to.deep.equal(bidderRequest.refererInfo.bcat);
244
+ expect(request[0].bapp).to.deep.equal(bidderRequest.refererInfo.bapp);
245
+ expect(request[0].btype).to.deep.equal(bidderRequest.refererInfo.btype);
246
+ expect(request[0].battr).to.deep.equal(bidderRequest.refererInfo.battr);
247
+ })
248
+ })
249
+
250
+ describe('first party data', function () {
251
+ const bidderRequest2 = {
252
+ ...bidderRequest,
253
+ ortb2: {
254
+ bcat: ['EX1', 'EX2', 'EX3'],
255
+ badv: ['site.com'],
256
+ bapp: ['app.com'],
257
+ btype: [1, 2, 3],
258
+ battr: [1, 2, 3]
259
+ }
260
+ }
261
+ const request = spec.buildRequests(bidRequests, bidderRequest2);
262
+
263
+ it('should have badv, bcat, bapp, btype, battr in request and equal to bidderRequest.ortb2', function () {
264
+ expect(request[0].data.bcat).to.deep.equal(bidderRequest2.ortb2.bcat)
265
+ expect(request[0].data.badv).to.deep.equal(bidderRequest2.ortb2.badv)
266
+ expect(request[0].data.bapp).to.deep.equal(bidderRequest2.ortb2.bapp);
267
+ expect(request[0].data.btype).to.deep.equal(bidderRequest2.ortb2.btype);
268
+ expect(request[0].data.battr).to.deep.equal(bidderRequest2.ortb2.battr);
269
+ });
270
+ });
199
271
  });
200
272
 
201
273
  describe('interpretResponse', function () {
@@ -212,7 +212,7 @@ describe('YieldmoAdapter', function () {
212
212
  expect(data.hasOwnProperty('h')).to.be.true;
213
213
  expect(data.hasOwnProperty('w')).to.be.true;
214
214
  expect(data.hasOwnProperty('pubcid')).to.be.true;
215
- expect(data.userConsent).to.equal('{"gdprApplies":"","cmp":""}');
215
+ expect(data.userConsent).to.equal('{"gdprApplies":"","cmp":"","gpp":"","gpp_sid":[]}');
216
216
  expect(data.us_privacy).to.equal('');
217
217
  });
218
218
 
@@ -262,6 +262,24 @@ describe('YieldmoAdapter', function () {
262
262
  JSON.stringify({
263
263
  gdprApplies: true,
264
264
  cmp: 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==',
265
+ gpp: '',
266
+ gpp_sid: [],
267
+ })
268
+ );
269
+ });
270
+
271
+ it('should add gpp information to request if available', () => {
272
+ const gppConsent = {
273
+ 'gppString': 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==',
274
+ 'applicableSections': [8]
275
+ };
276
+ const data = buildAndGetData([mockBannerBid()], 0, mockBidderRequest({gppConsent}));
277
+ expect(data.userConsent).equal(
278
+ JSON.stringify({
279
+ gdprApplies: '',
280
+ cmp: '',
281
+ gpp: 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==',
282
+ gpp_sid: [8],
265
283
  })
266
284
  );
267
285
  });
@@ -888,16 +888,32 @@ describe('Unit: Prebid Module', function () {
888
888
 
889
889
  it('should only apply price granularity if bid media type matches', function () {
890
890
  initTestConfig({
891
- adUnits: [ createAdUnit('div-gpt-ad-1460505748561-0', 'video') ],
891
+ adUnits: [createAdUnit('div-gpt-ad-1460505748561-0')],
892
892
  adUnitCodes: ['div-gpt-ad-1460505748561-0']
893
893
  });
894
894
 
895
- response = videoResponse;
895
+ response = bannerResponse;
896
896
  response.tags[0].ads[0].cpm = 3.4288;
897
897
 
898
898
  auction.callBids(cbTimeout);
899
899
  let bidTargeting = targeting.getAllTargeting();
900
- expect(bidTargeting['div-gpt-ad-1460505748561-0'][CONSTANTS.TARGETING_KEYS.PRICE_BUCKET]).to.equal('3.00');
900
+ expect(bidTargeting['div-gpt-ad-1460505748561-0'][CONSTANTS.TARGETING_KEYS.PRICE_BUCKET]).to.equal('3.25');
901
+
902
+ if (FEATURES.VIDEO) {
903
+ ajaxStub.restore();
904
+
905
+ initTestConfig({
906
+ adUnits: [createAdUnit('div-gpt-ad-1460505748561-0', 'video')],
907
+ adUnitCodes: ['div-gpt-ad-1460505748561-0']
908
+ });
909
+
910
+ response = videoResponse;
911
+ response.tags[0].ads[0].cpm = 3.4288;
912
+
913
+ auction.callBids(cbTimeout);
914
+ let bidTargeting = targeting.getAllTargeting();
915
+ expect(bidTargeting['div-gpt-ad-1460505748561-0'][CONSTANTS.TARGETING_KEYS.PRICE_BUCKET]).to.equal('3.00');
916
+ }
901
917
  });
902
918
  });
903
919
 
@@ -1,4 +1,3 @@
1
-
2
1
  [it, describe].forEach((ob) => {
3
2
  ob.only = function () {
4
3
  [
@@ -7,8 +6,19 @@
7
6
  // eslint-disable-next-line no-console
8
7
  ].forEach(l => console.error(l))
9
8
  throw new Error('do not use .only()')
10
- }
11
- })
9
+ };
10
+ });
11
+
12
+ [it, describe].forEach((ob) => {
13
+ ob.skip = function () {
14
+ [
15
+ 'describe.skip and it.skip are disabled,',
16
+ 'because they pollute the pipeline test output',
17
+ // eslint-disable-next-line no-console
18
+ ].forEach(l => console.error(l))
19
+ throw new Error('do not use .skip()')
20
+ };
21
+ });
12
22
 
13
23
  require('./test_deps.js');
14
24
 
@@ -1 +0,0 @@
1
- (self.pbjsChunk=self.pbjsChunk||[]).push([[11651],{62873:function(e,r,t){var n=t(44925),i=t(71002),a=t(93324),s=t(89062),o=t(78640),d=t(64358),p=t(20265),c=t(14699),u=t(35706),l=t(24679),g=t(3193),m=["mind","maxd","size"],f="https://x.bidswitch.net/sync?ssp=themediagrid",b=!1,v="Bid from response has no adm parameter - ",y="Bid from response has no price parameter - ",h="Bid from response has wrong content_type parameter - ",S="Array of bid objects is empty",x="Seatbid array from response has empty item",I="Response is empty",R="Response has empty seatbid array",j="Seatbid from response has no array of bid objects - ",w={code:"gridNM",supportedMediaTypes:[l.pX],isBidRequestValid:function(e){var r=!(e.params.source&&(0,d.isStr)(e.params.source)&&e.params.secid&&(0,d.isStr)(e.params.secid)&&e.params.pubid&&(0,d.isStr)(e.params.pubid)),t=(0,p.Z)(e,"mediaTypes.video")||{},n=(0,p.Z)(e,"params.video")||{},i=n.protocols,a=void 0===i?t.protocols:i,s=n.mimes,o=void 0===s?t.mimes:s;return r||(r=!a||!o),r||(r=!(0,d.isArray)(o)||!o.length||o.filter((function(e){return!(e&&(0,d.isStr)(e))})).length)||(r=!(0,d.isArray)(a)||!a.length||a.filter((function(e){return!((0,d.isNumber)(e)&&e>0&&!(e%1))})).length),!r},buildRequests:function(e,r){var t=e||[],n=[],o=r||{},c=o.bidderRequestId,u=o.auctionId,l=o.gdprConsent,m=o.uspConsent,f=o.timeout,b=o.refererInfo,v=b?encodeURIComponent(b.page):"";return t.forEach((function(e){var t,o,b=e.schain,y=e.userIdAsEids;c||(c=e.bidderRequestId),u||(u=e.auctionId);var h=e.params,S=h.floorcpm,x=h.source,I=h.secid,R=h.pubid,j=h.content,w=h.video,O=e.mediaTypes,A=e.bidId,N=e.adUnitCode,T=e.rtd,Z=e.ortb2Imp,_=e.sizes,E=function(e,r,t){var n=e.video?"video":"banner";if("function"==typeof r.getFloor){var s=r.getFloor({currency:"USD",mediaType:n,size:r.sizes.map((function(e){var r=(0,a.Z)(e,2);return{w:r[0],h:r[1]}}))});"object"!==(0,i.Z)(s)||"USD"!==s.currency||isNaN(parseFloat(s.floor))||(t=Math.max(t,parseFloat(s.floor)))}return t}(O||{},e,(0,d.isNumber)(S)&&S),C=T&&T.jwplayer&&T.jwplayer.targeting,U=j||C&&C.content,D={id:A.toString(),tagid:I.toString(),video:z((0,d.mergeDeep)({},w,O&&O.video),_),ext:{divid:N.toString()}};Z&&Z.ext&&Z.ext.data&&(D.ext.data=Z.ext.data,D.ext.data.adserver&&D.ext.data.adserver.adslot?D.ext.gpid=D.ext.data.adserver.adslot.toString():D.ext.gpid=Z.ext.data.pbadslot&&Z.ext.data.pbadslot.toString()),E&&(D.bidfloor=E);var q=[D],P={tid:u&&u.toString(),ext:{wrapper:"Prebid_js",wrapper_version:"7.45.0"}};b&&(P.ext.schain=b);var B=f,M=f?Math.min(B,f):B,X={id:c&&c.toString(),site:{page:v,publisher:{id:R}},source:P,tmax:M,imp:q};U&&(X.site.content=U),l&&l.consentString&&(o={consent:l.consentString}),y&&y.length&&((o=o||{}).eids=(0,s.Z)(y)),o&&Object.keys(o).length&&((t=t||{}).ext=o);var k=(0,p.Z)(r,"ortb2.user.data");k&&k.length&&(t||(t={data:[]}),t=(0,d.mergeDeep)(t,{data:(0,s.Z)(k)})),t&&(X.user=t);var F=(0,p.Z)(r,"ortb2.site");if(F){var J=(0,p.Z)(F,"content.data");if(J&&J.length){var V=X.site.content||{};X.site.content=(0,d.mergeDeep)(V,{data:J})}}l&&l.gdprApplies&&(X.regs={ext:{gdpr:l.gdprApplies?1:0}}),m&&(X.regs||(X.regs={ext:{}}),X.regs.ext.us_privacy=m),!0===g.vc.getConfig("coppa")&&(X.regs||(X.regs={}),X.regs.coppa=1),n.push({method:"POST",url:"https://grid.bidswitch.net/hbjson?no_mapping=1&sp="+x,bid:e,data:X})})),n},interpretResponse:function(e,r){var t,n=[];if((e=e&&e.body)?e.seatbid&&!e.seatbid.length&&(t=R):t=I,!t&&e.seatbid){var i=function(e){e?e.bid?e.bid[0]||(0,d.logError)(S):(0,d.logError)(j+JSON.stringify(e)):(0,d.logError)(x);return e&&e.bid&&e.bid[0]}(e.seatbid[0]);if(i&&(i.adm||i.nurl?i.price?"video"!==i.content_type&&(t=h+i.content_type):t=y+JSON.stringify(i):t=v+JSON.stringify(i),!t)){var a=r.bid,s={requestId:a.bidId,cpm:i.price,width:i.w,height:i.h,creativeId:i.auid||a.bidderRequestId,currency:"USD",netRevenue:!0,ttl:360,dealId:i.dealid,mediaType:l.pX,meta:{advertiserDomains:i.adomain?i.adomain:[]}};i.adm?(s.vastXml=i.adm,s.adResponse={content:s.vastXml}):i.nurl&&(s.vastUrl=i.nurl),a.renderer||a.mediaTypes&&a.mediaTypes.video&&"outstream"!==a.mediaTypes.video.context||(s.renderer=function(e,r){var t=u.Th.install({id:r.id,url:r.url,loaded:!1});try{t.setRender(O)}catch(e){(0,d.logWarn)("Prebid Error calling setRender on renderer",e)}return t}(0,{id:a.bidId,url:"https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js"})),n.push(s)}}return t&&(0,d.logError)(t),n},getUserSyncs:function(e,r,t,n){if(!b&&e.pixelEnabled){var i="";return t&&"string"==typeof t.consentString&&("boolean"==typeof t.gdprApplies?i+="&gdpr=".concat(Number(t.gdprApplies),"&gdpr_consent=").concat(t.consentString):i+="&gdpr_consent=".concat(t.consentString)),n&&(i+="&us_privacy=".concat(n)),b=!0,{type:"image",url:f+i}}}};function O(e){e.renderer.push((function(){window.ANOutstreamVideo.renderAd({targetId:e.adUnitCode,adResponse:e.adResponse})}))}function z(e,r){var t=e.mind,i=e.maxd,a=e.size,s=(0,n.Z)(e,m);if(a&&(0,d.isStr)(a)){var o=a.split("x");2===o.length&&parseInt(o[0])&&parseInt(o[1])&&(s.w=parseInt(o[0]),s.h=parseInt(o[1]))}if(!s.w||!s.h){var p=s.playerSize&&2===s.playerSize.length?s.playerSize:r;if(p){var c=p[0];c&&Object.assign(s,(0,d.parseGPTSingleSizeArrayToRtbSize)(c))}}s.playerSize&&delete s.playerSize;var u=s.durationRangeSec||[],l=t||u[0]||s.minduration,g=i||u[1]||s.maxduration;return l&&(s.minduration=l),g&&(s.maxduration=g),s}(0,c.dX)(w),(0,o.z)("gridNMBidAdapter")},44925:function(e,r,t){function n(e,r){if(null==e)return{};var t,n,i=function(e,r){if(null==e)return{};var t,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(i[t]=e[t]);return i}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}t.d(r,{Z:function(){return n}})}},function(e){var r;r=62873,e(e.s=r)}]);
@@ -1,422 +0,0 @@
1
- import {
2
- isStr,
3
- deepAccess,
4
- isArray,
5
- isNumber,
6
- logError,
7
- logWarn,
8
- parseGPTSingleSizeArrayToRtbSize,
9
- mergeDeep
10
- } from '../src/utils.js';
11
- import { registerBidder } from '../src/adapters/bidderFactory.js';
12
- import { Renderer } from '../src/Renderer.js';
13
- import { VIDEO } from '../src/mediaTypes.js';
14
- import { config } from '../src/config.js';
15
-
16
- const BIDDER_CODE = 'gridNM';
17
- const ENDPOINT_URL = 'https://grid.bidswitch.net/hbjson';
18
- const SYNC_URL = 'https://x.bidswitch.net/sync?ssp=themediagrid';
19
- const TIME_TO_LIVE = 360;
20
- const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
21
-
22
- let hasSynced = false;
23
-
24
- const LOG_ERROR_MESS = {
25
- noAdm: 'Bid from response has no adm parameter - ',
26
- noPrice: 'Bid from response has no price parameter - ',
27
- wrongContentType: 'Bid from response has wrong content_type parameter - ',
28
- noBid: 'Array of bid objects is empty',
29
- noPlacementCode: 'Can\'t find in requested bids the bid with auid - ',
30
- emptyUids: 'Uids should be not empty',
31
- emptySeatbid: 'Seatbid array from response has empty item',
32
- emptyResponse: 'Response is empty',
33
- hasEmptySeatbidArray: 'Response has empty seatbid array',
34
- hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - '
35
- };
36
-
37
- export const spec = {
38
- code: BIDDER_CODE,
39
- supportedMediaTypes: [ VIDEO ],
40
- /**
41
- * Determines whether or not the given bid request is valid.
42
- *
43
- * @param {BidRequest} bid The bid params to validate.
44
- * @return boolean True if this is a valid bid, and false otherwise.
45
- */
46
- isBidRequestValid: function(bid) {
47
- let invalid =
48
- !bid.params.source || !isStr(bid.params.source) ||
49
- !bid.params.secid || !isStr(bid.params.secid) ||
50
- !bid.params.pubid || !isStr(bid.params.pubid);
51
-
52
- const video = deepAccess(bid, 'mediaTypes.video') || {};
53
- const { protocols = video.protocols, mimes = video.mimes } = deepAccess(bid, 'params.video') || {};
54
- if (!invalid) {
55
- invalid = !protocols || !mimes;
56
- }
57
- if (!invalid) {
58
- invalid = !isArray(mimes) || !mimes.length || mimes.filter((it) => !(it && isStr(it))).length;
59
- if (!invalid) {
60
- invalid = !isArray(protocols) || !protocols.length || protocols.filter((it) => !(isNumber(it) && it > 0 && !(it % 1))).length;
61
- }
62
- }
63
- return !invalid;
64
- },
65
- /**
66
- * Make a server request from the list of BidRequests.
67
- *
68
- * @param {BidRequest[]} validBidRequests - an array of bids
69
- * @param {bidderRequest} bidderRequest bidder request object
70
- * @return ServerRequest Info describing the request to the server.
71
- */
72
- buildRequests: function(validBidRequests, bidderRequest) {
73
- const bids = validBidRequests || [];
74
- const requests = [];
75
- let { bidderRequestId, auctionId, gdprConsent, uspConsent, timeout, refererInfo } = bidderRequest || {};
76
-
77
- const referer = refererInfo ? encodeURIComponent(refererInfo.page) : '';
78
-
79
- bids.forEach(bid => {
80
- let user;
81
- let userExt;
82
-
83
- const schain = bid.schain;
84
- const userIdAsEids = bid.userIdAsEids;
85
-
86
- if (!bidderRequestId) {
87
- bidderRequestId = bid.bidderRequestId;
88
- }
89
- if (!auctionId) {
90
- auctionId = bid.auctionId;
91
- }
92
- const {
93
- params: { floorcpm, source, secid, pubid, content, video },
94
- mediaTypes, bidId, adUnitCode, rtd, ortb2Imp, sizes
95
- } = bid;
96
-
97
- const bidFloor = _getFloor(mediaTypes || {}, bid, isNumber(floorcpm) && floorcpm);
98
- const jwTargeting = rtd && rtd.jwplayer && rtd.jwplayer.targeting;
99
-
100
- const siteContent = content || (jwTargeting && jwTargeting.content);
101
-
102
- const impObj = {
103
- id: bidId.toString(),
104
- tagid: secid.toString(),
105
- video: createVideoForImp(mergeDeep({}, video, mediaTypes && mediaTypes.video), sizes),
106
- ext: {
107
- divid: adUnitCode.toString()
108
- }
109
- };
110
-
111
- if (ortb2Imp && ortb2Imp.ext && ortb2Imp.ext.data) {
112
- impObj.ext.data = ortb2Imp.ext.data;
113
- if (impObj.ext.data.adserver && impObj.ext.data.adserver.adslot) {
114
- impObj.ext.gpid = impObj.ext.data.adserver.adslot.toString();
115
- } else {
116
- impObj.ext.gpid = ortb2Imp.ext.data.pbadslot && ortb2Imp.ext.data.pbadslot.toString();
117
- }
118
- }
119
-
120
- if (bidFloor) {
121
- impObj.bidfloor = bidFloor;
122
- }
123
-
124
- const imp = [impObj];
125
-
126
- const reqSource = {
127
- tid: auctionId && auctionId.toString(),
128
- ext: {
129
- wrapper: 'Prebid_js',
130
- wrapper_version: '$prebid.version$'
131
- }
132
- };
133
-
134
- if (schain) {
135
- reqSource.ext.schain = schain;
136
- }
137
-
138
- const bidderTimeout = timeout;
139
- const tmax = timeout ? Math.min(bidderTimeout, timeout) : bidderTimeout;
140
-
141
- const request = {
142
- id: bidderRequestId && bidderRequestId.toString(),
143
- site: {
144
- page: referer,
145
- publisher: {
146
- id: pubid,
147
- },
148
- },
149
- source: reqSource,
150
- tmax,
151
- imp,
152
- };
153
-
154
- if (siteContent) {
155
- request.site.content = siteContent;
156
- }
157
-
158
- if (gdprConsent && gdprConsent.consentString) {
159
- userExt = { consent: gdprConsent.consentString };
160
- }
161
-
162
- if (userIdAsEids && userIdAsEids.length) {
163
- userExt = userExt || {};
164
- userExt.eids = [...userIdAsEids];
165
- }
166
-
167
- if (userExt && Object.keys(userExt).length) {
168
- user = user || {};
169
- user.ext = userExt;
170
- }
171
-
172
- const ortb2UserData = deepAccess(bidderRequest, 'ortb2.user.data');
173
- if (ortb2UserData && ortb2UserData.length) {
174
- if (!user) {
175
- user = { data: [] };
176
- }
177
- user = mergeDeep(user, {
178
- data: [...ortb2UserData]
179
- });
180
- }
181
-
182
- if (user) {
183
- request.user = user;
184
- }
185
- const site = deepAccess(bidderRequest, 'ortb2.site');
186
- if (site) {
187
- const data = deepAccess(site, 'content.data');
188
- if (data && data.length) {
189
- const siteContent = request.site.content || {};
190
- request.site.content = mergeDeep(siteContent, { data });
191
- }
192
- }
193
-
194
- if (gdprConsent && gdprConsent.gdprApplies) {
195
- request.regs = {
196
- ext: {
197
- gdpr: gdprConsent.gdprApplies ? 1 : 0
198
- }
199
- };
200
- }
201
-
202
- if (uspConsent) {
203
- if (!request.regs) {
204
- request.regs = { ext: {} };
205
- }
206
- request.regs.ext.us_privacy = uspConsent;
207
- }
208
-
209
- if (config.getConfig('coppa') === true) {
210
- if (!request.regs) {
211
- request.regs = {};
212
- }
213
- request.regs.coppa = 1;
214
- }
215
-
216
- requests.push({
217
- method: 'POST',
218
- url: ENDPOINT_URL + '?no_mapping=1&sp=' + source,
219
- bid: bid,
220
- data: request
221
- });
222
- });
223
-
224
- return requests;
225
- },
226
- /**
227
- * Unpack the response from the server into a list of bids.
228
- *
229
- * @param {*} serverResponse A successful response from the server.
230
- * @param {*} bidRequest
231
- * @return {Bid[]} An array of bids which were nested inside the server.
232
- */
233
- interpretResponse: function(serverResponse, bidRequest) {
234
- serverResponse = serverResponse && serverResponse.body;
235
- const bidResponses = [];
236
-
237
- let errorMessage;
238
-
239
- if (!serverResponse) errorMessage = LOG_ERROR_MESS.emptyResponse;
240
- else if (serverResponse.seatbid && !serverResponse.seatbid.length) {
241
- errorMessage = LOG_ERROR_MESS.hasEmptySeatbidArray;
242
- }
243
-
244
- if (!errorMessage && serverResponse.seatbid) {
245
- const serverBid = _getBidFromResponse(serverResponse.seatbid[0]);
246
- if (serverBid) {
247
- if (!serverBid.adm && !serverBid.nurl) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid);
248
- else if (!serverBid.price) errorMessage = LOG_ERROR_MESS.noPrice + JSON.stringify(serverBid);
249
- else if (serverBid.content_type !== 'video') errorMessage = LOG_ERROR_MESS.wrongContentType + serverBid.content_type;
250
- if (!errorMessage) {
251
- const bid = bidRequest.bid;
252
- const bidResponse = {
253
- requestId: bid.bidId,
254
- cpm: serverBid.price,
255
- width: serverBid.w,
256
- height: serverBid.h,
257
- creativeId: serverBid.auid || bid.bidderRequestId,
258
- currency: 'USD',
259
- netRevenue: true,
260
- ttl: TIME_TO_LIVE,
261
- dealId: serverBid.dealid,
262
- mediaType: VIDEO,
263
- meta: {
264
- advertiserDomains: serverBid.adomain ? serverBid.adomain : []
265
- }
266
- };
267
-
268
- if (serverBid.adm) {
269
- bidResponse.vastXml = serverBid.adm;
270
- bidResponse.adResponse = {
271
- content: bidResponse.vastXml
272
- };
273
- } else if (serverBid.nurl) {
274
- bidResponse.vastUrl = serverBid.nurl;
275
- }
276
-
277
- if (!bid.renderer && (!bid.mediaTypes || !bid.mediaTypes.video || bid.mediaTypes.video.context === 'outstream')) {
278
- bidResponse.renderer = createRenderer(bidResponse, {
279
- id: bid.bidId,
280
- url: RENDERER_URL
281
- });
282
- }
283
- bidResponses.push(bidResponse);
284
- }
285
- }
286
- }
287
- if (errorMessage) logError(errorMessage);
288
- return bidResponses;
289
- },
290
- getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
291
- if (!hasSynced && syncOptions.pixelEnabled) {
292
- let params = '';
293
-
294
- if (gdprConsent && typeof gdprConsent.consentString === 'string') {
295
- if (typeof gdprConsent.gdprApplies === 'boolean') {
296
- params += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
297
- } else {
298
- params += `&gdpr_consent=${gdprConsent.consentString}`;
299
- }
300
- }
301
- if (uspConsent) {
302
- params += `&us_privacy=${uspConsent}`;
303
- }
304
-
305
- hasSynced = true;
306
- return {
307
- type: 'image',
308
- url: SYNC_URL + params
309
- };
310
- }
311
- }
312
- };
313
-
314
- /**
315
- * Gets bidfloor
316
- * @param {Object} mediaTypes
317
- * @param {Object} bid
318
- * @param {Number} floor
319
- * @returns {Number} floor
320
- */
321
- function _getFloor (mediaTypes, bid, floor) {
322
- const curMediaType = mediaTypes.video ? 'video' : 'banner';
323
-
324
- if (typeof bid.getFloor === 'function') {
325
- const floorInfo = bid.getFloor({
326
- currency: 'USD',
327
- mediaType: curMediaType,
328
- size: bid.sizes.map(([w, h]) => ({w, h}))
329
- });
330
-
331
- if (typeof floorInfo === 'object' &&
332
- floorInfo.currency === 'USD' &&
333
- !isNaN(parseFloat(floorInfo.floor))) {
334
- floor = Math.max(floor, parseFloat(floorInfo.floor));
335
- }
336
- }
337
-
338
- return floor;
339
- }
340
-
341
- function _getBidFromResponse(respItem) {
342
- if (!respItem) {
343
- logError(LOG_ERROR_MESS.emptySeatbid);
344
- } else if (!respItem.bid) {
345
- logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
346
- } else if (!respItem.bid[0]) {
347
- logError(LOG_ERROR_MESS.noBid);
348
- }
349
- return respItem && respItem.bid && respItem.bid[0];
350
- }
351
-
352
- function outstreamRender (bid) {
353
- bid.renderer.push(() => {
354
- window.ANOutstreamVideo.renderAd({
355
- targetId: bid.adUnitCode,
356
- adResponse: bid.adResponse
357
- });
358
- });
359
- }
360
-
361
- function createRenderer (bid, rendererParams) {
362
- const renderer = Renderer.install({
363
- id: rendererParams.id,
364
- url: rendererParams.url,
365
- loaded: false
366
- });
367
-
368
- try {
369
- renderer.setRender(outstreamRender);
370
- } catch (err) {
371
- logWarn('Prebid Error calling setRender on renderer', err);
372
- }
373
-
374
- return renderer;
375
- }
376
-
377
- function createVideoForImp({ mind, maxd, size, ...paramsVideo }, bidSizes) {
378
- if (size && isStr(size)) {
379
- const sizeArray = size.split('x');
380
- if (sizeArray.length === 2 && parseInt(sizeArray[0]) && parseInt(sizeArray[1])) {
381
- paramsVideo.w = parseInt(sizeArray[0]);
382
- paramsVideo.h = parseInt(sizeArray[1]);
383
- }
384
- }
385
-
386
- if (!paramsVideo.w || !paramsVideo.h) {
387
- const playerSizes = paramsVideo.playerSize && paramsVideo.playerSize.length === 2 ? paramsVideo.playerSize : bidSizes;
388
- if (playerSizes) {
389
- const playerSize = playerSizes[0];
390
- if (playerSize) {
391
- Object.assign(paramsVideo, parseGPTSingleSizeArrayToRtbSize(playerSize));
392
- }
393
- }
394
- }
395
-
396
- if (paramsVideo.playerSize) {
397
- delete paramsVideo.playerSize;
398
- }
399
-
400
- const durationRangeSec = paramsVideo.durationRangeSec || [];
401
- const minDur = mind || durationRangeSec[0] || paramsVideo.minduration;
402
- const maxDur = maxd || durationRangeSec[1] || paramsVideo.maxduration;
403
-
404
- if (minDur) {
405
- paramsVideo.minduration = minDur;
406
- }
407
- if (maxDur) {
408
- paramsVideo.maxduration = maxDur;
409
- }
410
-
411
- return paramsVideo;
412
- }
413
-
414
- export function resetUserSync() {
415
- hasSynced = false;
416
- }
417
-
418
- export function getSyncUrl() {
419
- return SYNC_URL;
420
- }
421
-
422
- registerBidder(spec);
@@ -1,39 +0,0 @@
1
- # Overview
2
-
3
- Module Name: The Grid Media Bidder Adapter
4
- Module Type: Bidder Adapter
5
- Maintainer: grid-tech@themediagrid.com
6
-
7
- # Description
8
-
9
- Module that connects to Grid demand source to fetch bids.
10
- Grid bid adapter supports Banner and Video (instream and outstream).
11
-
12
- # Test Parameters
13
- ```
14
- var adUnits = [
15
- {
16
- code: 'test-div',
17
- mediaTypes: {
18
- video: {
19
- playerSize: [728, 90],
20
- context: 'outstream'
21
- }
22
- },
23
- bids: [
24
- {
25
- bidder: "gridNM",
26
- params: {
27
- source: 'jwp',
28
- secid: '11',
29
- pubid: '22',
30
- video: {
31
- mimes: ['video/mp4', 'video/x-ms-wmv'],
32
- protocols: [1,2,3,4,5,6]
33
- }
34
- }
35
- }
36
- ]
37
- }
38
- ];
39
- ```