prebid.js 5.20.0 → 6.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 (168) hide show
  1. package/.babelrc.js +1 -10
  2. package/README.md +4 -2
  3. package/browsers.json +13 -37
  4. package/gulpfile.js +1 -8
  5. package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
  6. package/karma.conf.maker.js +1 -1
  7. package/modules/33acrossBidAdapter.js +189 -102
  8. package/modules/adagioBidAdapter.js +1 -1
  9. package/modules/addefendBidAdapter.js +1 -0
  10. package/modules/adheseBidAdapter.js +7 -2
  11. package/modules/adkernelBidAdapter.js +1 -0
  12. package/modules/adlivetechBidAdapter.md +61 -0
  13. package/modules/admanBidAdapter.js +1 -0
  14. package/modules/admixerBidAdapter.js +3 -2
  15. package/modules/adnuntiusBidAdapter.js +5 -2
  16. package/modules/adomikAnalyticsAdapter.js +10 -4
  17. package/modules/adplusBidAdapter.js +203 -0
  18. package/modules/adplusBidAdapter.md +39 -0
  19. package/modules/adxcgBidAdapter.js +311 -359
  20. package/modules/adxcgBidAdapter.md +22 -21
  21. package/modules/adyoulikeBidAdapter.js +7 -2
  22. package/modules/appnexusBidAdapter.js +23 -3
  23. package/modules/beachfrontBidAdapter.js +14 -17
  24. package/modules/beopBidAdapter.js +5 -3
  25. package/modules/codefuelBidAdapter.js +1 -3
  26. package/modules/codefuelBidAdapter.md +3 -3
  27. package/modules/colossussspBidAdapter.js +7 -0
  28. package/modules/craftBidAdapter.js +5 -3
  29. package/modules/criteoBidAdapter.js +1 -1
  30. package/modules/cwireBidAdapter.js +3 -0
  31. package/modules/datablocksBidAdapter.js +3 -3
  32. package/modules/dchain.js +149 -0
  33. package/modules/dchain.md +45 -0
  34. package/modules/deepintentBidAdapter.js +1 -1
  35. package/modules/dspxBidAdapter.js +1 -1
  36. package/modules/emx_digitalBidAdapter.js +9 -1
  37. package/modules/engageyaBidAdapter.js +68 -54
  38. package/modules/freewheel-sspBidAdapter.js +6 -0
  39. package/modules/futureads.md +48 -0
  40. package/modules/glimpseBidAdapter.js +44 -16
  41. package/modules/goldbachBidAdapter.js +1176 -0
  42. package/modules/goldbachBidAdapter.md +151 -0
  43. package/modules/gptPreAuction.js +11 -5
  44. package/modules/gridBidAdapter.js +1 -1
  45. package/modules/gumgumBidAdapter.js +7 -3
  46. package/modules/id5IdSystem.md +6 -6
  47. package/modules/imRtdProvider.js +31 -0
  48. package/modules/intersectionRtdProvider.js +114 -0
  49. package/modules/invibesBidAdapter.js +15 -9
  50. package/modules/ipromBidAdapter.js +79 -0
  51. package/modules/ixBidAdapter.js +166 -21
  52. package/modules/kinessoIdSystem.js +1 -1
  53. package/modules/limelightDigitalBidAdapter.js +2 -1
  54. package/modules/lotamePanoramaIdSystem.js +80 -8
  55. package/modules/luponmediaBidAdapter.js +570 -0
  56. package/modules/mediasquareBidAdapter.js +1 -9
  57. package/modules/merkleIdSystem.js +5 -0
  58. package/modules/missenaBidAdapter.js +89 -0
  59. package/modules/nativoBidAdapter.js +27 -1
  60. package/modules/nextMillenniumBidAdapter.js +29 -1
  61. package/modules/oguryBidAdapter.js +2 -1
  62. package/modules/openxBidAdapter.js +6 -1
  63. package/modules/prebidServerBidAdapter/index.js +19 -15
  64. package/modules/pubmaticBidAdapter.js +5 -3
  65. package/modules/relaidoBidAdapter.js +86 -65
  66. package/modules/richaudienceBidAdapter.js +2 -3
  67. package/modules/rtdModule/index.js +48 -18
  68. package/modules/rubiconBidAdapter.js +10 -8
  69. package/modules/saambaaBidAdapter.js +420 -0
  70. package/modules/saambaaBidAdapter.md +65 -68
  71. package/modules/seedtagBidAdapter.js +6 -0
  72. package/modules/sharedIdSystem.js +27 -1
  73. package/modules/smaatoBidAdapter.js +9 -1
  74. package/modules/smartxBidAdapter.js +17 -1
  75. package/modules/sspBCBidAdapter.js +34 -3
  76. package/modules/tappxBidAdapter.js +3 -1
  77. package/modules/targetVideoBidAdapter.js +187 -0
  78. package/modules/targetVideoBidAdapter.md +34 -0
  79. package/modules/trustxBidAdapter.js +10 -1
  80. package/modules/undertoneBidAdapter.js +8 -1
  81. package/modules/userId/index.js +27 -2
  82. package/modules/ventes.md +71 -0
  83. package/modules/ventesBidAdapter.js +104 -64
  84. package/modules/ventesBidAdapter.md +0 -1
  85. package/modules/vidoomyBidAdapter.js +65 -108
  86. package/modules/visxBidAdapter.js +20 -3
  87. package/modules/visxBidAdapter.md +4 -6
  88. package/modules/weboramaRtdProvider.js +288 -73
  89. package/modules/weboramaRtdProvider.md +27 -10
  90. package/modules/yahoosspBidAdapter.js +5 -1
  91. package/modules/yahoosspBidAdapter.md +1 -1
  92. package/modules/yieldlabBidAdapter.js +41 -10
  93. package/modules/yieldlabBidAdapter.md +91 -48
  94. package/modules/yieldoneBidAdapter.js +115 -11
  95. package/modules/zetaSspBidAdapter.md +33 -1
  96. package/modules/zeta_global_sspBidAdapter.js +22 -1
  97. package/package.json +6 -1
  98. package/plugins/pbjsGlobals.js +28 -1
  99. package/src/adapterManager.js +14 -8
  100. package/src/auction.js +3 -2
  101. package/src/prebid.js +1 -2
  102. package/src/targeting.js +24 -3
  103. package/src/utils.js +41 -7
  104. package/test/spec/integration/faker/googletag.js +6 -0
  105. package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
  106. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  107. package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
  108. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  109. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  110. package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
  111. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  112. package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
  113. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  114. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  115. package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
  116. package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
  117. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  118. package/test/spec/modules/dchain_spec.js +329 -0
  119. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  120. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  121. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  122. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  123. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  124. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  125. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  126. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  127. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  128. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  129. package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
  130. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  131. package/test/spec/modules/ixBidAdapter_spec.js +285 -2
  132. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  133. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  134. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
  135. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  136. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
  137. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  138. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  139. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  140. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +18 -0
  141. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  142. package/test/spec/modules/openxBidAdapter_spec.js +5 -0
  143. package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
  144. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  145. package/test/spec/modules/realTimeDataModule_spec.js +135 -49
  146. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  147. package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
  148. package/test/spec/modules/rubiconBidAdapter_spec.js +17 -0
  149. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  150. package/test/spec/modules/sharedIdSystem_spec.js +52 -6
  151. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  152. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  153. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  154. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  155. package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
  156. package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
  157. package/test/spec/modules/userId_spec.js +51 -0
  158. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  159. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  160. package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
  161. package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
  162. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  163. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  164. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
  165. package/test/spec/unit/core/adapterManager_spec.js +24 -6
  166. package/test/spec/unit/core/targeting_spec.js +116 -0
  167. package/test/spec/utils_spec.js +38 -0
  168. package/wdio.conf.js +1 -1
