prebid.js 7.31.0 → 7.32.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 (180) 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/adlooxRtdProvider.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adtrgtmeBidAdapter.js +1 -1
  9. package/dist/adxcgBidAdapter.js +1 -1
  10. package/dist/aidemBidAdapter.js +1 -1
  11. package/dist/ajaBidAdapter.js +1 -1
  12. package/dist/alkimiBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/aolBidAdapter.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/appushBidAdapter.js +1 -0
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/bidglassBidAdapter.js +1 -1
  22. package/dist/big-richmediaBidAdapter.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/connectIdSystem.js +1 -1
  29. package/dist/connectadBidAdapter.js +1 -1
  30. package/dist/consumableBidAdapter.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/dspxBidAdapter.js +1 -1
  35. package/dist/eplanningBidAdapter.js +1 -1
  36. package/dist/feedadBidAdapter.js +1 -1
  37. package/dist/finativeBidAdapter.js +1 -1
  38. package/dist/glimpseBidAdapter.js +1 -1
  39. package/dist/gmosspBidAdapter.js +1 -1
  40. package/dist/goldbachBidAdapter.js +1 -1
  41. package/dist/gridBidAdapter.js +1 -1
  42. package/dist/gridNMBidAdapter.js +1 -1
  43. package/dist/gumgumBidAdapter.js +1 -1
  44. package/dist/h12mediaBidAdapter.js +1 -1
  45. package/dist/holidBidAdapter.js +1 -0
  46. package/dist/id5IdSystem.js +1 -1
  47. package/dist/improvedigitalBidAdapter.js +1 -1
  48. package/dist/inmarBidAdapter.js +1 -1
  49. package/dist/insticatorBidAdapter.js +1 -1
  50. package/dist/ixBidAdapter.js +1 -1
  51. package/dist/justpremiumBidAdapter.js +1 -1
  52. package/dist/jwplayerVideoProvider.js +1 -1
  53. package/dist/konduitAnalyticsAdapter.js +1 -1
  54. package/dist/kueezBidAdapter.js +1 -1
  55. package/dist/kueezRtbBidAdapter.js +1 -1
  56. package/dist/lassoBidAdapter.js +1 -1
  57. package/dist/lifestreetBidAdapter.js +1 -1
  58. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  59. package/dist/logicadBidAdapter.js +1 -1
  60. package/dist/loglyliftBidAdapter.js +1 -1
  61. package/dist/magniteAnalyticsAdapter.js +1 -1
  62. package/dist/malltvAnalyticsAdapter.js +1 -1
  63. package/dist/marsmediaBidAdapter.js +1 -1
  64. package/dist/mediafuseBidAdapter.js +1 -1
  65. package/dist/medianetRtdProvider.js +1 -1
  66. package/dist/mediasquareBidAdapter.js +1 -1
  67. package/dist/mgidBidAdapter.js +1 -1
  68. package/dist/minutemediaBidAdapter.js +1 -1
  69. package/dist/nexx360BidAdapter.js +1 -1
  70. package/dist/not-for-prod/prebid.js +126 -123
  71. package/dist/oguryBidAdapter.js +1 -1
  72. package/dist/onetagBidAdapter.js +1 -1
  73. package/dist/ooloAnalyticsAdapter.js +1 -1
  74. package/dist/orbitsoftBidAdapter.js +1 -0
  75. package/dist/outbrainBidAdapter.js +1 -1
  76. package/dist/parrableIdSystem.js +1 -1
  77. package/dist/permutiveRtdProvider.js +1 -1
  78. package/dist/pixfutureBidAdapter.js +1 -1
  79. package/dist/prebid-core.js +1 -1
  80. package/dist/publinkIdSystem.js +1 -1
  81. package/dist/pubmaticBidAdapter.js +1 -1
  82. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  83. package/dist/pxyzBidAdapter.js +1 -1
  84. package/dist/quantcastBidAdapter.js +1 -1
  85. package/dist/readpeakBidAdapter.js +1 -1
  86. package/dist/relaidoBidAdapter.js +1 -1
  87. package/dist/rhythmoneBidAdapter.js +1 -1
  88. package/dist/riseBidAdapter.js +1 -1
  89. package/dist/rubiconAnalyticsAdapter.js +1 -1
  90. package/dist/rubiconBidAdapter.js +1 -1
  91. package/dist/seedingAllianceBidAdapter.js +1 -1
  92. package/dist/seedtagBidAdapter.js +1 -1
  93. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  94. package/dist/sharethroughBidAdapter.js +1 -1
  95. package/dist/shinezBidAdapter.js +1 -1
  96. package/dist/smaatoBidAdapter.js +1 -1
  97. package/dist/smartadserverBidAdapter.js +1 -1
  98. package/dist/smartxBidAdapter.js +1 -1
  99. package/dist/smilewantedBidAdapter.js +1 -1
  100. package/dist/sonobiBidAdapter.js +1 -1
  101. package/dist/sovrnAnalyticsAdapter.js +1 -1
  102. package/dist/sovrnBidAdapter.js +1 -1
  103. package/dist/sspBCBidAdapter.js +1 -1
  104. package/dist/sublimeBidAdapter.js +1 -1
  105. package/dist/synacormediaBidAdapter.js +1 -1
  106. package/dist/taboolaBidAdapter.js +1 -1
  107. package/dist/targetVideoBidAdapter.js +1 -1
  108. package/dist/teadsBidAdapter.js +1 -1
  109. package/dist/trionBidAdapter.js +1 -1
  110. package/dist/tripleliftBidAdapter.js +1 -1
  111. package/dist/ttdBidAdapter.js +1 -1
  112. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  113. package/dist/uid2IdSystem.js +1 -1
  114. package/dist/underdogmediaBidAdapter.js +1 -1
  115. package/dist/undertoneBidAdapter.js +1 -1
  116. package/dist/vidazooBidAdapter.js +1 -1
  117. package/dist/videobyteBidAdapter.js +1 -1
  118. package/dist/visxBidAdapter.js +1 -1
  119. package/dist/vuukleBidAdapter.js +1 -1
  120. package/dist/widespaceBidAdapter.js +1 -1
  121. package/dist/winrBidAdapter.js +1 -1
  122. package/dist/yahoosspBidAdapter.js +1 -1
  123. package/dist/yieldlabBidAdapter.js +1 -1
  124. package/dist/yieldmoBidAdapter.js +1 -1
  125. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  126. package/integrationExamples/gpt/adloox.html +5 -0
  127. package/modules/adagioBidAdapter.js +0 -4
  128. package/modules/adagioBidAdapter.md +4 -22
  129. package/modules/adlooxAnalyticsAdapter.md +5 -3
  130. package/modules/adlooxRtdProvider.js +82 -278
  131. package/modules/adlooxRtdProvider.md +6 -6
  132. package/modules/aidemBidAdapter.js +4 -0
  133. package/modules/aidemBidAdapter.md +1 -0
  134. package/modules/alkimiBidAdapter.js +23 -6
  135. package/modules/aolBidAdapter.js +12 -0
  136. package/modules/appnexusBidAdapter.js +2 -2
  137. package/modules/appushBidAdapter.js +188 -0
  138. package/modules/appushBidAdapter.md +79 -0
  139. package/modules/asoBidAdapter.js +8 -5
  140. package/modules/confiantRtdProvider.js +1 -1
  141. package/modules/connectIdSystem.js +15 -1
  142. package/modules/feedadBidAdapter.js +7 -5
  143. package/modules/holidBidAdapter.js +170 -0
  144. package/modules/holidBidAdapter.md +36 -0
  145. package/modules/jwplayerVideoProvider.js +10 -3
  146. package/modules/kueezRtbBidAdapter.js +21 -8
  147. package/modules/medianetRtdProvider.js +4 -4
  148. package/modules/nexx360BidAdapter.js +5 -7
  149. package/modules/orbitsoftBidAdapter.js +150 -0
  150. package/modules/permutiveRtdProvider.js +1 -1
  151. package/modules/riseBidAdapter.js +2 -1
  152. package/modules/riseBidAdapter.md +2 -0
  153. package/modules/seedtagBidAdapter.js +12 -0
  154. package/modules/smartxBidAdapter.js +6 -0
  155. package/modules/taboolaBidAdapter.js +61 -14
  156. package/modules/yahoosspBidAdapter.js +5 -0
  157. package/modules/yieldlabBidAdapter.js +150 -134
  158. package/modules/yieldmoBidAdapter.js +1 -12
  159. package/package.json +1 -1
  160. package/test/spec/modules/adagioBidAdapter_spec.js +1 -28
  161. package/test/spec/modules/adlooxRtdProvider_spec.js +28 -120
  162. package/test/spec/modules/aidemBidAdapter_spec.js +10 -2
  163. package/test/spec/modules/alkimiBidAdapter_spec.js +15 -3
  164. package/test/spec/modules/aolBidAdapter_spec.js +22 -0
  165. package/test/spec/modules/appnexusBidAdapter_spec.js +7 -3
  166. package/test/spec/modules/appushBidAdapter_spec.js +372 -0
  167. package/test/spec/modules/connectIdSystem_spec.js +17 -5
  168. package/test/spec/modules/feedadBidAdapter_spec.js +23 -1
  169. package/test/spec/modules/holidBidAdapter_spec.js +165 -0
  170. package/test/spec/modules/kueezRtbBidAdapter_spec.js +147 -24
  171. package/test/spec/modules/medianetRtdProvider_spec.js +3 -3
  172. package/test/spec/modules/orbitsoftBidAdapter_spec.js +255 -0
  173. package/test/spec/modules/riseBidAdapter_spec.js +7 -0
  174. package/test/spec/modules/seedtagBidAdapter_spec.js +56 -10
  175. package/test/spec/modules/smartxBidAdapter_spec.js +10 -0
  176. package/test/spec/modules/taboolaBidAdapter_spec.js +142 -5
  177. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +45 -10
  178. package/test/spec/modules/yahoosspBidAdapter_spec.js +16 -1
  179. package/test/spec/modules/yieldlabBidAdapter_spec.js +311 -301
  180. package/test/spec/modules/yieldmoBidAdapter_spec.js +70 -0
