prebid.js 7.2.0 → 7.5.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/.circleci/config.yml +11 -6
- package/.github/dependabot.yml +6 -0
- package/.github/workflows/issue_tracker.yml +5 -0
- package/.github/workflows/release-drafter.yml +6 -0
- package/README.md +35 -0
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adotBidAdapter.js +1 -1
- package/dist/adpod.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/audiencerunBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bluebillywigBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/cpexIdSystem.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/debugging-standalone.js +1 -1
- package/dist/debugging.js +1 -1
- package/dist/dianomiBidAdapter.js +1 -0
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -0
- package/dist/fpdModule.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronIdSystem.js +1 -1
- package/dist/hadronRtdProvider.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/impactifyBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoAnalyticsAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -0
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediakeysBidAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/nativoBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +137 -131
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxOrtbBidAdapter.js +1 -0
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +2 -2
- package/dist/pubCommonId.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharedIdSystem.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -0
- package/dist/sizeMappingV2.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/tncIdSystem.js +1 -0
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/ventesBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vrtcalBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldlabBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yieldoneBidAdapter.js +1 -1
- package/governance.md +5 -11
- package/gulpHelpers.js +1 -1
- package/gulpfile.js +1 -1
- package/karma.conf.maker.js +3 -1
- package/modules/.submodules.json +1 -0
- package/modules/33acrossBidAdapter.js +5 -1
- package/modules/adkernelBidAdapter.js +2 -1
- package/modules/adotBidAdapter.js +3 -3
- package/modules/adqueryBidAdapter.js +5 -1
- package/modules/appnexusBidAdapter.js +3 -3
- package/modules/cpexIdSystem.js +7 -8
- package/modules/criteoBidAdapter.js +7 -1
- package/modules/cwireBidAdapter.md +1 -1
- package/modules/debugging/bidInterceptor.js +1 -1
- package/modules/debugging/index.js +2 -1
- package/modules/dianomiBidAdapter.js +369 -0
- package/modules/dianomiBidAdapter.md +73 -0
- package/modules/finativeBidAdapter.js +235 -0
- package/modules/finativeBidAdapter.md +45 -0
- package/modules/fpdModule/index.js +6 -5
- package/modules/gdprEnforcement.js +8 -14
- package/modules/gumgumBidAdapter.js +2 -0
- package/modules/gumgumBidAdapter.md +19 -1
- package/modules/hadronAnalyticsAdapter.md +5 -5
- package/modules/hadronIdSystem.js +18 -5
- package/modules/hadronIdSystem.md +15 -11
- package/modules/hadronRtdProvider.js +14 -1
- package/modules/hadronRtdProvider.md +17 -13
- package/modules/insticatorBidAdapter.js +9 -0
- package/modules/ixBidAdapter.js +457 -57
- package/modules/ixBidAdapter.md +95 -5
- package/modules/kargoAnalyticsAdapter.js +88 -6
- package/modules/kargoAnalyticsAdapter.md +33 -0
- package/modules/kargoBidAdapter.js +1 -2
- package/modules/lassoBidAdapter.js +133 -0
- package/modules/lassoBidAdapter.md +29 -0
- package/modules/medianetBidAdapter.js +9 -5
- package/modules/missenaBidAdapter.js +20 -2
- package/modules/nativoBidAdapter.js +19 -7
- package/modules/openxBidAdapter.md +3 -1
- package/modules/openxOrtbBidAdapter.js +349 -0
- package/modules/openxOrtbBidAdapter.md +105 -0
- package/modules/pubCommonId.js +1 -2
- package/modules/readpeakBidAdapter.js +15 -6
- package/modules/relaidoBidAdapter.js +19 -4
- package/modules/riseBidAdapter.js +1 -0
- package/modules/seedtagBidAdapter.js +33 -1
- package/modules/sharedIdSystem.js +11 -5
- package/modules/sharethroughBidAdapter.js +9 -24
- package/modules/shinezBidAdapter.js +435 -0
- package/modules/shinezBidAdapter.md +76 -0
- package/modules/sonobiBidAdapter.js +28 -9
- package/modules/sovrnBidAdapter.js +16 -10
- package/modules/taboolaBidAdapter.js +1 -1
- package/modules/taboolaBidAdapter.md +3 -3
- package/modules/tncIdSystem.js +63 -0
- package/modules/tncIdSystem.md +33 -0
- package/modules/userId/eids.js +12 -0
- package/modules/userId/eids.md +7 -0
- package/modules/userId/userId.md +17 -0
- package/modules/ventesBidAdapter.js +1 -1
- package/modules/ventesBidAdapter.md +1 -1
- package/modules/vrtcalBidAdapter.js +35 -0
- package/modules/yieldlabBidAdapter.js +4 -0
- package/modules/yieldmoBidAdapter.js +20 -2
- package/modules/yieldoneBidAdapter.js +12 -1
- package/package.json +1 -1
- package/plugins/pbjsGlobals.js +2 -1
- package/src/adloader.js +1 -0
- package/src/prebid.js +4 -1
- package/src/storageManager.js +4 -5
- package/test/spec/modules/33acrossBidAdapter_spec.js +39 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +165 -156
- package/test/spec/modules/cpexIdSystem_spec.js +5 -5
- package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
- package/test/spec/modules/debugging_mod_spec.js +7 -0
- package/test/spec/modules/dianomiBidAdapter_spec.js +1223 -0
- package/test/spec/modules/eids_spec.js +26 -1
- package/test/spec/modules/finativeBidAdapter_spec.js +186 -0
- package/test/spec/modules/fpdModule_spec.js +28 -1
- package/test/spec/modules/gdprEnforcement_spec.js +53 -100
- package/test/spec/modules/gumgumBidAdapter_spec.js +5 -0
- package/test/spec/modules/hadronIdSystem_spec.js +2 -2
- package/test/spec/modules/insticatorBidAdapter_spec.js +22 -1
- package/test/spec/modules/ixBidAdapter_spec.js +429 -10
- package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
- package/test/spec/modules/kargoBidAdapter_spec.js +1 -0
- package/test/spec/modules/lassoBidAdapter_spec.js +177 -0
- package/test/spec/modules/medianetBidAdapter_spec.js +24 -1
- package/test/spec/modules/missenaBidAdapter_spec.js +36 -14
- package/test/spec/modules/nativoBidAdapter_spec.js +67 -17
- package/test/spec/modules/openxOrtbBidAdapter_spec.js +1303 -0
- package/test/spec/modules/readpeakBidAdapter_spec.js +1 -0
- package/test/spec/modules/relaidoBidAdapter_spec.js +29 -2
- package/test/spec/modules/riseBidAdapter_spec.js +3 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +4 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
- package/test/spec/modules/shinezBidAdapter_spec.js +479 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +38 -23
- package/test/spec/modules/sovrnBidAdapter_spec.js +39 -5
- package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
- package/test/spec/modules/tncIdSystem_spec.js +109 -0
- package/test/spec/modules/userId_spec.js +6 -3
- package/test/spec/modules/ventesBidAdapter_spec.js +2 -2
- package/test/spec/modules/vrtcalBidAdapter_spec.js +17 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +4 -0
- package/test/spec/modules/yieldmoBidAdapter_spec.js +15 -2
- package/test/spec/modules/yieldoneBidAdapter_spec.js +43 -2
- package/test/spec/unit/pbjs_api_spec.js +23 -0
- package/webpack.conf.js +1 -1
package/modules/ixBidAdapter.js
CHANGED
|
@@ -17,12 +17,12 @@ import {
|
|
|
17
17
|
parseGPTSingleSizeArray,
|
|
18
18
|
parseQueryStringParameters
|
|
19
19
|
} from '../src/utils.js';
|
|
20
|
-
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
20
|
+
import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
|
|
21
21
|
import {config} from '../src/config.js';
|
|
22
22
|
import CONSTANTS from '../src/constants.json';
|
|
23
23
|
import {getStorageManager, validateStorageEnforcement} from '../src/storageManager.js';
|
|
24
24
|
import * as events from '../src/events.js';
|
|
25
|
-
import {find
|
|
25
|
+
import {find} from '../src/polyfill.js';
|
|
26
26
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
27
27
|
import {INSTREAM, OUTSTREAM} from '../src/video.js';
|
|
28
28
|
import {Renderer} from '../src/Renderer.js';
|
|
@@ -30,14 +30,14 @@ import {Renderer} from '../src/Renderer.js';
|
|
|
30
30
|
const BIDDER_CODE = 'ix';
|
|
31
31
|
const ALIAS_BIDDER_CODE = 'roundel';
|
|
32
32
|
const GLOBAL_VENDOR_ID = 10;
|
|
33
|
-
const MODULE_TYPE = 'bid-adapter';
|
|
34
33
|
const SECURE_BID_URL = 'https://htlb.casalemedia.com/openrtb/pbjs';
|
|
35
|
-
const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
|
|
34
|
+
const SUPPORTED_AD_TYPES = [BANNER, VIDEO, NATIVE];
|
|
36
35
|
const BANNER_ENDPOINT_VERSION = 7.2;
|
|
37
36
|
const VIDEO_ENDPOINT_VERSION = 8.1;
|
|
38
37
|
const CENT_TO_DOLLAR_FACTOR = 100;
|
|
39
38
|
const BANNER_TIME_TO_LIVE = 300;
|
|
40
39
|
const VIDEO_TIME_TO_LIVE = 3600; // 1hr
|
|
40
|
+
const NATIVE_TIME_TO_LIVE = 3600; // Since native can have video, use ttl same as video
|
|
41
41
|
const NET_REVENUE = true;
|
|
42
42
|
const MAX_REQUEST_SIZE = 8000;
|
|
43
43
|
const MAX_REQUEST_LIMIT = 4;
|
|
@@ -45,9 +45,9 @@ const OUTSTREAM_MINIMUM_PLAYER_SIZE = [144, 144];
|
|
|
45
45
|
const PRICE_TO_DOLLAR_FACTOR = {
|
|
46
46
|
JPY: 1
|
|
47
47
|
};
|
|
48
|
-
const
|
|
49
|
-
|
|
48
|
+
const IFRAME_USER_SYNC_URL = 'https://js-sec.indexww.com/um/ixmatch.html';
|
|
50
49
|
const FLOOR_SOURCE = { PBJS: 'p', IX: 'x' };
|
|
50
|
+
const IMG_USER_SYNC_URL = 'https://dsum.casalemedia.com/pbusermatch?origin=prebid'
|
|
51
51
|
export const ERROR_CODES = {
|
|
52
52
|
BID_SIZE_INVALID_FORMAT: 1,
|
|
53
53
|
BID_SIZE_NOT_INCLUDED: 2,
|
|
@@ -100,9 +100,99 @@ const VIDEO_PARAMS_ALLOW_LIST = [
|
|
|
100
100
|
'delivery', 'pos', 'companionad', 'api', 'companiontype', 'ext',
|
|
101
101
|
'playerSize', 'w', 'h'
|
|
102
102
|
];
|
|
103
|
+
const NATIVE_ASSET_TYPES = {
|
|
104
|
+
TITLE: 100,
|
|
105
|
+
IMG: 200,
|
|
106
|
+
VIDEO: 300,
|
|
107
|
+
DATA: 400
|
|
108
|
+
};
|
|
109
|
+
const NATIVE_IMAGE_TYPES = {
|
|
110
|
+
ICON: 1,
|
|
111
|
+
MAIN: 3
|
|
112
|
+
};
|
|
113
|
+
const NATIVE_DATA_TYPES = {
|
|
114
|
+
SPONSORED: 1,
|
|
115
|
+
DESC: 2,
|
|
116
|
+
RATING: 3,
|
|
117
|
+
LIKES: 4,
|
|
118
|
+
DOWNLOADS: 5,
|
|
119
|
+
PRICE: 6,
|
|
120
|
+
SALEPRICE: 7,
|
|
121
|
+
PHONE: 8,
|
|
122
|
+
ADDRESS: 9,
|
|
123
|
+
DESC2: 10,
|
|
124
|
+
DISPLAYURL: 11,
|
|
125
|
+
CTATEXT: 12
|
|
126
|
+
};
|
|
127
|
+
const NATIVE_DATA_MAP = {
|
|
128
|
+
[NATIVE_DATA_TYPES.SPONSORED]: 'sponsoredBy',
|
|
129
|
+
[NATIVE_DATA_TYPES.DESC]: 'body',
|
|
130
|
+
[NATIVE_DATA_TYPES.RATING]: 'rating',
|
|
131
|
+
[NATIVE_DATA_TYPES.LIKES]: 'likes',
|
|
132
|
+
[NATIVE_DATA_TYPES.DOWNLOADS]: 'downloads',
|
|
133
|
+
[NATIVE_DATA_TYPES.PRICE]: 'price',
|
|
134
|
+
[NATIVE_DATA_TYPES.SALEPRICE]: 'salePrice',
|
|
135
|
+
[NATIVE_DATA_TYPES.PHONE]: 'phone',
|
|
136
|
+
[NATIVE_DATA_TYPES.ADDRESS]: 'address',
|
|
137
|
+
[NATIVE_DATA_TYPES.DESC2]: 'body2',
|
|
138
|
+
[NATIVE_DATA_TYPES.DISPLAYURL]: 'displayUrl',
|
|
139
|
+
[NATIVE_DATA_TYPES.CTATEXT]: 'cta'
|
|
140
|
+
};
|
|
141
|
+
const NATIVE_ASSETS_MAP = {
|
|
142
|
+
'title': { assetType: NATIVE_ASSET_TYPES.TITLE },
|
|
143
|
+
'icon': { assetType: NATIVE_ASSET_TYPES.IMG, subtype: NATIVE_IMAGE_TYPES.ICON },
|
|
144
|
+
'image': { assetType: NATIVE_ASSET_TYPES.IMG, subtype: NATIVE_IMAGE_TYPES.MAIN },
|
|
145
|
+
'sponsoredBy': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.SPONSORED },
|
|
146
|
+
'body': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.DESC },
|
|
147
|
+
'rating': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.RATING },
|
|
148
|
+
'likes': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.LIKES },
|
|
149
|
+
'downloads': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.DOWNLOADS },
|
|
150
|
+
'price': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.PRICE },
|
|
151
|
+
'salePrice': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.SALEPRICE },
|
|
152
|
+
'phone': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.PHONE },
|
|
153
|
+
'address': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.ADDRESS },
|
|
154
|
+
'body2': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.DESC2 },
|
|
155
|
+
'displayUrl': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.DISPLAYURL },
|
|
156
|
+
'cta': { assetType: NATIVE_ASSET_TYPES.DATA, subtype: NATIVE_DATA_TYPES.CTATEXT },
|
|
157
|
+
'video': { assetType: NATIVE_ASSET_TYPES.VIDEO }
|
|
158
|
+
};
|
|
159
|
+
const NATIVE_ALLOWED_PROPERTIES = [
|
|
160
|
+
'rendererUrl',
|
|
161
|
+
'sendTargetingKeys',
|
|
162
|
+
'adTemplate',
|
|
163
|
+
'type',
|
|
164
|
+
'ext',
|
|
165
|
+
'privacyLink',
|
|
166
|
+
'clickUrl',
|
|
167
|
+
'privacyIcon'
|
|
168
|
+
];
|
|
169
|
+
const NATIVE_ASSET_DEFAULT = {
|
|
170
|
+
TITLE: {
|
|
171
|
+
LEN: 25
|
|
172
|
+
},
|
|
173
|
+
VIDEO: {
|
|
174
|
+
MIMES: [
|
|
175
|
+
'video/mp4',
|
|
176
|
+
'video/webm'
|
|
177
|
+
],
|
|
178
|
+
MINDURATION: 0,
|
|
179
|
+
MAXDURATION: 120,
|
|
180
|
+
PROTOCOLS: [2, 3, 5, 6],
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
const NATIVE_EVENT_TYPES = {
|
|
184
|
+
IMRESSION: 1
|
|
185
|
+
};
|
|
186
|
+
const NATIVE_EVENT_TRACKING_METHOD = {
|
|
187
|
+
IMG: 1,
|
|
188
|
+
JS: 2
|
|
189
|
+
};
|
|
103
190
|
const LOCAL_STORAGE_KEY = 'ixdiag';
|
|
104
191
|
let hasRegisteredHandler = false;
|
|
105
192
|
export const storage = getStorageManager({gvlid: GLOBAL_VENDOR_ID, bidderCode: BIDDER_CODE});
|
|
193
|
+
let siteID = 0;
|
|
194
|
+
let gdprConsent = '';
|
|
195
|
+
let usPrivacy = '';
|
|
106
196
|
|
|
107
197
|
// Possible values for bidResponse.seatBid[].bid[].mtype which indicates the type of the creative markup so that it can properly be associated with the right sub-object of the BidRequest.Imp.
|
|
108
198
|
const MEDIA_TYPES = {
|
|
@@ -110,7 +200,7 @@ const MEDIA_TYPES = {
|
|
|
110
200
|
Video: 2,
|
|
111
201
|
Audio: 3,
|
|
112
202
|
Native: 4
|
|
113
|
-
}
|
|
203
|
+
};
|
|
114
204
|
|
|
115
205
|
/**
|
|
116
206
|
* Transform valid bid request config object to banner impression object that will be sent to ad server.
|
|
@@ -197,7 +287,7 @@ function bidToVideoImp(bid) {
|
|
|
197
287
|
imp.ext.sid = parseGPTSingleSizeArray(impSize);
|
|
198
288
|
}
|
|
199
289
|
} else {
|
|
200
|
-
logWarn('IX Bid Adapter: Video size is missing in [mediaTypes.video]
|
|
290
|
+
logWarn('IX Bid Adapter: Video size is missing in [mediaTypes.video]');
|
|
201
291
|
return {};
|
|
202
292
|
}
|
|
203
293
|
}
|
|
@@ -207,6 +297,143 @@ function bidToVideoImp(bid) {
|
|
|
207
297
|
return imp;
|
|
208
298
|
}
|
|
209
299
|
|
|
300
|
+
/**
|
|
301
|
+
* Transform valid bid request config object to native impression object that will be sent to ad server.
|
|
302
|
+
*
|
|
303
|
+
* @param {object} bid A valid bid request config object.
|
|
304
|
+
* @return {object} A impression object that will be sent to ad server.
|
|
305
|
+
*/
|
|
306
|
+
function bidToNativeImp(bid) {
|
|
307
|
+
const imp = bidToImp(bid);
|
|
308
|
+
const nativeAdUnitRef = deepAccess(bid, 'mediaTypes.native');
|
|
309
|
+
|
|
310
|
+
const assets = []
|
|
311
|
+
|
|
312
|
+
// Convert all native assets to imp object
|
|
313
|
+
for (const [adUnitProperty, adUnitValues] of Object.entries(nativeAdUnitRef)) {
|
|
314
|
+
if (!NATIVE_ASSETS_MAP[adUnitProperty]) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const { assetType, subtype } = NATIVE_ASSETS_MAP[adUnitProperty];
|
|
319
|
+
let asset;
|
|
320
|
+
switch (assetType) {
|
|
321
|
+
case NATIVE_ASSET_TYPES.TITLE:
|
|
322
|
+
asset = createNativeTitleRequest(adUnitValues);
|
|
323
|
+
break;
|
|
324
|
+
case NATIVE_ASSET_TYPES.IMG:
|
|
325
|
+
asset = createNativeImgRequest(adUnitValues, subtype);
|
|
326
|
+
break;
|
|
327
|
+
case NATIVE_ASSET_TYPES.VIDEO:
|
|
328
|
+
asset = createNativeVideoRequest(adUnitValues);
|
|
329
|
+
break;
|
|
330
|
+
case NATIVE_ASSET_TYPES.DATA:
|
|
331
|
+
asset = createNativeDataRequest(adUnitValues, subtype);
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
asset.id = assetType + (subtype || 0);
|
|
335
|
+
assets.push(asset);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (assets.length === 0) {
|
|
339
|
+
logWarn('IX Bid Adapter: Native bid does not contain recognised assets in [mediaTypes.native]');
|
|
340
|
+
return {};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const request = {
|
|
344
|
+
assets: assets,
|
|
345
|
+
ver: '1.2',
|
|
346
|
+
eventtrackers: [{
|
|
347
|
+
event: 1,
|
|
348
|
+
methods: [1, 2]
|
|
349
|
+
}],
|
|
350
|
+
privacy: 1
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
imp.native = {
|
|
354
|
+
request: JSON.stringify(request),
|
|
355
|
+
ver: '1.2'
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
_applyFloor(bid, imp, NATIVE);
|
|
359
|
+
|
|
360
|
+
return imp;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Converts native bid asset to a native impression asset
|
|
365
|
+
* @param {object} bidAsset PBJS bid asset object
|
|
366
|
+
* @returns {object} IX impression asset object
|
|
367
|
+
*/
|
|
368
|
+
function createNativeTitleRequest(bidAsset) {
|
|
369
|
+
return {
|
|
370
|
+
required: bidAsset.required ? 1 : 0,
|
|
371
|
+
title: {
|
|
372
|
+
len: bidAsset.len ? bidAsset.len : NATIVE_ASSET_DEFAULT.TITLE.LEN,
|
|
373
|
+
ext: bidAsset.ext
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Converts native bid asset to a native impression asset
|
|
380
|
+
* @param {object} bidAsset PBJS bid asset object
|
|
381
|
+
* @param {int} type The image type
|
|
382
|
+
* @returns {object} IX impression asset object
|
|
383
|
+
*/
|
|
384
|
+
function createNativeImgRequest(bidAsset, type) {
|
|
385
|
+
let asset = {
|
|
386
|
+
required: bidAsset.required ? 1 : 0,
|
|
387
|
+
img: {
|
|
388
|
+
type: type,
|
|
389
|
+
mimes: bidAsset.mimes,
|
|
390
|
+
ext: bidAsset.ext
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (bidAsset.hasOwnProperty('sizes') && bidAsset.sizes.length === 2) {
|
|
395
|
+
asset.img.wmin = bidAsset.sizes[0];
|
|
396
|
+
asset.img.hmin = bidAsset.sizes[1];
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return asset
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Converts native bid asset to a native impression asset
|
|
404
|
+
* @param {object} bidAsset PBJS bid asset object
|
|
405
|
+
* @returns {object} IX impression asset object
|
|
406
|
+
*/
|
|
407
|
+
function createNativeVideoRequest(bidAsset) {
|
|
408
|
+
return {
|
|
409
|
+
required: bidAsset.required ? 1 : 0,
|
|
410
|
+
video: {
|
|
411
|
+
mimes: bidAsset.mimes ? bidAsset.mimes : NATIVE_ASSET_DEFAULT.VIDEO.MIMES,
|
|
412
|
+
minduration: bidAsset.minduration ? bidAsset.minduration : NATIVE_ASSET_DEFAULT.VIDEO.MINDURATION,
|
|
413
|
+
maxduration: bidAsset.maxduration ? bidAsset.maxduration : NATIVE_ASSET_DEFAULT.VIDEO.MAXDURATION,
|
|
414
|
+
protocols: bidAsset.protocols ? bidAsset.protocols : NATIVE_ASSET_DEFAULT.VIDEO.PROTOCOLS,
|
|
415
|
+
ext: bidAsset.ext
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Converts native bid asset to a native impression asset
|
|
422
|
+
* @param {object} bidAsset PBJS bid asset object
|
|
423
|
+
* @param {int} type The image type
|
|
424
|
+
* @returns {object} IX impression asset object
|
|
425
|
+
*/
|
|
426
|
+
function createNativeDataRequest(bidAsset, type) {
|
|
427
|
+
return {
|
|
428
|
+
required: bidAsset.required ? 1 : 0,
|
|
429
|
+
data: {
|
|
430
|
+
type: type,
|
|
431
|
+
len: bidAsset.len,
|
|
432
|
+
ext: bidAsset.ext
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
210
437
|
/**
|
|
211
438
|
* Converts an incoming PBJS bid to an IX Impression
|
|
212
439
|
* @param {object} bid PBJS bid object
|
|
@@ -309,6 +536,16 @@ function parseBid(rawBid, currency, bidRequest) {
|
|
|
309
536
|
bid.vastUrl = rawBid.ext.vasturl
|
|
310
537
|
}
|
|
311
538
|
|
|
539
|
+
let parsedAdm = null;
|
|
540
|
+
// Detect whether the adm is (probably) JSON
|
|
541
|
+
if (typeof rawBid.adm === 'string' && rawBid.adm[0] === '{' && rawBid.adm[rawBid.adm.length - 1] === '}') {
|
|
542
|
+
try {
|
|
543
|
+
parsedAdm = JSON.parse(rawBid.adm);
|
|
544
|
+
} catch (err) {
|
|
545
|
+
logWarn('adm looks like JSON but failed to parse: ', err);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
312
549
|
// in the event of a video
|
|
313
550
|
if ((rawBid.ext && rawBid.ext.vasturl) || rawBid.mtype == MEDIA_TYPES.Video) {
|
|
314
551
|
bid.width = bidRequest.video.w;
|
|
@@ -316,6 +553,12 @@ function parseBid(rawBid, currency, bidRequest) {
|
|
|
316
553
|
bid.mediaType = VIDEO;
|
|
317
554
|
bid.mediaTypes = bidRequest.mediaTypes;
|
|
318
555
|
bid.ttl = isValidExpiry ? rawBid.exp : VIDEO_TIME_TO_LIVE;
|
|
556
|
+
} else if (parsedAdm && parsedAdm.native) {
|
|
557
|
+
bid.native = interpretNativeAdm(parsedAdm.native)
|
|
558
|
+
bid.width = rawBid.w ? rawBid.w : 1;
|
|
559
|
+
bid.height = rawBid.h ? rawBid.h : 1;
|
|
560
|
+
bid.mediaType = NATIVE;
|
|
561
|
+
bid.ttl = isValidExpiry ? rawBid.exp : NATIVE_TIME_TO_LIVE;
|
|
319
562
|
} else {
|
|
320
563
|
bid.ad = rawBid.adm;
|
|
321
564
|
bid.width = rawBid.w;
|
|
@@ -335,6 +578,84 @@ function parseBid(rawBid, currency, bidRequest) {
|
|
|
335
578
|
return bid;
|
|
336
579
|
}
|
|
337
580
|
|
|
581
|
+
/**
|
|
582
|
+
* Parse native adm and set native asset key names recognized by Prebid.js
|
|
583
|
+
* @param {string} adm Native adm complience
|
|
584
|
+
*/
|
|
585
|
+
function interpretNativeAdm(nativeResponse) {
|
|
586
|
+
const native = {
|
|
587
|
+
clickUrl: nativeResponse.link.url,
|
|
588
|
+
privacyLink: nativeResponse.privacy
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
for (const asset of nativeResponse.assets) {
|
|
592
|
+
const subtype = asset.id % 100;
|
|
593
|
+
const assetType = asset.id - subtype;
|
|
594
|
+
|
|
595
|
+
switch (assetType) {
|
|
596
|
+
case NATIVE_ASSET_TYPES.TITLE:
|
|
597
|
+
native.title = asset.title && asset.title.text;
|
|
598
|
+
break;
|
|
599
|
+
case NATIVE_ASSET_TYPES.IMG:
|
|
600
|
+
const image = {
|
|
601
|
+
url: asset.img && asset.img.url,
|
|
602
|
+
height: asset.img && asset.img.h,
|
|
603
|
+
width: asset.img && asset.img.w
|
|
604
|
+
};
|
|
605
|
+
native[subtype === NATIVE_IMAGE_TYPES.ICON ? 'icon' : 'image'] = image;
|
|
606
|
+
break;
|
|
607
|
+
case NATIVE_ASSET_TYPES.VIDEO:
|
|
608
|
+
native.video = asset.video && asset.video.vasttag;
|
|
609
|
+
break;
|
|
610
|
+
case NATIVE_ASSET_TYPES.DATA:
|
|
611
|
+
setDataAsset(native, asset, subtype);
|
|
612
|
+
break;
|
|
613
|
+
default:
|
|
614
|
+
logWarn(`IX Bid Adapter: native asset ID ${asset.id} could not be recognized`);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
setTrackers(native, nativeResponse);
|
|
619
|
+
return native;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
function setDataAsset(native, asset, type) {
|
|
623
|
+
if (!(type in NATIVE_DATA_MAP)) {
|
|
624
|
+
logWarn(`IX Bid Adapter: native data asset type ${type} is not supported`);
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
native[NATIVE_DATA_MAP[type]] = asset.data && asset.data.value;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
function setTrackers(native, nativeResponse) {
|
|
631
|
+
native.impressionTrackers = []
|
|
632
|
+
|
|
633
|
+
if (Array.isArray(nativeResponse.imptrackers)) {
|
|
634
|
+
native.impressionTrackers.push(...nativeResponse.imptrackers)
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
if (Array.isArray(nativeResponse.link.clicktrackers)) {
|
|
638
|
+
native.impressionTrackers.push(...nativeResponse.link.clicktrackers)
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
if (Array.isArray(nativeResponse.eventtrackers)) {
|
|
642
|
+
nativeResponse.eventtrackers.forEach(tracker => {
|
|
643
|
+
if (tracker.event !== NATIVE_EVENT_TYPES.IMRESSION) {
|
|
644
|
+
return
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
switch (tracker.method) {
|
|
648
|
+
case NATIVE_EVENT_TRACKING_METHOD.IMG:
|
|
649
|
+
native.impressionTrackers.push(tracker.url);
|
|
650
|
+
break;
|
|
651
|
+
case NATIVE_EVENT_TRACKING_METHOD.JS:
|
|
652
|
+
native.javascriptTrackers = `<script src=\"${tracker.url}\"></script>`;
|
|
653
|
+
break;
|
|
654
|
+
}
|
|
655
|
+
})
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
338
659
|
/**
|
|
339
660
|
* Determines whether or not the given object is valid size format.
|
|
340
661
|
*
|
|
@@ -432,6 +753,27 @@ function isValidBidFloorParams(bidFloor, bidFloorCur) {
|
|
|
432
753
|
bidFloorCur.match(curRegex));
|
|
433
754
|
}
|
|
434
755
|
|
|
756
|
+
function nativeMediaTypeValid(nativeObj) {
|
|
757
|
+
if (nativeObj === undefined) {
|
|
758
|
+
return true;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
let hasValidAsset = false;
|
|
762
|
+
|
|
763
|
+
for (const property in nativeObj) {
|
|
764
|
+
if (!(property in NATIVE_ASSETS_MAP) && !NATIVE_ALLOWED_PROPERTIES.includes(property)) {
|
|
765
|
+
logError('IX Bid Adapter: native', { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
|
|
766
|
+
return false;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
if (property in NATIVE_ASSETS_MAP) {
|
|
770
|
+
hasValidAsset = true;
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
return hasValidAsset;
|
|
775
|
+
}
|
|
776
|
+
|
|
435
777
|
/**
|
|
436
778
|
* Get bid request object with the associated id.
|
|
437
779
|
*
|
|
@@ -485,7 +827,7 @@ function getEidInfo(allEids) {
|
|
|
485
827
|
* @param {array} validBidRequests A list of valid bid request config objects.
|
|
486
828
|
* @param {object} bidderRequest An object containing other info like gdprConsent.
|
|
487
829
|
* @param {object} impressions An object containing a list of impression objects describing the bids for each transactionId
|
|
488
|
-
* @param {array} version Endpoint version denoting banner or
|
|
830
|
+
* @param {array} version Endpoint version denoting banner, video or native.
|
|
489
831
|
* @return {array} List of objects describing the request to the server.
|
|
490
832
|
*
|
|
491
833
|
*/
|
|
@@ -542,6 +884,11 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
542
884
|
if (tmax) {
|
|
543
885
|
r.ext.ixdiag.tmax = tmax
|
|
544
886
|
}
|
|
887
|
+
|
|
888
|
+
if (config.getConfig('userSync')) {
|
|
889
|
+
r.ext.ixdiag.syncsPerBidder = config.getConfig('userSync').syncsPerBidder;
|
|
890
|
+
}
|
|
891
|
+
|
|
545
892
|
// Get cached errors stored in LocalStorage
|
|
546
893
|
const cachedErrors = getCachedErrors();
|
|
547
894
|
|
|
@@ -570,7 +917,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
570
917
|
// Apply GDPR information to the request if GDPR is enabled.
|
|
571
918
|
if (bidderRequest) {
|
|
572
919
|
if (bidderRequest.gdprConsent) {
|
|
573
|
-
|
|
920
|
+
gdprConsent = bidderRequest.gdprConsent;
|
|
574
921
|
|
|
575
922
|
if (gdprConsent.hasOwnProperty('gdprApplies')) {
|
|
576
923
|
r.regs = {
|
|
@@ -596,6 +943,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
596
943
|
|
|
597
944
|
if (bidderRequest.uspConsent) {
|
|
598
945
|
deepSetValue(r, 'regs.ext.us_privacy', bidderRequest.uspConsent);
|
|
946
|
+
usPrivacy = bidderRequest.uspConsent;
|
|
599
947
|
}
|
|
600
948
|
|
|
601
949
|
if (pageUrl) {
|
|
@@ -609,8 +957,12 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
609
957
|
|
|
610
958
|
const payload = {};
|
|
611
959
|
// Use the siteId in the first bid request as the main siteId.
|
|
612
|
-
|
|
960
|
+
siteID = validBidRequests[0].params.siteId;
|
|
961
|
+
payload.s = siteID;
|
|
613
962
|
payload.v = version;
|
|
963
|
+
if (version) {
|
|
964
|
+
payload.v = version;
|
|
965
|
+
}
|
|
614
966
|
payload.ac = 'j';
|
|
615
967
|
payload.sd = 1;
|
|
616
968
|
|
|
@@ -892,6 +1244,22 @@ function removeFromSizes(bannerSizeList, bannerSize) {
|
|
|
892
1244
|
}
|
|
893
1245
|
}
|
|
894
1246
|
|
|
1247
|
+
/**
|
|
1248
|
+
* Creates IX Native impressions based on validBidRequests
|
|
1249
|
+
* @param {object} validBidRequest valid request provided by prebid
|
|
1250
|
+
* @param {object} nativeImps reference to created native impressions
|
|
1251
|
+
*/
|
|
1252
|
+
function createNativeImps(validBidRequest, nativeImps) {
|
|
1253
|
+
const imp = bidToNativeImp(validBidRequest);
|
|
1254
|
+
|
|
1255
|
+
if (Object.keys(imp).length != 0) {
|
|
1256
|
+
nativeImps[validBidRequest.transactionId] = {};
|
|
1257
|
+
nativeImps[validBidRequest.transactionId].ixImps = [];
|
|
1258
|
+
nativeImps[validBidRequest.transactionId].ixImps.push(imp);
|
|
1259
|
+
nativeImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid')
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
|
|
895
1263
|
/**
|
|
896
1264
|
* Creates IX Video impressions based on validBidRequests
|
|
897
1265
|
* @param {object} validBidRequest valid request provided by prebid
|
|
@@ -944,19 +1312,6 @@ function createBannerImps(validBidRequest, missingBannerSizes, bannerImps) {
|
|
|
944
1312
|
}
|
|
945
1313
|
}
|
|
946
1314
|
|
|
947
|
-
/**
|
|
948
|
-
* Determines IX configuration type based on IX params
|
|
949
|
-
* @param {object} valid IX configured param
|
|
950
|
-
* @returns {string}
|
|
951
|
-
*/
|
|
952
|
-
function detectParamsType(validBidRequest) {
|
|
953
|
-
if (deepAccess(validBidRequest, 'mediaTypes.video') && bidToVideoImp(validBidRequest).video) {
|
|
954
|
-
return VIDEO;
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
return BANNER;
|
|
958
|
-
}
|
|
959
|
-
|
|
960
1315
|
/**
|
|
961
1316
|
* Updates the Object to track missing banner sizes.
|
|
962
1317
|
*
|
|
@@ -1069,7 +1424,7 @@ function localStorageHandler(data) {
|
|
|
1069
1424
|
hasEnforcementHook: false,
|
|
1070
1425
|
valid: hasDeviceAccess()
|
|
1071
1426
|
};
|
|
1072
|
-
validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE,
|
|
1427
|
+
validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
|
|
1073
1428
|
if (permissions.valid) {
|
|
1074
1429
|
storeErrorEventData(data);
|
|
1075
1430
|
}
|
|
@@ -1170,6 +1525,7 @@ function isIndexRendererPreferred(bid) {
|
|
|
1170
1525
|
}
|
|
1171
1526
|
|
|
1172
1527
|
const isValid = !!(typeof (renderer) === 'object' && renderer.url && renderer.render);
|
|
1528
|
+
|
|
1173
1529
|
// if renderer on the adunit is not valid or it's only a backup, our renderer may be used
|
|
1174
1530
|
return !isValid || renderer.backupOnly;
|
|
1175
1531
|
}
|
|
@@ -1202,6 +1558,7 @@ export const spec = {
|
|
|
1202
1558
|
const paramsSize = deepAccess(bid, 'params.size');
|
|
1203
1559
|
const mediaTypeBannerSizes = deepAccess(bid, 'mediaTypes.banner.sizes');
|
|
1204
1560
|
const mediaTypeVideoRef = deepAccess(bid, 'mediaTypes.video');
|
|
1561
|
+
const mediaTypeNativeRef = deepAccess(bid, 'mediaTypes.native');
|
|
1205
1562
|
const mediaTypeVideoPlayerSize = deepAccess(bid, 'mediaTypes.video.playerSize');
|
|
1206
1563
|
const hasBidFloor = bid.params.hasOwnProperty('bidFloor');
|
|
1207
1564
|
const hasBidFloorCur = bid.params.hasOwnProperty('bidFloorCur');
|
|
@@ -1268,7 +1625,7 @@ export const spec = {
|
|
|
1268
1625
|
}
|
|
1269
1626
|
}
|
|
1270
1627
|
|
|
1271
|
-
return
|
|
1628
|
+
return nativeMediaTypeValid(mediaTypeNativeRef);
|
|
1272
1629
|
},
|
|
1273
1630
|
|
|
1274
1631
|
/**
|
|
@@ -1282,41 +1639,32 @@ export const spec = {
|
|
|
1282
1639
|
const reqs = []; // Stores banner + video requests
|
|
1283
1640
|
const bannerImps = {}; // Stores created banner impressions
|
|
1284
1641
|
const videoImps = {}; // Stores created video impressions
|
|
1285
|
-
const
|
|
1642
|
+
const nativeImps = {}; // Stores created native impressions
|
|
1286
1643
|
const missingBannerSizes = {}; // To capture the missing sizes i.e not configured for ix
|
|
1287
1644
|
|
|
1288
1645
|
// Step 1: Create impresssions from IX params
|
|
1289
1646
|
validBidRequests.forEach((validBidRequest) => {
|
|
1290
1647
|
const adUnitMediaTypes = Object.keys(deepAccess(validBidRequest, 'mediaTypes', {}))
|
|
1291
1648
|
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
// Step 2: Create impressions for multi-format adunits missing configurations
|
|
1307
|
-
Object.keys(multiFormatAdUnits).forEach((transactionId) => {
|
|
1308
|
-
const validBidRequest = multiFormatAdUnits[transactionId];
|
|
1309
|
-
if (!bannerImps[transactionId]) {
|
|
1310
|
-
createBannerImps(validBidRequest, missingBannerSizes, bannerImps);
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
if (!videoImps[transactionId]) {
|
|
1314
|
-
createVideoImps(validBidRequest, videoImps)
|
|
1649
|
+
for (const type in adUnitMediaTypes) {
|
|
1650
|
+
switch (adUnitMediaTypes[type]) {
|
|
1651
|
+
case BANNER:
|
|
1652
|
+
createBannerImps(validBidRequest, missingBannerSizes, bannerImps);
|
|
1653
|
+
break;
|
|
1654
|
+
case VIDEO:
|
|
1655
|
+
createVideoImps(validBidRequest, videoImps)
|
|
1656
|
+
break;
|
|
1657
|
+
case NATIVE:
|
|
1658
|
+
createNativeImps(validBidRequest, nativeImps)
|
|
1659
|
+
break;
|
|
1660
|
+
default:
|
|
1661
|
+
logWarn(`IX Bid Adapter: ad unit mediaTypes ${type} is not supported`)
|
|
1662
|
+
}
|
|
1315
1663
|
}
|
|
1316
1664
|
});
|
|
1317
1665
|
|
|
1318
|
-
// Step
|
|
1319
|
-
for (
|
|
1666
|
+
// Step 2: Update banner impressions with missing sizes
|
|
1667
|
+
for (let transactionId in missingBannerSizes) {
|
|
1320
1668
|
if (missingBannerSizes.hasOwnProperty(transactionId)) {
|
|
1321
1669
|
let missingSizes = missingBannerSizes[transactionId].missingSizes;
|
|
1322
1670
|
|
|
@@ -1337,13 +1685,16 @@ export const spec = {
|
|
|
1337
1685
|
}
|
|
1338
1686
|
}
|
|
1339
1687
|
|
|
1340
|
-
// Step 4: Build banner &
|
|
1688
|
+
// Step 4: Build banner, video & native requests
|
|
1341
1689
|
if (Object.keys(bannerImps).length > 0) {
|
|
1342
1690
|
reqs.push(...buildRequest(validBidRequests, bidderRequest, bannerImps, BANNER_ENDPOINT_VERSION));
|
|
1343
1691
|
}
|
|
1344
1692
|
if (Object.keys(videoImps).length > 0) {
|
|
1345
1693
|
reqs.push(...buildRequest(validBidRequests, bidderRequest, videoImps, VIDEO_ENDPOINT_VERSION));
|
|
1346
1694
|
}
|
|
1695
|
+
if (Object.keys(nativeImps).length > 0) {
|
|
1696
|
+
reqs.push(...buildRequest(validBidRequests, bidderRequest, nativeImps));
|
|
1697
|
+
}
|
|
1347
1698
|
|
|
1348
1699
|
return reqs;
|
|
1349
1700
|
},
|
|
@@ -1422,11 +1773,60 @@ export const spec = {
|
|
|
1422
1773
|
* @returns {array} User sync pixels
|
|
1423
1774
|
*/
|
|
1424
1775
|
getUserSyncs: function (syncOptions, serverResponses) {
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1776
|
+
const syncs = [];
|
|
1777
|
+
let publisherSyncsPerBidderOverride = null;
|
|
1778
|
+
if (serverResponses.length > 0) {
|
|
1779
|
+
publisherSyncsPerBidderOverride = deepAccess(serverResponses[0], 'body.ext.publishersyncsperbidderoverride');
|
|
1780
|
+
}
|
|
1781
|
+
if (publisherSyncsPerBidderOverride !== undefined && publisherSyncsPerBidderOverride == 0) {
|
|
1782
|
+
return [];
|
|
1783
|
+
}
|
|
1784
|
+
if (syncOptions.iframeEnabled) {
|
|
1785
|
+
syncs.push({
|
|
1786
|
+
type: 'iframe',
|
|
1787
|
+
url: IFRAME_USER_SYNC_URL
|
|
1788
|
+
})
|
|
1789
|
+
} else {
|
|
1790
|
+
let publisherSyncsPerBidder = null;
|
|
1791
|
+
if (config.getConfig('userSync')) {
|
|
1792
|
+
publisherSyncsPerBidder = config.getConfig('userSync').syncsPerBidder
|
|
1793
|
+
}
|
|
1794
|
+
if (publisherSyncsPerBidder === 0) {
|
|
1795
|
+
publisherSyncsPerBidder = publisherSyncsPerBidderOverride
|
|
1796
|
+
}
|
|
1797
|
+
if (publisherSyncsPerBidderOverride && (publisherSyncsPerBidder === 0 || publisherSyncsPerBidder)) {
|
|
1798
|
+
publisherSyncsPerBidder = publisherSyncsPerBidderOverride > publisherSyncsPerBidder ? publisherSyncsPerBidder : publisherSyncsPerBidderOverride
|
|
1799
|
+
} else {
|
|
1800
|
+
publisherSyncsPerBidder = 1
|
|
1801
|
+
}
|
|
1802
|
+
for (let i = 0; i < publisherSyncsPerBidder; i++) {
|
|
1803
|
+
syncs.push({
|
|
1804
|
+
type: 'image',
|
|
1805
|
+
url: buildImgSyncUrl(publisherSyncsPerBidder, i)
|
|
1806
|
+
})
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
return syncs;
|
|
1429
1810
|
}
|
|
1430
1811
|
};
|
|
1431
1812
|
|
|
1813
|
+
/**
|
|
1814
|
+
* Build img user sync url
|
|
1815
|
+
* @param {int} syncsPerBidder number of syncs Per Bidder
|
|
1816
|
+
* @param {int} index index to pass
|
|
1817
|
+
* @returns {string} img user sync url
|
|
1818
|
+
*/
|
|
1819
|
+
function buildImgSyncUrl(syncsPerBidder, index) {
|
|
1820
|
+
let consentString = '';
|
|
1821
|
+
let gdprApplies = '0';
|
|
1822
|
+
if (gdprConsent && gdprConsent.hasOwnProperty('gdprApplies')) {
|
|
1823
|
+
gdprApplies = gdprConsent.gdprApplies ? '1' : '0';
|
|
1824
|
+
}
|
|
1825
|
+
if (gdprConsent && gdprConsent.hasOwnProperty('consentString')) {
|
|
1826
|
+
consentString = gdprConsent.consentString || '';
|
|
1827
|
+
}
|
|
1828
|
+
|
|
1829
|
+
return IMG_USER_SYNC_URL + '&site_id=' + siteID.toString() + '&p=' + syncsPerBidder.toString() + '&i=' + index.toString() + '&gdpr=' + gdprApplies + '&gdpr_consent=' + consentString + '&us_privacy=' + (usPrivacy || '');
|
|
1830
|
+
}
|
|
1831
|
+
|
|
1432
1832
|
registerBidder(spec);
|