@@ -2,90 +2,326 @@
2
2
  * This module adds Weborama provider to the real time data module
3
3
  * The {@link module:modules/realTimeData} module is required
4
4
  * The module will fetch contextual data (page-centric) from Weborama server
5
+ * and may access user-centric data from local storage
5
6
  * @module modules/weboramaRtdProvider
6
7
  * @requires module:modules/realTimeData
7
8
  */
8
9
 
9
10
  /**
10
- * @typedef {Object} ModuleParams
11
- * @property {WeboCtxConf} weboCtxConf
12
- */
11
+ * @typedef {Object} ModuleParams
12
+ * @property {WeboCtxConf} weboCtxConf
13
+ * @property {WeboUserDataConf} weboUserDataConf
14
+ */
13
15
 
14
16
  /**
15
- * @typedef {Object} WeboCtxConf
16
- * @property {string} token required token to be used on bigsea contextual API requests
17
- * @property {?string} targetURL specify the target url instead use the referer
18
- * @property {?boolean} setTargeting if true will set the GAM targeting
19
- * @property {?object} defaultProfile to be used if the profile is not found
20
- */
21
-
22
- import { deepSetValue, logError, tryAppendQueryString, logMessage } from '../src/utils.js';
23
- import {submodule} from '../src/hook.js';
24
- import {ajax} from '../src/ajax.js';
25
- import {config} from '../src/config.js';
17
+ * @typedef {Object} WeboCtxConf
18
+ * @property {string} token required token to be used on bigsea contextual API requests
19
+ * @property {?string} targetURL specify the target url instead use the referer
20
+ * @property {?Boolean} setPrebidTargeting if true will set the GAM targeting (default true)
21
+ * @property {?Boolean} sendToBidders if true, will send the contextual profile to all bidders (default true)
22
+ * @property {?object} defaultProfile to be used if the profile is not found
23
+ */
24
+
25
+ /**
26
+ * @typedef {Object} WeboUserDataConf
27
+ * @property {?string} localStorageProfileKey can be used to customize the local storage key (default is 'webo_wam2gam_entry')
28
+ * @property {?Boolean} setPrebidTargeting if true will set the GAM targeting (default true)
29
+ * @property {?Boolean} sendToBidders if true, will send the contextual profile to all bidders (default true)
30
+ * @property {?object} defaultProfile to be used if the profile is not found
31
+ */
32
+
33
+ import {
34
+ getGlobal
35
+ } from '../src/prebidGlobal.js';
36
+ import {
37
+ deepSetValue,
38
+ deepAccess,
39
+ isEmpty,
40
+ mergeDeep,
41
+ logError,
42
+ tryAppendQueryString,
43
+ logMessage
44
+ } from '../src/utils.js';
45
+ import {
46
+ submodule
47
+ } from '../src/hook.js';
48
+ import {
49
+ ajax
50
+ } from '../src/ajax.js';
51
+ import {
52
+ getStorageManager
53
+ } from '../src/storageManager.js';
54
+
55
+ const adapterManager = require('../src/adapterManager.js').default;
26
56
 