@@ -0,0 +1,188 @@
1
+ import { isFn, deepAccess, logMessage, logError } from '../src/utils.js';
2
+ import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
3
+
4
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
5
+ import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
6
+ import { config } from '../src/config.js';
7
+
8
+ const BIDDER_CODE = 'appush';
9
+ const AD_URL = 'https://hb.appush.com/pbjs';
10
+
11
+ function isBidResponseValid(bid) {
12
+ if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) {
13
+ return false;
14
+ }
15
+
16
+ switch (bid.mediaType) {
17
+ case BANNER:
18
+ return Boolean(bid.width && bid.height && bid.ad);
19
+ case VIDEO:
20
+ return Boolean(bid.vastUrl || bid.vastXml);
21
+ case NATIVE:
22
+ return Boolean(bid.native && bid.native.impressionTrackers && bid.native.impressionTrackers.length);
23
+ default:
24
+ return false;
25
+ }
26
+ }
27
+
28
+ function getPlacementReqData(bid) {
29
+ const { params, bidId, mediaTypes } = bid;
30
+ const schain = bid.schain || {};
31
+ const { placementId, endpointId } = params;
32
+ const bidfloor = getBidFloor(bid);
33
+
34
+ const placement = {
35
+ bidId,
36
+ schain,
37
+ bidfloor
38
+ };
39
+
40
+ if (placementId) {
41
+ placement.placementId = placementId;
42
+ placement.type = 'publisher';
43
+ } else if (endpointId) {
44
+ placement.endpointId = endpointId;
45
+ placement.type = 'network';
46
+ }
47
+
48
+ if (mediaTypes && mediaTypes[BANNER]) {
49
+ placement.adFormat = BANNER;
50
+ placement.sizes = mediaTypes[BANNER].sizes;
51
+ } else if (mediaTypes && mediaTypes[VIDEO]) {
52
+ placement.adFormat = VIDEO;
53
+ placement.playerSize = mediaTypes[VIDEO].playerSize;
54
+ placement.minduration = mediaTypes[VIDEO].minduration;
55
+ placement.maxduration = mediaTypes[VIDEO].maxduration;
56
+ placement.mimes = mediaTypes[VIDEO].mimes;
57
+ placement.protocols = mediaTypes[VIDEO].protocols;
58
+ placement.startdelay = mediaTypes[VIDEO].startdelay;
59
+ placement.placement = mediaTypes[VIDEO].placement;
60
+ placement.skip = mediaTypes[VIDEO].skip;
61
+ placement.skipafter = mediaTypes[VIDEO].skipafter;
62
+ placement.minbitrate = mediaTypes[VIDEO].minbitrate;
63
+ placement.maxbitrate = mediaTypes[VIDEO].maxbitrate;
64
+ placement.delivery = mediaTypes[VIDEO].delivery;
65
+ placement.playbackmethod = mediaTypes[VIDEO].playbackmethod;
66
+ placement.api = mediaTypes[VIDEO].api;
67
+ placement.linearity = mediaTypes[VIDEO].linearity;
68
+ } else if (mediaTypes && mediaTypes[NATIVE]) {
69
+ placement.native = mediaTypes[NATIVE];
70
+ placement.adFormat = NATIVE;
71
+ }
72
+
73
+ return placement;
74
+ }
75
+
76
+ function getBidFloor(bid) {
77
+ if (!isFn(bid.getFloor)) {
78
+ return deepAccess(bid, 'params.bidfloor', 0);
79
+ }
80
+
81
+ try {
82
+ const bidFloor = bid.getFloor({
83
+ currency: 'USD',
84
+ mediaType: '*',
85
+ size: '*',
86
+ });
87
+ return bidFloor.floor;
88
+ } catch (err) {
89
+ logError(err);
90
+ return 0;
91
+ }
92
+ }
93
+
94
+ export const spec = {
95
+ code: BIDDER_CODE,
96
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
97
+
98
+ isBidRequestValid: (bid = {}) => {
99
+ const { params, bidId, mediaTypes } = bid;
100
+ let valid = Boolean(bidId && params && (params.placementId || params.endpointId));
101
+
102
+ if (mediaTypes && mediaTypes[BANNER]) {
103
+ valid = valid && Boolean(mediaTypes[BANNER] && mediaTypes[BANNER].sizes);
104
+ } else if (mediaTypes && mediaTypes[VIDEO]) {
105
+ valid = valid && Boolean(mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize);
106
+ } else if (mediaTypes && mediaTypes[NATIVE]) {
107
+ valid = valid && Boolean(mediaTypes[NATIVE]);
108
+ } else {
109
+ valid = false;
110
+ }
111
+ return valid;
112
+ },
113
+
114
+ buildRequests: (validBidRequests = [], bidderRequest = {}) => {
115
+ // convert Native ORTB definition to old-style prebid native definition
116
+ validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
117
+
118
+ let deviceWidth = 0;
119
+ let deviceHeight = 0;
120
+
121
+ let winLocation;
122
+ try {
123
+ const winTop = window.top;
124
+ deviceWidth = winTop.screen.width;
125
+ deviceHeight = winTop.screen.height;
126
+ winLocation = winTop.location;
127
+ } catch (e) {
128
+ logMessage(e);
129
+ winLocation = window.location;
130
+ }
131
+
132
+ const refferUrl = bidderRequest.refererInfo && bidderRequest.refererInfo.page;
133
+ let refferLocation;
134
+ try {
135
+ refferLocation = refferUrl && new URL(refferUrl);
136
+ } catch (e) {
137
+ logMessage(e);
138
+ }
139
+ // TODO: does the fallback make sense here?
140
+ let location = refferLocation || winLocation;
141
+ const language = (navigator && navigator.language) ? navigator.language.split('-')[0] : '';
142
+ const host = location.host;
143
+ const page = location.pathname;
144
+ const secure = location.protocol === 'https:' ? 1 : 0;
145
+ const placements = [];
146
+ const request = {
147
+ deviceWidth,
148
+ deviceHeight,
149
+ language,
150
+ secure,
151
+ host,
152
+ page,
153
+ placements,
154
+ coppa: config.getConfig('coppa') === true ? 1 : 0,
155
+ ccpa: bidderRequest.uspConsent || undefined,
156
+ gdpr: bidderRequest.gdprConsent || undefined,
157
+ tmax: config.getConfig('bidderTimeout')
158
+ };
159
+
160
+ const len = validBidRequests.length;
161
+ for (let i = 0; i < len; i++) {
162
+ const bid = validBidRequests[i];
163
+ placements.push(getPlacementReqData(bid));
164
+ }
165
+
166
+ return {
167
+ method: 'POST',
168
+ url: AD_URL,
169
+ data: request
170
+ };
171
+ },
172
+
173
+ interpretResponse: (serverResponse) => {
174
+ let response = [];
175
+ for (let i = 0; i < serverResponse.body.length; i++) {
176
+ let resItem = serverResponse.body[i];
177
+ if (isBidResponseValid(resItem)) {
178
+ const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : [];
179
+ resItem.meta = { ...resItem.meta, advertiserDomains };
180
+
181
+ response.push(resItem);
182
+ }
183
+ }
184
+ return response;
185
+ }
186
+ };
187
+
188
+ registerBidder(spec);
@@ -0,0 +1,79 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: Appush Bidder Adapter
5
+ Module Type: Appush Bidder Adapter
6
+ Maintainer: support@appush.com
7
+ ```
8
+
9
+ # Description
10
+
11
+ Connects to Appush exchange for bids.
12
+ Appush bid adapter supports Banner, Video (instream and outstream) and Native.
13
+
14
+ # Test Parameters
15
+ ```
16
+ var adUnits = [
17
+ // Will return static test banner
18
+ {
19
+ code: 'adunit1',
20
+ mediaTypes: {
21
+ banner: {
22
+ sizes: [ [300, 250], [320, 50] ],
23
+ }
24
+ },
25
+ bids: [
26
+ {
27
+ bidder: 'appush',
28
+ params: {
29
+ placementId: 'testBanner',
30
+ }
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ code: 'addunit2',
36
+ mediaTypes: {
37
+ video: {
38
+ playerSize: [ [640, 480] ],
39
+ context: 'instream',
40
+ minduration: 5,
41
+ maxduration: 60,
42
+ }
43
+ },
44
+ bids: [
45
+ {
46
+ bidder: 'appush',
47
+ params: {
48
+ placementId: 'testVideo',
49
+ }
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ code: 'addunit3',
55
+ mediaTypes: {
56
+ native: {
57
+ title: {
58
+ required: true
59
+ },
60
+ body: {
61
+ required: true
62
+ },
63
+ icon: {
64
+ required: true,
65
+ size: [64, 64]
66
+ }
67
+ }
68
+ },
69
+ bids: [
70
+ {
71
+ bidder: 'appush',
72
+ params: {
73
+ placementId: 'testNative',
74
+ }
75
+ }
76
+ ]
77
+ }
78
+ ];
79
+ ```
@@ -10,11 +10,11 @@ import {
10
10
  parseSizesInput,
11
11
  tryAppendQueryString
12
12
  } from '../src/utils.js';
13
- import {registerBidder} from '../src/adapters/bidderFactory.js';
14
- import {config} from '../src/config.js';
15
- import {BANNER, VIDEO} from '../src/mediaTypes.js';
16
- import {Renderer} from '../src/Renderer.js';
17
- import {parseDomain} from '../src/refererDetection.js';
13
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
14
+ import { config } from '../src/config.js';
15
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
16
+ import { Renderer } from '../src/Renderer.js';
17
+ import { parseDomain } from '../src/refererDetection.js';
18
18
 
19
19
  const BIDDER_CODE = 'aso';
20
20
  const DEFAULT_SERVER_URL = 'https://srv.aso1.net';
@@ -27,6 +27,9 @@ export const spec = {
27
27
 
28
28
  code: BIDDER_CODE,
29
29
  supportedMediaTypes: [BANNER, VIDEO],
30
+ aliases: [
31
+ {code: 'bcmint'}
32
+ ],
30
33
 
31
34
  isBidRequestValid: bid => {
32
35
  return !!bid.params && !!bid.params.zone;
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * The {@link module:modules/realTimeData} module is required
6
6
  * The module will inject a Confiant Inc. script into the page to monitor ad impressions
7
- * @module modules/cleanioRtdProvider
7
+ * @module modules/confiantRtdProvider
8
8
  * @requires module:modules/realTimeData
9
9
  */
10
10
 
@@ -66,6 +66,11 @@ export const connectIdSubmodule = {
66
66
  us_privacy: consentData && consentData.uspConsent ? consentData.uspConsent : ''
67
67
  };
68
68
 
69
+ if (connectIdSubmodule.isUnderGPPJurisdiction(consentData)) {
70
+ data.gpp = consentData.gppConsent.gppString;
71
+ data.gpp_sid = encodeURIComponent(consentData.gppConsent.applicableSections.join(','));
72
+ }
73
+
69
74
  INPUT_PARAM_KEYS.forEach(key => {
70
75
  if (typeof params[key] != 'undefined') {
71
76
  data[key] = params[key];
@@ -98,7 +103,7 @@ export const connectIdSubmodule = {
98
103
  },
99
104
 
100
105
  /**
101
- * Utility function that returns a boolean flag indicating if the opporunity
106
+ * Utility function that returns a boolean flag indicating if the opportunity
102
107
  * is subject to GDPR
103
108
  * @returns {Boolean}
104
109
  */
@@ -106,6 +111,15 @@ export const connectIdSubmodule = {
106
111
  return !!(consentData && consentData.gdpr && consentData.gdpr.gdprApplies);
107
112
  },
108
113
 
114
+ /**
115
+ * Utility function that returns a boolean flag indicating if the opportunity
116
+ * is subject to GPP jurisdiction.
117
+ * @returns {Boolean}
118
+ */
119
+ isUnderGPPJurisdiction(consentData) {
120
+ return !!(consentData && consentData.gppConsent && consentData.gppConsent.gppString);
121
+ },
122
+
109
123
  /**
110
124
  * Utility function that returns a boolean flag indicating if the user
111
125
  * has opeted out via the Yahoo easy-opt-out mechanism.
@@ -7,7 +7,7 @@ import {ajax} from '../src/ajax.js';
7
7
  * Version of the FeedAd bid adapter
8
8
  * @type {string}
9
9
  */
10
- const VERSION = '1.0.4';
10
+ const VERSION = '1.0.5';
11
11
 
12
12
  /**
13
13
  * @typedef {object} FeedAdApiBidRequest
@@ -16,7 +16,8 @@ const VERSION = '1.0.4';
16
16
  * @property {number} ad_type
17
17
  * @property {string} client_token
18
18
  * @property {string} placement_id
19
- * @property {string} sdk_version
19
+ * @property {string} prebid_adapter_version
20
+ * @property {string} prebid_sdk_version
20
21
  * @property {boolean} app_hybrid
21
22
  *
22
23
  * @property {string} [app_bundle_id]
@@ -181,7 +182,8 @@ function createApiBidRParams(request) {
181
182
  ad_type: 0,
182
183
  client_token: request.params.clientToken,
183
184
  placement_id: request.params.placementId,
184
- sdk_version: `prebid_${VERSION}`,
185
+ prebid_adapter_version: VERSION,
186
+ prebid_sdk_version: '$prebid.version$',
185
187
  app_hybrid: false,
186
188
  });
187
189
  }
@@ -207,7 +209,6 @@ function buildRequests(validBidRequests, bidderRequest) {
207
209
  })
208
210
  });
209
211
  data.bids.forEach(bid => BID_METADATA[bid.bidId] = {
210
- // TODO: is 'page' the right value here?
211
212
  referer: data.refererInfo.page,
212
213
  transactionId: bid.transactionId
213
214
  });
@@ -266,7 +267,8 @@ function createTrackingParams(data, klass) {
266
267
  prebid_bid_id: bidId,
267
268
  prebid_transaction_id: transactionId,
268
269
  referer,
269
- sdk_version: VERSION
270
+ prebid_adapter_version: VERSION,
271
+ prebid_sdk_version: '$prebid.version$',
270
272
  };
271
273
  }
272
274
 
@@ -0,0 +1,170 @@
1
+ import {
2
+ deepAccess,
3
+ getBidIdParameter,
4
+ isStr,
5
+ logMessage,
6
+ triggerPixel,
7
+ } from '../src/utils.js'
8
+ import * as events from '../src/events.js'
9
+ import CONSTANTS from '../src/constants.json'
10
+ import { BANNER } from '../src/mediaTypes.js'
11
+
12
+ import { registerBidder } from '../src/adapters/bidderFactory.js'
13
+
14
+ const BIDDER_CODE = 'holid'
15
+ const GVLID = 1177
16
+ const ENDPOINT = 'https://helloworld.holid.io/openrtb2/auction'
17
+ const COOKIE_SYNC_ENDPOINT = 'https://null.holid.io/sync.html'
18
+ const TIME_TO_LIVE = 300
19
+ let wurlMap = {}
20
+
21
+ events.on(CONSTANTS.EVENTS.BID_WON, bidWonHandler)
22
+
23
+ export const spec = {
24
+ code: BIDDER_CODE,
25
+ gvlid: GVLID,
26
+ supportedMediaTypes: [BANNER],
27
+
28
+ isBidRequestValid: function (bid) {
29
+ return !!bid.params.adUnitID
30
+ },
31
+
32
+ buildRequests: function (validBidRequests, _bidderRequest) {
33
+ return validBidRequests.map((bid) => {
34
+ const requestData = {
35
+ ...bid.ortb2,
36
+ id: bid.auctionId,
37
+ imp: [getImp(bid)],
38
+ }
39
+
40
+ return {
41
+ method: 'POST',
42
+ url: ENDPOINT,
43
+ data: JSON.stringify(requestData),
44
+ bidId: bid.bidId,
45
+ }
46
+ })
47
+ },
48
+
49
+ interpretResponse: function (serverResponse, bidRequest) {
50
+ const bidResponses = []
51
+
52
+ if (!serverResponse.body.seatbid) {
53
+ return []
54
+ }
55
+
56
+ serverResponse.body.seatbid.map((response) => {
57
+ response.bid.map((bid) => {
58
+ const requestId = bidRequest.bidId
59
+ const auctionId = bidRequest.auctionId
60
+ const wurl = deepAccess(bid, 'ext.prebid.events.win')
61
+ const bidResponse = {
62
+ requestId,
63
+ cpm: bid.price,
64
+ width: bid.w,
65
+ height: bid.h,
66
+ ad: bid.adm,
67
+ creativeId: bid.crid,
68
+ currency: serverResponse.body.cur,
69
+ netRevenue: true,
70
+ ttl: TIME_TO_LIVE,
71
+ }
72
+
73
+ addWurl({ auctionId, requestId, wurl })
74
+
75
+ bidResponses.push(bidResponse)
76
+ })
77
+ })
78
+
79
+ return bidResponses
80
+ },
81
+
82
+ getUserSyncs(optionsType, serverResponse, gdprConsent, uspConsent) {
83
+ if (!serverResponse || serverResponse.length === 0) {
84
+ return []
85
+ }
86
+
87
+ const syncs = []
88
+
89
+ if (optionsType.iframeEnabled) {
90
+ const queryParams = []
91
+
92
+ queryParams.push('bidders=' + getBidders(serverResponse))
93
+ queryParams.push('gdpr=' + +gdprConsent.gdprApplies)
94
+ queryParams.push('gdpr_consent=' + gdprConsent.consentString)
95
+ queryParams.push('usp_consent=' + (uspConsent || ''))
96
+
97
+ let strQueryParams = queryParams.join('&')
98
+
99
+ if (strQueryParams.length > 0) {
100
+ strQueryParams = '?' + strQueryParams
101
+ }
102
+
103
+ syncs.push({
104
+ type: 'iframe',
105
+ url: COOKIE_SYNC_ENDPOINT + strQueryParams + '&type=iframe',
106
+ })
107
+
108
+ return syncs
109
+ }
110
+ },
111
+ }
112
+
113
+ function getImp(bid) {
114
+ const imp = {
115
+ ext: {
116
+ prebid: {
117
+ storedrequest: {
118
+ id: getBidIdParameter('adUnitID', bid.params),
119
+ },
120
+ },
121
+ },
122
+ }
123
+ const sizes =
124
+ bid.sizes && !Array.isArray(bid.sizes[0]) ? [bid.sizes] : bid.sizes
125
+
126
+ if (deepAccess(bid, 'mediaTypes.banner')) {
127
+ imp.banner = {
128
+ format: sizes.map((size) => {
129
+ return { w: size[0], h: size[1] }
130
+ }),
131
+ }
132
+ }
133
+
134
+ return imp
135
+ }
136
+
137
+ function getBidders(serverResponse) {
138
+ const bidders = serverResponse
139
+ .map((res) => Object.keys(res.body.ext.responsetimemillis))
140
+ .flat(1)
141
+
142
+ return encodeURIComponent(JSON.stringify([...new Set(bidders)]))
143
+ }
144
+
145
+ function addWurl(auctionId, adId, wurl) {
146
+ if ([auctionId, adId].every(isStr)) {
147
+ wurlMap[`${auctionId}${adId}`] = wurl
148
+ }
149
+ }
150
+
151
+ function removeWurl(auctionId, adId) {
152
+ delete wurlMap[`${auctionId}${adId}`]
153
+ }
154
+
155
+ function getWurl(auctionId, adId) {
156
+ if ([auctionId, adId].every(isStr)) {
157
+ return wurlMap[`${auctionId}${adId}`]
158
+ }
159
+ }
160
+
161
+ function bidWonHandler(bid) {
162
+ const wurl = getWurl(bid.auctionId, bid.adId)
163
+ if (wurl) {
164
+ logMessage(`Invoking image pixel for wurl on BID_WIN: "${wurl}"`)
165
+ triggerPixel(wurl)
166
+ removeWurl(bid.auctionId, bid.adId)
167
+ }
168
+ }
169
+
170
+ registerBidder(spec)
@@ -0,0 +1,36 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: Holid Bid Adapter
5
+ Module Type: Bidder Adapter
6
+ Maintainer: richard@holid.se
7
+ ```
8
+
9
+ # Description
10
+
11
+ Currently module supports only banner mediaType.
12
+
13
+ # Test Parameters
14
+
15
+ ## Sample Banner Ad Unit
16
+
17
+ ```js
18
+ var adUnits = [
19
+ {
20
+ code: 'bannerAdUnit',
21
+ mediaTypes: {
22
+ banner: {
23
+ sizes: [[300, 250]],
24
+ },
25
+ },
26
+ bids: [
27
+ {
28
+ bidder: 'holid',
29
+ params: {
30
+ adUnitID: '12345',
31
+ },
32
+ },
33
+ ],
34
+ },
35
+ ]
36
+ ```
@@ -47,19 +47,26 @@ export function JWPlayerProvider(config, jwplayer_, adState_, timeState_, callba
47
47
 
48
48
  function init() {
49
49
  if (!jwplayer) {
50
- triggerSetupFailure(-1); // TODO: come up with code for player absent
50
+ triggerSetupFailure(-1); // TODO: come up with error code schema- player is absent
51
51
  return;
52
52
  }
53
53
 
54
54
  playerVersion = jwplayer.version;
55
55
 
56
56
  if (playerVersion < minimumSupportedPlayerVersion) {
57
- triggerSetupFailure(-2); // TODO: come up with code for version not supported
57
+ triggerSetupFailure(-2); // TODO: come up with error code schema - version not supported
58
+ return;
59
+ }
60
+
61
+ if (!document.getElementById(divId)) {
62
+ triggerSetupFailure(-3); // TODO: come up with error code schema - missing div id
58
63
  return;
59
64
  }
60
65
 
61
66
  player = jwplayer(divId);
62
- if (player.getState() === undefined) {
67
+ if (!player || !player.getState) {
68
+ triggerSetupFailure(-4); // TODO: come up with error code schema - factory function failure
69
+ } else if (player.getState() === undefined) {
63
70
  setupPlayer(playerConfig);
64
71
  } else {
65
72
  const payload = getSetupCompletePayload();
@@ -1,6 +1,6 @@
1
1
  import { _each, deepAccess, parseSizesInput, parseUrl, uniques, isFn } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
- import { BANNER } from '../src/mediaTypes.js';
3
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
4
4
  import { getStorageManager } from '../src/storageManager.js';
5
5
 
6
6
  const GVLID = 1165;
@@ -55,7 +55,7 @@ function isBidRequestValid(bid) {
55
55
  }
56
56
 
57
57
  function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
58
- const { params, bidId, userId, adUnitCode, schain } = bid;
58
+ const { params, bidId, userId, adUnitCode, schain, mediaTypes } = bid;
59
59
  let { bidFloor, ext } = params;
60
60
  const hashUrl = hashCode(topWindowUrl);
61
61
  const uniqueDealId = getUniqueDealId(hashUrl);
@@ -89,7 +89,8 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
89
89
  bidderVersion: BIDDER_VERSION,
90
90
  prebidVersion: '$prebid.version$',
91
91
  res: `${screen.width}x${screen.height}`,
92
- schain: schain
92
+ schain: schain,
93
+ mediaTypes: mediaTypes
93
94
  };
94
95
 
95
96
  appendUserIdsToRequestPayload(data, userId);
@@ -167,11 +168,12 @@ function interpretResponse(serverResponse, request) {
167
168
 
168
169
  try {
169
170
  results.forEach(result => {
170
- const { creativeId, ad, price, exp, width, height, currency, advertiserDomains } = result;
171
+ const { creativeId, ad, price, exp, width, height, currency, advertiserDomains, mediaType = BANNER } = result;
171
172
  if (!ad || !price) {
172
173
  return;
173
174
  }
174
- output.push({
175
+
176
+ const response = {
175
177
  requestId: bidId,
176
178
  cpm: price,
177
179
  width: width,
@@ -180,11 +182,22 @@ function interpretResponse(serverResponse, request) {
180
182
  currency: currency || CURRENCY,
181
183
  netRevenue: true,
182
184
  ttl: exp || TTL_SECONDS,
183
- ad: ad,
184
185
  meta: {
185
186
  advertiserDomains: advertiserDomains || []
186
187
  }
187
- })
188
+ };
189
+
190
+ if (mediaType === BANNER) {
191
+ Object.assign(response, {
192
+ ad: ad,
193
+ });
194
+ } else {
195
+ Object.assign(response, {
196
+ vastXml: ad,
197
+ mediaType: VIDEO
198
+ });
199
+ }
200
+ output.push(response);
188
201
  });
189
202
  return output;
190
203
  } catch (e) {
@@ -268,7 +281,7 @@ export const spec = {
268
281
  code: BIDDER_CODE,
269
282
  version: BIDDER_VERSION,
270
283
  gvlid: GVLID,
271
- supportedMediaTypes: [BANNER],
284
+ supportedMediaTypes: [BANNER, VIDEO],
272
285
  isBidRequestValid,
273
286
  buildRequests,
274
287
  interpretResponse,