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.
- package/.babelrc.js +1 -10
- package/README.md +4 -2
- package/browsers.json +13 -37
- package/gulpfile.js +1 -8
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
- package/karma.conf.maker.js +1 -1
- package/modules/33acrossBidAdapter.js +189 -102
- package/modules/adagioBidAdapter.js +1 -1
- package/modules/addefendBidAdapter.js +1 -0
- package/modules/adheseBidAdapter.js +7 -2
- package/modules/adkernelBidAdapter.js +1 -0
- package/modules/adlivetechBidAdapter.md +61 -0
- package/modules/admanBidAdapter.js +1 -0
- package/modules/admixerBidAdapter.js +3 -2
- package/modules/adnuntiusBidAdapter.js +5 -2
- package/modules/adomikAnalyticsAdapter.js +10 -4
- package/modules/adplusBidAdapter.js +203 -0
- package/modules/adplusBidAdapter.md +39 -0
- package/modules/adxcgBidAdapter.js +311 -359
- package/modules/adxcgBidAdapter.md +22 -21
- package/modules/adyoulikeBidAdapter.js +7 -2
- package/modules/appnexusBidAdapter.js +23 -3
- package/modules/beachfrontBidAdapter.js +14 -17
- package/modules/beopBidAdapter.js +5 -3
- package/modules/codefuelBidAdapter.js +1 -3
- package/modules/codefuelBidAdapter.md +3 -3
- package/modules/colossussspBidAdapter.js +7 -0
- package/modules/craftBidAdapter.js +5 -3
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/cwireBidAdapter.js +3 -0
- package/modules/datablocksBidAdapter.js +3 -3
- package/modules/dchain.js +149 -0
- package/modules/dchain.md +45 -0
- package/modules/deepintentBidAdapter.js +1 -1
- package/modules/dspxBidAdapter.js +1 -1
- package/modules/emx_digitalBidAdapter.js +9 -1
- package/modules/engageyaBidAdapter.js +68 -54
- package/modules/freewheel-sspBidAdapter.js +6 -0
- package/modules/futureads.md +48 -0
- package/modules/glimpseBidAdapter.js +44 -16
- package/modules/goldbachBidAdapter.js +1176 -0
- package/modules/goldbachBidAdapter.md +151 -0
- package/modules/gptPreAuction.js +11 -5
- package/modules/gridBidAdapter.js +1 -1
- package/modules/gumgumBidAdapter.js +7 -3
- package/modules/id5IdSystem.md +6 -6
- package/modules/imRtdProvider.js +31 -0
- package/modules/intersectionRtdProvider.js +114 -0
- package/modules/invibesBidAdapter.js +15 -9
- package/modules/ipromBidAdapter.js +79 -0
- package/modules/ixBidAdapter.js +166 -21
- package/modules/kinessoIdSystem.js +1 -1
- package/modules/limelightDigitalBidAdapter.js +2 -1
- package/modules/lotamePanoramaIdSystem.js +80 -8
- package/modules/luponmediaBidAdapter.js +570 -0
- package/modules/mediasquareBidAdapter.js +1 -9
- package/modules/merkleIdSystem.js +5 -0
- package/modules/missenaBidAdapter.js +89 -0
- package/modules/nativoBidAdapter.js +27 -1
- package/modules/nextMillenniumBidAdapter.js +29 -1
- package/modules/oguryBidAdapter.js +2 -1
- package/modules/openxBidAdapter.js +6 -1
- package/modules/prebidServerBidAdapter/index.js +19 -15
- package/modules/pubmaticBidAdapter.js +5 -3
- package/modules/relaidoBidAdapter.js +86 -65
- package/modules/richaudienceBidAdapter.js +2 -3
- package/modules/rtdModule/index.js +48 -18
- package/modules/rubiconBidAdapter.js +10 -8
- package/modules/saambaaBidAdapter.js +420 -0
- package/modules/saambaaBidAdapter.md +65 -68
- package/modules/seedtagBidAdapter.js +6 -0
- package/modules/sharedIdSystem.js +27 -1
- package/modules/smaatoBidAdapter.js +9 -1
- package/modules/smartxBidAdapter.js +17 -1
- package/modules/sspBCBidAdapter.js +34 -3
- package/modules/tappxBidAdapter.js +3 -1
- package/modules/targetVideoBidAdapter.js +187 -0
- package/modules/targetVideoBidAdapter.md +34 -0
- package/modules/trustxBidAdapter.js +10 -1
- package/modules/undertoneBidAdapter.js +8 -1
- package/modules/userId/index.js +27 -2
- package/modules/ventes.md +71 -0
- package/modules/ventesBidAdapter.js +104 -64
- package/modules/ventesBidAdapter.md +0 -1
- package/modules/vidoomyBidAdapter.js +65 -108
- package/modules/visxBidAdapter.js +20 -3
- package/modules/visxBidAdapter.md +4 -6
- package/modules/weboramaRtdProvider.js +288 -73
- package/modules/weboramaRtdProvider.md +27 -10
- package/modules/yahoosspBidAdapter.js +5 -1
- package/modules/yahoosspBidAdapter.md +1 -1
- package/modules/yieldlabBidAdapter.js +41 -10
- package/modules/yieldlabBidAdapter.md +91 -48
- package/modules/yieldoneBidAdapter.js +115 -11
- package/modules/zetaSspBidAdapter.md +33 -1
- package/modules/zeta_global_sspBidAdapter.js +22 -1
- package/package.json +6 -1
- package/plugins/pbjsGlobals.js +28 -1
- package/src/adapterManager.js +14 -8
- package/src/auction.js +3 -2
- package/src/prebid.js +1 -2
- package/src/targeting.js +24 -3
- package/src/utils.js +41 -7
- package/test/spec/integration/faker/googletag.js +6 -0
- package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
- package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
- package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
- package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
- package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
- package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
- package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
- package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
- package/test/spec/modules/dchain_spec.js +329 -0
- package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
- package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
- package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
- package/test/spec/modules/gptPreAuction_spec.js +58 -4
- package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
- package/test/spec/modules/imRtdProvider_spec.js +25 -0
- package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
- package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
- package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
- package/test/spec/modules/ixBidAdapter_spec.js +285 -2
- package/test/spec/modules/konduitWrapper_spec.js +0 -1
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
- package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
- package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
- package/test/spec/modules/merkleIdSystem_spec.js +18 -0
- package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +18 -0
- package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
- package/test/spec/modules/openxBidAdapter_spec.js +5 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
- package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
- package/test/spec/modules/realTimeDataModule_spec.js +135 -49
- package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
- package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
- package/test/spec/modules/rubiconBidAdapter_spec.js +17 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
- package/test/spec/modules/sharedIdSystem_spec.js +52 -6
- package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
- package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
- package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
- package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
- package/test/spec/modules/userId_spec.js +51 -0
- package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
- package/test/spec/modules/visxBidAdapter_spec.js +121 -5
- package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
- package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
- package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
- package/test/spec/unit/core/adapterManager_spec.js +24 -6
- package/test/spec/unit/core/targeting_spec.js +116 -0
- package/test/spec/utils_spec.js +38 -0
- 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 {?
|
|
19
|
-
* @property {?
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
62
|
+
export const DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY = 'webo_wam2gam_entry';
|
|
33
63
|
/** @type {string} */
|
|
34
|
-
const
|
|
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
|
|
71
|
+
let _weboContextualProfile = null;
|
|
38
72
|
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
86
|
+
function init(moduleConfig) {
|
|
45
87
|
moduleConfig = moduleConfig || {};
|
|
46
88
|
const moduleParams = moduleConfig.params || {};
|
|
47
89
|
const weboCtxConf = moduleParams.weboCtxConf || {};
|
|
48
|
-
const
|
|
49
|
-
const profile = _bigseaContextualProfile || defaultContextualProfiles;
|
|
90
|
+
const weboUserDataConf = moduleParams.weboUserDataConf;
|
|
50
91
|
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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
|
|
68
|
-
|
|
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
|
-
|
|
147
|
+
data[adUnitCode] = profile;
|
|
71
148
|
}
|
|
72
|
-
return
|
|
149
|
+
return data;
|
|
73
150
|
}, {});
|
|
74
|
-
|
|
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
|
|
322
|
+
export function setWeboContextualProfile(data) {
|
|
87
323
|
if (data && Object.keys(data).length > 0) {
|
|
88
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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.
|
|
60
|
-
| params.
|
|
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,
|
|
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.
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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']
|