27
57
  /** @type {string} */
28
58
  const MODULE_NAME = 'realTimeData';
29
59
  /** @type {string} */
30
60
  const SUBMODULE_NAME = 'weborama';
31
61
  /** @type {string} */
32
- const WEBO_CTX = 'webo_ctx';
62
+ export const DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY = 'webo_wam2gam_entry';
33
63
  /** @type {string} */
34
- const WEBO_DS = 'webo_ds';
64
+ const LOCAL_STORAGE_USER_TARGETING_SECTION = 'targeting';
65
+ /** @type {number} */
66
+ const GVLID = 284;
67
+ /** @type {object} */
68
+ export const storage = getStorageManager(GVLID, SUBMODULE_NAME);
35
69
 
36
70
  /** @type {null|Object} */
37
- let _bigseaContextualProfile = null;
71
+ let _weboContextualProfile = null;
38
72
 
39
- /** function that provides ad server targeting data to RTD-core
40
- * @param {Array} adUnitsCodes
41
- * @param {Object} moduleConfig
42
- * @returns {Object} target data
73
+ /** @type {Boolean} */
74
+ let _weboCtxInitialized = false;
75
+
76
+ /** @type {null|Object} */
77
+ let _weboUserDataUserProfile = null;
78
+
79
+ /** @type {Boolean} */
80
+ let _weboUserDataInitialized = false;
81
+
82
+ /** Initialize module
83
+ * @param {object} moduleConfig
84
+ * @return {Boolean} true if module was initialized with success
43
85
  */
44
- function getTargetingData(adUnitsCodes, moduleConfig) {
86
+ function init(moduleConfig) {
45
87
  moduleConfig = moduleConfig || {};
46
88
  const moduleParams = moduleConfig.params || {};
47
89
  const weboCtxConf = moduleParams.weboCtxConf || {};
48
- const defaultContextualProfiles = weboCtxConf.defaultProfile || {}
49
- const profile = _bigseaContextualProfile || defaultContextualProfiles;
90
+ const weboUserDataConf = moduleParams.weboUserDataConf;
50
91
 
51
- if (weboCtxConf.setOrtb2) {
52
- const ortb2 = config.getConfig('ortb2') || {};
53
- if (profile[WEBO_CTX]) {
54
- deepSetValue(ortb2, 'site.ext.data.webo_ctx', profile[WEBO_CTX]);
55
- }
56
- if (profile[WEBO_DS]) {
57
- deepSetValue(ortb2, 'site.ext.data.webo_ds', profile[WEBO_DS]);
58
- }
59
- config.setConfig({ortb2: ortb2});
60
- }
92
+ _weboCtxInitialized = initWeboCtx(weboCtxConf);
93
+ _weboUserDataInitialized = initWeboUserData(weboUserDataConf);
61
94
 
62
- if (weboCtxConf.setTargeting === false) {
63
- return {};
95
+ return _weboCtxInitialized || _weboUserDataInitialized;
96
+ }
97
+
98
+ /** Initialize contextual sub module
99
+ * @param {WeboCtxConf} weboCtxConf
100
+ * @return {Boolean} true if sub module was initialized with success
101
+ */
102
+ function initWeboCtx(weboCtxConf) {
103
+ _weboCtxInitialized = false;
104
+ _weboContextualProfile = null;
105
+
106
+ if (!weboCtxConf.token) {
107
+ logError('missing param "token" for weborama contextual sub module initialization');
108
+ return false;
64
109
  }
65
110
 
111
+ return true;
112
+ }
113
+
114
+ /** Initialize weboUserData sub module
115
+ * @param {WeboUserDataConf} weboUserDataConf
116
+ * @return {Boolean} true if sub module was initialized with success
117
+ */
118
+ function initWeboUserData(weboUserDataConf) {
119
+ _weboUserDataInitialized = false;
120
+ _weboUserDataUserProfile = null;
121
+
122
+ return !!weboUserDataConf;
123
+ }
124
+
125
+ /** function that provides ad server targeting data to RTD-core
126
+ * @param {Array} adUnitsCodes
127
+ * @param {Object} moduleConfig
128
+ * @returns {Object} target data
129
+ */
130
+ function getTargetingData(adUnitsCodes, moduleConfig) {
131
+ moduleConfig = moduleConfig || {};
132
+ const moduleParams = moduleConfig.params || {};
133
+ const weboCtxConf = moduleParams.weboCtxConf || {};
134
+ const weboUserDataConf = moduleParams.weboUserDataConf || {};
135
+ const weboCtxConfTargeting = weboCtxConf.setPrebidTargeting !== false;
136
+ const weboUserDataConfTargeting = weboUserDataConf.setPrebidTargeting !== false;
137
+
66
138
  try {
67
- const formattedProfile = profile;
68
- const r = adUnitsCodes.reduce((rp, adUnitCode) => {
139
+ const profile = getCompleteProfile(moduleParams, weboCtxConfTargeting, weboUserDataConfTargeting);
140
+
141
+ if (isEmpty(profile)) {
142
+ return {};
143
+ }
144
+
145
+ const td = adUnitsCodes.reduce((data, adUnitCode) => {
69
146
  if (adUnitCode) {
70
- rp[adUnitCode] = formattedProfile;
147
+ data[adUnitCode] = profile;
71
148
  }
72
- return rp;
149
+ return data;
73
150
  }, {});
74
- return r;
151
+
152
+ return td;
75
153
  } catch (e) {
76
154
  logError('unable to format weborama rtd targeting data', e);
77
155
  return {};
78
156
  }
79
157
  }
80
158
 
159
+ /** function that provides complete profile formatted to be used
160
+ * @param {ModuleParams} moduleParams
161
+ * @param {Boolean} weboCtxConfTargeting
162
+ * @param {Boolean} weboUserDataConfTargeting
163
+ * @returns {Object} complete profile
164
+ */
165
+ function getCompleteProfile(moduleParams, weboCtxConfTargeting, weboUserDataConfTargeting) {
166
+ const profile = {};
167
+
168
+ if (weboCtxConfTargeting) {
169
+ const contextualProfile = getContextualProfile(moduleParams.weboCtxConf || {});
170
+ mergeDeep(profile, contextualProfile);
171
+ }
172
+
173
+ if (weboUserDataConfTargeting) {
174
+ const weboUserDataProfile = getWeboUserDataProfile(moduleParams.weboUserDataConf || {});
175
+ mergeDeep(profile, weboUserDataProfile);
176
+ }
177
+
178
+ return profile;
179
+ }
180
+
181
+ /** return contextual profile
182
+ * @param {WeboCtxConf} weboCtxConf
183
+ * @returns {Object} contextual profile
184
+ */
185
+ function getContextualProfile(weboCtxConf) {
186
+ const defaultContextualProfile = weboCtxConf.defaultProfile || {};
187
+ return _weboContextualProfile || defaultContextualProfile;
188
+ }
189
+
190
+ /** return weboUserData profile
191
+ * @param {WeboUserDataConf} weboUserDataConf
192
+ * @returns {Object} weboUserData profile
193
+ */
194
+ function getWeboUserDataProfile(weboUserDataConf) {
195
+ const weboUserDataDefaultUserProfile = weboUserDataConf.defaultProfile || {};
196
+
197
+ if (storage.localStorageIsEnabled() && !_weboUserDataUserProfile) {
198
+ const localStorageProfileKey = weboUserDataConf.localStorageProfileKey || DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY;
199
+
200
+ const entry = storage.getDataFromLocalStorage(localStorageProfileKey);
201
+ if (entry) {
202
+ const data = JSON.parse(entry);
203
+ if (data && Object.keys(data).length > 0) {
204
+ _weboUserDataUserProfile = data[LOCAL_STORAGE_USER_TARGETING_SECTION];
205
+ }
206
+ }
207
+ }
208
+
209
+ return _weboUserDataUserProfile || weboUserDataDefaultUserProfile;
210
+ }
211
+
212
+ /** function that will allow RTD sub-modules to modify the AdUnit object for each auction
213
+ * @param {Object} reqBidsConfigObj
214
+ * @param {doneCallback} onDone
215
+ * @param {Object} moduleConfig
216
+ * @returns {void}
217
+ */
218
+ export function getBidRequestData(reqBidsConfigObj, onDone, moduleConfig) {
219
+ moduleConfig = moduleConfig || {};
220
+ const moduleParams = moduleConfig.params || {};
221
+ const weboCtxConf = moduleParams.weboCtxConf || {};
222
+
223
+ const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits;
224
+
225
+ if (!_weboCtxInitialized) {
226
+ handleBidRequestData(adUnits, moduleParams);
227
+
228
+ onDone();
229
+
230
+ return;
231
+ }
232
+
233
+ fetchContextualProfile(weboCtxConf, (data) => {
234
+ logMessage('fetchContextualProfile on getBidRequestData is done');
235
+
236
+ setWeboContextualProfile(data);
237
+ }, () => {
238
+ handleBidRequestData(adUnits, moduleParams);
239
+
240
+ onDone();
241
+ });
242
+ }
243
+
244
+ /** function that handles bid request data
245
+ * @param {Object[]} adUnits
246
+ * @param {ModuleParams} moduleParams
247
+ * @returns {void}
248
+ */
249
+
250
+ function handleBidRequestData(adUnits, moduleParams) {
251
+ const weboCtxConf = moduleParams.weboCtxConf || {};
252
+ const weboUserDataConf = moduleParams.weboUserDataConf || {};
253
+ const weboCtxConfTargeting = weboCtxConf.sendToBidders !== false;
254
+ const weboUserDataConfTargeting = weboUserDataConf.sendToBidders !== false;
255
+ const profile = getCompleteProfile(moduleParams, weboCtxConfTargeting, weboUserDataConfTargeting);
256
+
257
+ if (isEmpty(profile)) {
258
+ return;
259
+ }
260
+
261
+ adUnits.forEach(adUnit => {
262
+ if (adUnit.hasOwnProperty('bids')) {
263
+ adUnit.bids.forEach(bid => handleBid(adUnit, profile, bid));
264
+ }
265
+ });
266
+ }
267
+
268
+ /** @type {string} */
269
+ const SMARTADSERVER = 'smartadserver';
270
+
271
+ /** @type {Object} */
272
+ const bidderAliasRegistry = adapterManager.aliasRegistry || {};
273
+
274
+ /** handle individual bid
275
+ * @param {Object} adUnit
276
+ * @param {Object} profile
277
+ * @param {Object} bid
278
+ * @returns {void}
279
+ */
280
+ function handleBid(adUnit, profile, bid) {
281
+ const bidder = bidderAliasRegistry[bid.bidder] || bid.bidder;
282
+
283
+ logMessage('handle bidder', bidder, bid);
284
+
285
+ switch (bidder) {
286
+ case SMARTADSERVER:
287
+ handleSmartadserverBid(adUnit, profile, bid);
288
+
289
+ break;
290
+ }
291
+ }
292
+
293
+ /** handle smartadserver bid
294
+ * @param {Object} adUnit
295
+ * @param {Object} profile
296
+ * @param {Object} bid
297
+ * @returns {void}
298
+ */
299
+ function handleSmartadserverBid(adUnit, profile, bid) {
300
+ const target = [];
301
+
302
+ if (deepAccess(bid, 'params.target')) {
303
+ target.push(bid.params.target.split(';'));
304
+ }
305
+
306
+ Object.keys(profile).forEach(key => {
307
+ profile[key].forEach(value => {
308
+ const keyword = `${key}=${value}`;
309
+ if (target.indexOf(keyword) === -1) {
310
+ target.push(keyword);
311
+ }
312
+ });
313
+ });
314
+
315
+ deepSetValue(bid, 'params.target', target.join(';'));
316
+ }
317
+
81
318
  /** set bigsea contextual profile on module state
82
- * if the profile is empty, will store the default profile
83
319
  * @param {null|Object} data
84
320
  * @returns {void}
85
321
  */
86
- export function setBigseaContextualProfile(data) {
322
+ export function setWeboContextualProfile(data) {
87
323
  if (data && Object.keys(data).length > 0) {
88
- _bigseaContextualProfile = data;
324
+ _weboContextualProfile = data;
89
325
  }
90
326
  }
91
327
 
@@ -96,9 +332,9 @@ export function setBigseaContextualProfile(data) {
96
332
  */
97
333
 
98
334
  /** onDone callback type
99
- * @callback doneCallback
100
- * @returns {void}
101
- */
335
+ * @callback doneCallback
336
+ * @returns {void}
337
+ */
102
338
 
103
339
  /** Fetch Bigsea Contextual Profile
104
340
  * @param {WeboCtxConf} weboCtxConf
@@ -117,7 +353,7 @@ function fetchContextualProfile(weboCtxConf, onSuccess, onDone) {
117
353
  const url = 'https://ctx.weborama.com/api/profile?' + queryString;
118
354
 
119
355
  ajax(url, {
120
- success: function (response, req) {
356
+ success: function(response, req) {
121
357
  if (req.status === 200) {
122
358
  try {
123
359
  const data = JSON.parse(response);
@@ -126,49 +362,28 @@ function fetchContextualProfile(weboCtxConf, onSuccess, onDone) {
126
362
  } catch (e) {
127
363
  onDone();
128
364
  logError('unable to parse weborama data', e);
365
+ throw e;
129
366
  }
130
367
  } else if (req.status === 204) {
131
368
  onDone();
132
369
  }
133
370
  },
134
- error: function () {
371
+ error: function() {
135
372
  onDone();
136
373
  logError('unable to get weborama data');
137
374
  }
138
375
  },
139
- null,
140
- {
376
+ null, {
141
377
  method: 'GET',
142
378
  withCredentials: false,
143
379
  });
144
380
  }
145
381
 
146
- /** Initialize module
147
- * @param {object} moduleConfig
148
- * @return {boolean} true if module was initialized with success
149
- */
150
- function init(moduleConfig) {
151
- _bigseaContextualProfile = null;
152
-
153
- moduleConfig = moduleConfig || {};
154
- const moduleParams = moduleConfig.params || {};
155
- const weboCtxConf = moduleParams.weboCtxConf || {};
156
-
157
- if (weboCtxConf.token) {
158
- fetchContextualProfile(weboCtxConf, setBigseaContextualProfile,
159
- () => logMessage('fetchContextualProfile on init is done'));
160
- } else {
161
- logError('missing param "token" for weborama rtd module initialization');
162
- return false;
163
- }
164
-
165
- return true;
166
- }
167
-
168
382
  export const weboramaSubmodule = {
169
383
  name: SUBMODULE_NAME,
170
384
  init: init,
171
385
  getTargetingData: getTargetingData,
386
+ getBidRequestData: getBidRequestData,
172
387
  };
173
388
 
174
389
  submodule(MODULE_NAME, weboramaSubmodule);
@@ -10,8 +10,6 @@ Maintainer: prebid-support@weborama.com
10
10
 
11
11
  Weborama provides a Semantic AI Contextual API that classifies in Real-time a web page seen by a web user within generic and custom topics. It enables publishers to better monetize their inventory and unlock it to programmatic.
12
12
 
13
- ORTB2 compliant and FPD support for Prebid versions < 4.29
14
-
15
13
  Contact prebid-support@weborama.com for information.
16
14
 
17
15
  ### Publisher Usage
@@ -32,17 +30,31 @@ pbjs.setConfig(
32
30
  name: "weborama",
33
31
  waitForIt: true,
34
32
  params: {
35
- weboCtxConf: {
36
- setTargeting: true,
37
- token: "<<token provided by weborama>>",
38
- targetURL: "..." // default is document.URL
33
+ weboCtxConf: { // contextual configuration
34
+ token: "<<provided by weborama>>", // mandatory
35
+ targetURL: "...", // default is document.URL
36
+ setPrebidTargeting: true, // default
37
+ sendToBidders: true, // default
38
+ defaultProfile: { // optional, default is none
39
+ webo_ctx: ['foo'],
40
+ webo_ds: ['bar']
41
+ }
42
+ },
43
+ weboUserDataConf: { // user-centric configuration
44
+ setPrebidTargeting: true, // default
45
+ sendToBidders: true, // default
46
+ defaultProfile: { // optional, default is none
47
+ webo_cs: ['baz'],
48
+ webo_audiences: ['bam']
49
+ },
50
+ localStorageProfileKey: 'webo_wam2gam_entry' // default
39
51
  }
40
52
  }
41
53
  }
42
54
  ]
43
55
  }
44
56
  ...
45
- }
57
+ );
46
58
  ```
47
59
 
48
60
  ### Parameter Descriptions for the Weborama Configuration Section
@@ -55,15 +67,20 @@ pbjs.setConfig(
55
67
  | params.weboCtxConf | Object | Weborama Contextual Configuration | Optional |
56
68
  | params.weboCtxConf.token | String | Security Token provided by Weborama, unique per client | Mandatory |
57
69
  | params.weboCtxConf.targetURL | String | Url to be profiled in the contextual api | Optional. Defaults to `document.URL` |
70
+ | params.weboCtxConf.setPrebidTargeting|Boolean|If true, will use the contextual profile to set the prebid (GPT/GAM or AST) targeting of all adunits managed by prebid.js| Optional. Default is *true*.|
71
+ | params.weboCtxConf.sendToBidders|Boolean|If true, will send the contextual profile to all bidders (only smartadserver is supported now)| Optional. Default is *true*.|
58
72
  | params.weboCtxConf.defaultProfile | Object | default value of the profile to be used when there are no response from contextual api (such as timeout)| Optional. Default is `{}` |
59
- | params.weboCtxConf.setTargeting|Boolean|If true, will use the contextual profile to set the gam targeting of all adunits managed by prebid.js| Optional. Default is *true*.|
60
- | params.weboCtxConf.setOrtb2|Boolean|If true, will use the contextual profile to set the ortb2 configuration on `site.ext.data`| Optional. Default is *false*.|
73
+ | params.weboUserDataConf | Object | WeboUserData Configuration | Optional |
74
+ | params.weboUserDataConf.setPrebidTargeting|Boolean|If true, will use the contextual profile to set the prebid (GPT/GAM or AST) targeting of all adunits managed by prebid.js| Optional. Default is *true*.|
75
+ | params.weboUserDataConf.sendToBidders|Boolean|If true, will send the contextual profile to all bidders (only smartadserver is supported now)| Optional. Default is *true*.|
76
+ | params.weboUserDataConf.defaultProfile | Object | default value of the profile to be used when there are no response from contextual api (such as timeout)| Optional. Default is `{}` |
77
+ | params.weboUserDataConf.localStorageProfileKey| String | can be used to customize the local storage key | Optional |
61
78
 
62
79
  ### Testing
63
80
 
64
81
  To view an example of available segments returned by Weborama's backends:
65
82
 
66
- `gulp serve --modules=rtdModule,weboramaRtdProvider,appnexusBidAdapter`
83
+ `gulp serve --modules=rtdModule,weboramaRtdProvider,smartadserverBidAdapter`
67
84
 
68
85
  and then point your browser at:
69
86
 
@@ -6,7 +6,7 @@ import { Renderer } from '../src/Renderer.js';
6
6
 
7
7
  const INTEGRATION_METHOD = 'prebid.js';
8
8
  const BIDDER_CODE = 'yahoossp';
9
- const ADAPTER_VERSION = '1.0.1';
9
+ const ADAPTER_VERSION = '1.0.2';
10
10
  const PREBID_VERSION = '$prebid.version$';
11
11
  const DEFAULT_BID_TTL = 300;
12
12
  const TEST_MODE_DCN = '8a969516017a7a396ec539d97f540011';
@@ -359,6 +359,10 @@ function appendImpObject(bid, openRtbObject) {
359
359
  impObject.ext.data = bid.ortb2Imp.ext.data;
360
360
  };
361
361
 
362
+ if (deepAccess(bid, 'ortb2Imp.instl') && isNumber(bid.ortb2Imp.instl) && (bid.ortb2Imp.instl === 1)) {
363
+ impObject.instl = bid.ortb2Imp.instl;
364
+ };
365
+
362
366
  if (getPubIdMode(bid) === false) {
363
367
  impObject.tagid = bid.params.pos;
364
368
  impObject.ext.pos = bid.params.pos;
@@ -57,7 +57,7 @@ At this time, only the following partners/publishers are eligble for pubId integ
57
57
  A. Do not have any display/banner inventory.
58
58
  B. Do not have any existing accounts on Yahoo SSP (aka: aol, oneMobile, oneDisplay).
59
59
 
60
- # Mandaotory Bidder Parameters
60
+ # Mandatory Bidder Parameters
61
61
  ## dcn & pos (DEFAULT)
62
62
  The minimal requirements for the 'yahoossp' bid adapter to generate an outbound bid-request to our Yahoo SSP are:
63
63
  1. At least 1 adUnit including mediaTypes: banner or video
@@ -1,7 +1,7 @@
1
1
  import { _each, isPlainObject, isArray, deepAccess } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js'
3
3
  import find from 'core-js-pure/features/array/find.js'
4
- import { VIDEO, BANNER } from '../src/mediaTypes.js'
4
+ import { VIDEO, BANNER, NATIVE } from '../src/mediaTypes.js'
5
5
  import { Renderer } from '../src/Renderer.js'
6
6
  import { config } from '../src/config.js';
7
7
 
@@ -15,7 +15,7 @@ const GVLID = 70
15
15
  export const spec = {
16
16
  code: BIDDER_CODE,
17
17
  gvlid: GVLID,
18
- supportedMediaTypes: [VIDEO, BANNER],
18
+ supportedMediaTypes: [VIDEO, BANNER, NATIVE],
19
19
 
20
20
  isBidRequestValid: function (bid) {
21
21
  if (bid && bid.params && bid.params.adslotId && bid.params.supplyId) {
@@ -149,6 +149,27 @@ export const spec = {
149
149
  }
150
150
  }
151
151
 
152
+ if (isNative(bidRequest, adType)) {
153
+ const url = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`
154
+ bidResponse.adUrl = url
155
+ bidResponse.mediaType = NATIVE
156
+ const nativeImageAssetObj = find(matchedBid.native.assets, e => e.id === 2)
157
+ const nativeImageAsset = nativeImageAssetObj ? nativeImageAssetObj.img : {url: '', w: 0, h: 0};
158
+ const nativeTitleAsset = find(matchedBid.native.assets, e => e.id === 1)
159
+ const nativeBodyAsset = find(matchedBid.native.assets, e => e.id === 3)
160
+ bidResponse.native = {
161
+ title: nativeTitleAsset ? nativeTitleAsset.title.text : '',
162
+ body: nativeBodyAsset ? nativeBodyAsset.data.value : '',
163
+ image: {
164
+ url: nativeImageAsset.url,
165
+ width: nativeImageAsset.w,
166
+ height: nativeImageAsset.h,
167
+ },
168
+ clickUrl: matchedBid.native.link.url,
169
+ impressionTrackers: matchedBid.native.imptrackers,
170
+ };
171
+ }
172
+
152
173
  bidResponses.push(bidResponse)
153
174
  }
154
175
  })
@@ -162,16 +183,26 @@ export const spec = {
162
183
  * @param {String} adtype
163
184
  * @returns {Boolean}
164
185
  */
165
- function isVideo (format, adtype) {
186
+ function isVideo(format, adtype) {
166
187
  return deepAccess(format, 'mediaTypes.video') && adtype.toLowerCase() === 'video'
167
188
  }
168
189
 
190
+ /**
191
+ * Is this a native format?
192
+ * @param {Object} format
193
+ * @param {String} adtype
194
+ * @returns {Boolean}
195
+ */
196
+ function isNative(format, adtype) {
197
+ return deepAccess(format, 'mediaTypes.native') && adtype.toLowerCase() === 'native'
198
+ }
199
+
169
200
  /**
170
201
  * Is this an outstream context?
171
202
  * @param {Object} format
172
203
  * @returns {Boolean}
173
204
  */
174
- function isOutstream (format) {
205
+ function isOutstream(format) {
175
206
  let context = deepAccess(format, 'mediaTypes.video.context')
176
207
  return (context === 'outstream')
177
208
  }
@@ -181,7 +212,7 @@ function isOutstream (format) {
181
212
  * @param {Object} format
182
213
  * @returns {Array}
183
214
  */
184
- function getPlayerSize (format) {
215
+ function getPlayerSize(format) {
185
216
  let playerSize = deepAccess(format, 'mediaTypes.video.playerSize')
186
217
  return (playerSize && isArray(playerSize[0])) ? playerSize[0] : playerSize
187
218
  }
@@ -191,7 +222,7 @@ function getPlayerSize (format) {
191
222
  * @param {String} size
192
223
  * @returns {Array}
193
224
  */
194
- function parseSize (size) {
225
+ function parseSize(size) {
195
226
  return size.split('x').map(Number)
196
227
  }
197
228
 
@@ -200,7 +231,7 @@ function parseSize (size) {
200
231
  * @param {Array} eids
201
232
  * @returns {String}
202
233
  */
203
- function createUserIdString (eids) {
234
+ function createUserIdString(eids) {
204
235
  let str = []
205
236
  for (let i = 0; i < eids.length; i++) {
206
237
  str.push(eids[i].source + ':' + eids[i].uids[0].id)
@@ -213,7 +244,7 @@ function createUserIdString (eids) {
213
244
  * @param {Object} obj
214
245
  * @returns {String}
215
246
  */
216
- function createQueryString (obj) {
247
+ function createQueryString(obj) {
217
248
  let str = []
218
249
  for (var p in obj) {
219
250
  if (obj.hasOwnProperty(p)) {
@@ -233,7 +264,7 @@ function createQueryString (obj) {
233
264
  * @param {Object} obj
234
265
  * @returns {String}
235
266
  */
236
- function createTargetingString (obj) {
267
+ function createTargetingString(obj) {
237
268
  let str = []
238
269
  for (var p in obj) {
239
270
  if (obj.hasOwnProperty(p)) {
@@ -250,7 +281,7 @@ function createTargetingString (obj) {
250
281
  * @param {Object} schain
251
282
  * @returns {String}
252
283
  */
253
- function createSchainString (schain) {
284
+ function createSchainString(schain) {
254
285
  const ver = schain.ver || ''
255
286
  const complete = (schain.complete === 1 || schain.complete === 0) ? schain.complete : ''
256
287
  const keys = ['asi', 'sid', 'hp', 'rid', 'name', 'domain', 'ext']