prebid.js 8.2.0 → 8.4.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/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/admanBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.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/axonixBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/brandmetricsRtdProvider.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dependencies.json +6 -0
- package/dist/discoveryBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/holidBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediagoBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +143 -143
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- 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/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pulsepointBidAdapter.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/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.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 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smartyadsBidAdapter.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/stroeerCoreBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/topicsFpdModule.js +1 -1
- package/dist/trafficgateBidAdapter.js +1 -1
- 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/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/voxBidAdapter.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/yandexBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +1 -1
- package/integrationExamples/videoModule/jwplayer/eventListeners.html +2 -2
- package/integrationExamples/videoModule/jwplayer/eventsUI.html +1 -1
- package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +1 -1
- package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +1 -1
- package/integrationExamples/videoModule/jwplayer/playlist.html +1 -1
- package/integrationExamples/videoModule/videojs/bidMarkedAsUsed.html +1 -1
- package/integrationExamples/videoModule/videojs/bidRequestScheduling.html +1 -1
- package/integrationExamples/videoModule/videojs/eventListeners.html +1 -1
- package/integrationExamples/videoModule/videojs/eventsUI.html +1 -1
- package/integrationExamples/videoModule/videojs/gamAdServerMediation.html +1 -1
- package/integrationExamples/videoModule/videojs/mediaMetadata.html +1 -1
- package/integrationExamples/videoModule/videojs/playlist.html +1 -1
- package/modules/33acrossBidAdapter.js +24 -14
- package/modules/33acrossIdSystem.js +15 -4
- package/modules/adagioBidAdapter.js +2 -2
- package/modules/admanBidAdapter.js +4 -0
- package/modules/adtelligentBidAdapter.js +8 -0
- package/modules/beopBidAdapter.js +6 -6
- package/modules/beopBidAdapter.md +35 -1
- package/modules/brandmetricsRtdProvider.js +36 -2
- package/modules/brandmetricsRtdProvider.md +17 -2
- package/modules/cadentApertureMXBidAdapter.md +2 -2
- package/modules/discoveryBidAdapter.js +1 -1
- package/modules/gdprEnforcement.js +27 -22
- package/modules/gridBidAdapter.js +19 -0
- package/modules/holidBidAdapter.js +49 -30
- package/modules/ixBidAdapter.js +41 -2
- package/modules/kargoBidAdapter.js +4 -0
- package/modules/livewrappedAnalyticsAdapter.js +33 -33
- package/modules/mediagoBidAdapter.js +1 -0
- package/modules/minutemediaBidAdapter.js +17 -2
- package/modules/oguryBidAdapter.js +29 -16
- package/modules/pubmaticBidAdapter.js +16 -1
- package/modules/pulsepointBidAdapter.js +63 -424
- package/modules/pulsepointBidAdapter.md +39 -45
- package/modules/sharedIdSystem.js +1 -1
- package/modules/smartyadsBidAdapter.js +6 -3
- package/modules/sovrnBidAdapter.js +10 -1
- package/modules/stroeerCoreBidAdapter.js +2 -3
- package/modules/teadsBidAdapter.js +2 -0
- package/modules/topicsFpdModule.js +4 -1
- package/modules/topicsFpdModule.md +4 -0
- package/modules/trafficgateBidAdapter.js +126 -72
- package/modules/userId/index.js +2 -2
- package/modules/vidazooBidAdapter.js +69 -19
- package/modules/voxBidAdapter.js +16 -5
- package/modules/yahoosspBidAdapter.js +38 -33
- package/modules/yahoosspBidAdapter.md +96 -95
- package/modules/yandexBidAdapter.js +12 -15
- package/package.json +1 -1
- package/src/activities/redactor.js +1 -1
- package/src/auction.js +24 -2
- package/src/constants.json +3 -1
- package/src/fpd/sua.js +8 -2
- package/test/spec/auctionmanager_spec.js +29 -1
- package/test/spec/fpd/enrichment_spec.js +7 -1
- package/test/spec/fpd/sua_spec.js +12 -0
- package/test/spec/modules/33acrossBidAdapter_spec.js +188 -35
- package/test/spec/modules/33acrossIdSystem_spec.js +122 -27
- package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
- package/test/spec/modules/adtelligentBidAdapter_spec.js +8 -0
- package/test/spec/modules/beopBidAdapter_spec.js +18 -2
- package/test/spec/modules/brandmetricsRtdProvider_spec.js +69 -7
- package/test/spec/modules/cadentApertureMXBidAdapter_spec.js +1 -1
- package/test/spec/modules/gdprEnforcement_spec.js +43 -2
- package/test/spec/modules/gridBidAdapter_spec.js +42 -0
- package/test/spec/modules/holidBidAdapter_spec.js +26 -6
- package/test/spec/modules/ixBidAdapter_spec.js +84 -6
- package/test/spec/modules/kargoBidAdapter_spec.js +121 -106
- package/test/spec/modules/minutemediaBidAdapter_spec.js +36 -5
- package/test/spec/modules/oguryBidAdapter_spec.js +208 -108
- package/test/spec/modules/pubmaticBidAdapter_spec.js +119 -0
- package/test/spec/modules/pulsepointBidAdapter_spec.js +225 -486
- package/test/spec/modules/smartyadsBidAdapter_spec.js +1 -1
- package/test/spec/modules/sovrnBidAdapter_spec.js +58 -4
- package/test/spec/modules/stroeerCoreBidAdapter_spec.js +8 -5
- package/test/spec/modules/teadsBidAdapter_spec.js +70 -21
- package/test/spec/modules/topicsFpdModule_spec.js +10 -4
- package/test/spec/modules/trafficgateBidAdapter_spec.js +1349 -199
- package/test/spec/modules/vidazooBidAdapter_spec.js +130 -4
- package/test/spec/modules/voxBidAdapter_spec.js +93 -0
- package/test/spec/modules/yahoosspBidAdapter_spec.js +402 -314
- package/test/spec/modules/yandexBidAdapter_spec.js +21 -3
- package/integrationExamples/gpt/inskin_example.html +0 -100
|
@@ -307,6 +307,15 @@ function generateBidParameters(bid, bidderRequest) {
|
|
|
307
307
|
bidObject.placementId = placementId;
|
|
308
308
|
}
|
|
309
309
|
|
|
310
|
+
const mimes = deepAccess(bid, `mediaTypes.${mediaType}.mimes`);
|
|
311
|
+
if (mimes) {
|
|
312
|
+
bidObject.mimes = mimes;
|
|
313
|
+
}
|
|
314
|
+
const api = deepAccess(bid, `mediaTypes.${mediaType}.api`);
|
|
315
|
+
if (api) {
|
|
316
|
+
bidObject.api = api;
|
|
317
|
+
}
|
|
318
|
+
|
|
310
319
|
const sua = deepAccess(bid, `ortb2.device.sua`);
|
|
311
320
|
if (sua) {
|
|
312
321
|
bidObject.sua = sua;
|
|
@@ -358,6 +367,11 @@ function generateBidParameters(bid, bidderRequest) {
|
|
|
358
367
|
bidObject.linearity = linearity;
|
|
359
368
|
}
|
|
360
369
|
|
|
370
|
+
const protocols = deepAccess(bid, `mediaTypes.video.protocols`);
|
|
371
|
+
if (protocols) {
|
|
372
|
+
bidObject.protocols = protocols;
|
|
373
|
+
}
|
|
374
|
+
|
|
361
375
|
const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
|
|
362
376
|
if (plcmt) {
|
|
363
377
|
bidObject.plcmt = plcmt;
|
|
@@ -398,7 +412,8 @@ function generateGeneralParams(generalObject, bidderRequest) {
|
|
|
398
412
|
dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
|
|
399
413
|
device_type: getDeviceType(navigator.userAgent),
|
|
400
414
|
ua: navigator.userAgent,
|
|
401
|
-
|
|
415
|
+
is_wrapper: !!generalBidParams.isWrapper,
|
|
416
|
+
session_id: generalBidParams.sessionId || getBidIdParameter('bidderRequestId', generalObject),
|
|
402
417
|
tmax: timeout
|
|
403
418
|
}
|
|
404
419
|
|
|
@@ -441,7 +456,7 @@ function generateGeneralParams(generalObject, bidderRequest) {
|
|
|
441
456
|
|
|
442
457
|
if (bidderRequest && bidderRequest.refererInfo) {
|
|
443
458
|
generalParams.referrer = deepAccess(bidderRequest, 'refererInfo.ref');
|
|
444
|
-
generalParams.page_url = deepAccess(bidderRequest, 'refererInfo.page') || window
|
|
459
|
+
generalParams.page_url = deepAccess(bidderRequest, 'refererInfo.page') || deepAccess(window, 'location.href');
|
|
445
460
|
}
|
|
446
461
|
|
|
447
462
|
return generalParams
|
|
@@ -11,7 +11,7 @@ const DEFAULT_TIMEOUT = 1000;
|
|
|
11
11
|
const BID_HOST = 'https://mweb-hb.presage.io/api/header-bidding-request';
|
|
12
12
|
const TIMEOUT_MONITORING_HOST = 'https://ms-ads-monitoring-events.presage.io';
|
|
13
13
|
const MS_COOKIE_SYNC_DOMAIN = 'https://ms-cookie-sync.presage.io';
|
|
14
|
-
const ADAPTER_VERSION = '1.
|
|
14
|
+
const ADAPTER_VERSION = '1.5.0';
|
|
15
15
|
|
|
16
16
|
function getClientWidth() {
|
|
17
17
|
const documentElementClientWidth = window.top.document.documentElement.clientWidth
|
|
@@ -46,22 +46,35 @@ function isBidRequestValid(bid) {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) {
|
|
49
|
-
|
|
49
|
+
const consent = (gdprConsent && gdprConsent.consentString) || '';
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
51
|
+
if (syncOptions.iframeEnabled) {
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
type: 'iframe',
|
|
55
|
+
url: `${MS_COOKIE_SYNC_DOMAIN}/user-sync.html?gdpr_consent=${consent}&source=prebid`
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (syncOptions.pixelEnabled) {
|
|
61
|
+
return [
|
|
62
|
+
{
|
|
63
|
+
type: 'image',
|
|
64
|
+
url: `${MS_COOKIE_SYNC_DOMAIN}/v1/init-sync/bid-switch?iab_string=${consent}&source=prebid`
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
type: 'image',
|
|
68
|
+
url: `${MS_COOKIE_SYNC_DOMAIN}/ttd/init-sync?iab_string=${consent}&source=prebid`
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
type: 'image',
|
|
72
|
+
url: `${MS_COOKIE_SYNC_DOMAIN}/xandr/init-sync?iab_string=${consent}&source=prebid`
|
|
73
|
+
}
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return [];
|
|
65
78
|
}
|
|
66
79
|
|
|
67
80
|
function buildRequests(validBidRequests, bidderRequest) {
|
|
@@ -1194,6 +1194,15 @@ export const spec = {
|
|
|
1194
1194
|
deepSetValue(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent);
|
|
1195
1195
|
}
|
|
1196
1196
|
|
|
1197
|
+
// Attaching GPP Consent Params
|
|
1198
|
+
if (bidderRequest?.gppConsent?.gppString) {
|
|
1199
|
+
deepSetValue(payload, 'regs.gpp', bidderRequest.gppConsent.gppString);
|
|
1200
|
+
deepSetValue(payload, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections);
|
|
1201
|
+
} else if (bidderRequest?.ortb2?.regs?.gpp) {
|
|
1202
|
+
deepSetValue(payload, 'regs.gpp', bidderRequest.ortb2.regs.gpp);
|
|
1203
|
+
deepSetValue(payload, 'regs.gpp_sid', bidderRequest.ortb2.regs.gpp_sid);
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1197
1206
|
// coppa compliance
|
|
1198
1207
|
if (config.getConfig('coppa') === true) {
|
|
1199
1208
|
deepSetValue(payload, 'regs.coppa', 1);
|
|
@@ -1352,7 +1361,7 @@ export const spec = {
|
|
|
1352
1361
|
/**
|
|
1353
1362
|
* Register User Sync.
|
|
1354
1363
|
*/
|
|
1355
|
-
getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent) => {
|
|
1364
|
+
getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent, gppConsent) => {
|
|
1356
1365
|
let syncurl = '' + publisherId;
|
|
1357
1366
|
|
|
1358
1367
|
// Attaching GDPR Consent Params in UserSync url
|
|
@@ -1366,6 +1375,12 @@ export const spec = {
|
|
|
1366
1375
|
syncurl += '&us_privacy=' + encodeURIComponent(uspConsent);
|
|
1367
1376
|
}
|
|
1368
1377
|
|
|
1378
|
+
// GPP Consent
|
|
1379
|
+
if (gppConsent?.gppString && gppConsent?.applicableSections?.length) {
|
|
1380
|
+
syncurl += '&gpp=' + encodeURIComponent(gppConsent.gppString);
|
|
1381
|
+
syncurl += '&gpp_sid=' + encodeURIComponent(gppConsent?.applicableSections?.join(','));
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1369
1384
|
// coppa compliance
|
|
1370
1385
|
if (config.getConfig('coppa') === true) {
|
|
1371
1386
|
syncurl += '&coppa=1';
|
|
@@ -1,21 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {convertTypes, deepAccess, isArray, isFn, logError} from '../src/utils.js';
|
|
1
|
+
import { ortbConverter } from '../libraries/ortbConverter/converter.js';
|
|
2
|
+
import {convertTypes, isArray} from '../src/utils.js';
|
|
4
3
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
5
|
-
import {Renderer} from '../src/Renderer.js';
|
|
6
4
|
|
|
7
|
-
const NATIVE_DEFAULTS = {
|
|
8
|
-
TITLE_LEN: 100,
|
|
9
|
-
DESCR_LEN: 200,
|
|
10
|
-
SPONSORED_BY_LEN: 50,
|
|
11
|
-
IMG_MIN: 150,
|
|
12
|
-
ICON_MIN: 50,
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
const DEFAULT_BID_TTL = 20;
|
|
16
5
|
const DEFAULT_CURRENCY = 'USD';
|
|
17
|
-
const
|
|
18
|
-
const KNOWN_PARAMS = ['cp', 'ct', 'cf', 'video', 'battr', 'bcat', 'badv', 'bidfloor'];
|
|
6
|
+
const KNOWN_PARAMS = ['cp', 'ct', 'cf', 'battr', 'deals'];
|
|
19
7
|
const DEFAULT_TMAX = 500;
|
|
20
8
|
|
|
21
9
|
/**
|
|
@@ -41,33 +29,21 @@ export const spec = {
|
|
|
41
29
|
),
|
|
42
30
|
|
|
43
31
|
buildRequests: (bidRequests, bidderRequest) => {
|
|
44
|
-
|
|
45
|
-
bidRequests = convertOrtbRequestToProprietaryNative(bidRequests);
|
|
46
|
-
|
|
47
|
-
const request = {
|
|
48
|
-
id: bidRequests[0].bidderRequestId,
|
|
49
|
-
imp: bidRequests.map(slot => impression(slot)),
|
|
50
|
-
site: site(bidRequests, bidderRequest),
|
|
51
|
-
app: app(bidRequests),
|
|
52
|
-
device: device(),
|
|
53
|
-
bcat: deepAccess(bidderRequest.ortb2Imp, 'bcat') || bidRequests[0].params.bcat,
|
|
54
|
-
badv: bidRequests[0].params.badv,
|
|
55
|
-
user: user(bidRequests[0], bidderRequest),
|
|
56
|
-
regs: regs(bidderRequest),
|
|
57
|
-
source: source(bidRequests[0].schain),
|
|
58
|
-
tmax: bidderRequest.timeout || DEFAULT_TMAX,
|
|
59
|
-
};
|
|
32
|
+
const data = converter.toORTB({bidRequests, bidderRequest});
|
|
60
33
|
return {
|
|
61
34
|
method: 'POST',
|
|
62
35
|
url: 'https://bid.contextweb.com/header/ortb?src=prebid',
|
|
63
|
-
data
|
|
36
|
+
data,
|
|
64
37
|
bidderRequest
|
|
65
38
|
};
|
|
66
39
|
},
|
|
67
40
|
|
|
68
|
-
interpretResponse: (response, request) =>
|
|
69
|
-
|
|
70
|
-
|
|
41
|
+
interpretResponse: (response, request) => {
|
|
42
|
+
if (response.body) {
|
|
43
|
+
return converter.fromORTB({response: response.body, request: request.data}).bids;
|
|
44
|
+
}
|
|
45
|
+
return [];
|
|
46
|
+
},
|
|
71
47
|
|
|
72
48
|
getUserSyncs: syncOptions => {
|
|
73
49
|
if (syncOptions.iframeEnabled) {
|
|
@@ -82,7 +58,7 @@ export const spec = {
|
|
|
82
58
|
}];
|
|
83
59
|
}
|
|
84
60
|
},
|
|
85
|
-
transformBidParams: function(params
|
|
61
|
+
transformBidParams: function(params) {
|
|
86
62
|
return convertTypes({
|
|
87
63
|
'cf': 'string',
|
|
88
64
|
'cp': 'number',
|
|
@@ -91,124 +67,61 @@ export const spec = {
|
|
|
91
67
|
}
|
|
92
68
|
};
|
|
93
69
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
const bids = [];
|
|
118
|
-
Object.keys(idToImpMap).forEach(id => {
|
|
119
|
-
if (idToBidMap[id]) {
|
|
120
|
-
const bid = {
|
|
121
|
-
requestId: id,
|
|
122
|
-
cpm: idToBidMap[id].price,
|
|
123
|
-
creative_id: idToBidMap[id].crid,
|
|
124
|
-
creativeId: idToBidMap[id].crid,
|
|
125
|
-
adId: id,
|
|
126
|
-
ttl: idToBidMap[id].exp || DEFAULT_BID_TTL,
|
|
127
|
-
netRevenue: DEFAULT_NET_REVENUE,
|
|
128
|
-
currency: bidResponse.cur || DEFAULT_CURRENCY,
|
|
129
|
-
meta: { advertiserDomains: idToBidMap[id].adomain || [] }
|
|
130
|
-
};
|
|
131
|
-
if (idToImpMap[id].video) {
|
|
132
|
-
// for outstream, a renderer is specified
|
|
133
|
-
if (idToSlotConfig[id] && deepAccess(idToSlotConfig[id], 'mediaTypes.video.context') === 'outstream') {
|
|
134
|
-
bid.renderer = outstreamRenderer(deepAccess(idToSlotConfig[id], 'renderer.options'), deepAccess(idToBidMap[id], 'ext.outstream'));
|
|
70
|
+
const converter = ortbConverter({
|
|
71
|
+
context: {
|
|
72
|
+
netRevenue: true,
|
|
73
|
+
ttl: 300,
|
|
74
|
+
currency: 'USD'
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
imp(buildImp, bidRequest, context) {
|
|
78
|
+
const imp = buildImp(bidRequest, context);
|
|
79
|
+
// tagid
|
|
80
|
+
imp.tagid = bidRequest.params.ct.toString();
|
|
81
|
+
// unknown params
|
|
82
|
+
const unknownParams = slotUnknownParams(bidRequest);
|
|
83
|
+
if (imp.ext || unknownParams) {
|
|
84
|
+
imp.ext = Object.assign({}, imp.ext, unknownParams);
|
|
85
|
+
}
|
|
86
|
+
// battr
|
|
87
|
+
if (bidRequest.params.battr) {
|
|
88
|
+
['banner', 'video', 'audio', 'native'].forEach(k => {
|
|
89
|
+
if (imp[k]) {
|
|
90
|
+
imp[k].battr = bidRequest.params.battr;
|
|
135
91
|
}
|
|
136
|
-
|
|
137
|
-
bid.mediaType = 'video';
|
|
138
|
-
bid.width = idToBidMap[id].w;
|
|
139
|
-
bid.height = idToBidMap[id].h;
|
|
140
|
-
} else if (idToImpMap[id].banner) {
|
|
141
|
-
bid.ad = idToBidMap[id].adm;
|
|
142
|
-
bid.width = idToBidMap[id].w || idToImpMap[id].banner.w;
|
|
143
|
-
bid.height = idToBidMap[id].h || idToImpMap[id].banner.h;
|
|
144
|
-
} else if (idToImpMap[id]['native']) {
|
|
145
|
-
bid['native'] = nativeResponse(idToImpMap[id], idToBidMap[id]);
|
|
146
|
-
bid.mediaType = 'native';
|
|
147
|
-
}
|
|
148
|
-
bids.push(bid);
|
|
92
|
+
});
|
|
149
93
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
var ext = Object.assign({}, firstPartyData, slotUnknownParams(slot));
|
|
160
|
-
return {
|
|
161
|
-
id: slot.bidId,
|
|
162
|
-
banner: banner(slot),
|
|
163
|
-
'native': nativeImpression(slot),
|
|
164
|
-
tagid: slot.params.ct.toString(),
|
|
165
|
-
video: video(slot),
|
|
166
|
-
bidfloor: bidFloor(slot),
|
|
167
|
-
ext: Object.keys(ext).length > 0 ? ext : null,
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Produces an OpenRTB Banner object for the slot given.
|
|
173
|
-
*/
|
|
174
|
-
function banner(slot) {
|
|
175
|
-
const sizes = parseSizes(slot);
|
|
176
|
-
const size = adSize(slot, sizes);
|
|
177
|
-
return (slot.mediaTypes && slot.mediaTypes.banner) ? {
|
|
178
|
-
w: size[0],
|
|
179
|
-
h: size[1],
|
|
180
|
-
battr: slot.params.battr,
|
|
181
|
-
format: sizes
|
|
182
|
-
} : null;
|
|
183
|
-
}
|
|
94
|
+
// deals
|
|
95
|
+
if (bidRequest.params.deals && isArray(bidRequest.params.deals)) {
|
|
96
|
+
imp.pmp = {
|
|
97
|
+
private_auction: 0,
|
|
98
|
+
deals: bidRequest.params.deals
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return imp;
|
|
102
|
+
},
|
|
184
103
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
104
|
+
request(buildRequest, imps, bidderRequest, context) {
|
|
105
|
+
const request = buildRequest(imps, bidderRequest, context);
|
|
106
|
+
// publisher id
|
|
107
|
+
const siteOrApp = request.site || request.app;
|
|
108
|
+
const pubId = context.bidRequests && context.bidRequests.length > 0 ? context.bidRequests[0].params.cp : '0';
|
|
109
|
+
if (siteOrApp) {
|
|
110
|
+
siteOrApp.publisher = Object.assign({}, siteOrApp.publisher, {
|
|
111
|
+
id: pubId.toString()
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// tmax
|
|
115
|
+
request.tmax = request.tmax || DEFAULT_TMAX;
|
|
116
|
+
return request;
|
|
117
|
+
},
|
|
198
118
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
slot.params.video, // previously supported as bidder param
|
|
206
|
-
slot.mediaTypes && slot.mediaTypes.video ? slot.mediaTypes.video : {}, // params on mediaTypes.video
|
|
207
|
-
{battr: slot.params.battr}
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
return null;
|
|
211
|
-
}
|
|
119
|
+
bidResponse(buildBidResponse, bid, context) {
|
|
120
|
+
const bidResponse = buildBidResponse(bid, context);
|
|
121
|
+
bidResponse.cur = bidResponse.cur || DEFAULT_CURRENCY;
|
|
122
|
+
return bidResponse;
|
|
123
|
+
},
|
|
124
|
+
});
|
|
212
125
|
|
|
213
126
|
/**
|
|
214
127
|
* Unknown params are captured and sent on ext
|
|
@@ -225,278 +138,4 @@ function slotUnknownParams(slot) {
|
|
|
225
138
|
return Object.keys(ext).length > 0 ? { prebid: ext } : null;
|
|
226
139
|
}
|
|
227
140
|
|
|
228
|
-
/**
|
|
229
|
-
* Sets up the renderer on the bid, for outstream bid responses.
|
|
230
|
-
*/
|
|
231
|
-
function outstreamRenderer(rendererOptions, outstreamExtOptions) {
|
|
232
|
-
const renderer = Renderer.install({
|
|
233
|
-
url: outstreamExtOptions.rendererUrl,
|
|
234
|
-
config: {
|
|
235
|
-
defaultOptions: outstreamExtOptions.config,
|
|
236
|
-
rendererOptions,
|
|
237
|
-
type: outstreamExtOptions.type
|
|
238
|
-
},
|
|
239
|
-
loaded: false,
|
|
240
|
-
});
|
|
241
|
-
renderer.setRender((bid) => {
|
|
242
|
-
bid.renderer.push(() => {
|
|
243
|
-
const config = bid.renderer.getConfig();
|
|
244
|
-
new window.PulsePointOutstreamRenderer().render({
|
|
245
|
-
adUnitCode: bid.adUnitCode,
|
|
246
|
-
vastXml: bid.vastXml,
|
|
247
|
-
type: config.type,
|
|
248
|
-
defaultOptions: config.defaultOptions,
|
|
249
|
-
rendererOptions
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
return renderer;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Produces an OpenRTB Native object for the slot given.
|
|
258
|
-
*/
|
|
259
|
-
function nativeImpression(slot) {
|
|
260
|
-
if (slot.nativeParams) {
|
|
261
|
-
const assets = [];
|
|
262
|
-
addAsset(assets, titleAsset(assets.length + 1, slot.nativeParams.title, NATIVE_DEFAULTS.TITLE_LEN));
|
|
263
|
-
addAsset(assets, dataAsset(assets.length + 1, slot.nativeParams.body, 2, NATIVE_DEFAULTS.DESCR_LEN));
|
|
264
|
-
addAsset(assets, dataAsset(assets.length + 1, slot.nativeParams.sponsoredBy, 1, NATIVE_DEFAULTS.SPONSORED_BY_LEN));
|
|
265
|
-
addAsset(assets, imageAsset(assets.length + 1, slot.nativeParams.icon, 1, NATIVE_DEFAULTS.ICON_MIN, NATIVE_DEFAULTS.ICON_MIN));
|
|
266
|
-
addAsset(assets, imageAsset(assets.length + 1, slot.nativeParams.image, 3, NATIVE_DEFAULTS.IMG_MIN, NATIVE_DEFAULTS.IMG_MIN));
|
|
267
|
-
return {
|
|
268
|
-
request: JSON.stringify({ assets }),
|
|
269
|
-
ver: '1.1',
|
|
270
|
-
battr: slot.params.battr,
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
return null;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Helper method to add an asset to the assets list.
|
|
278
|
-
*/
|
|
279
|
-
function addAsset(assets, asset) {
|
|
280
|
-
if (asset) {
|
|
281
|
-
assets.push(asset);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Produces a Native Title asset for the configuration given.
|
|
287
|
-
*/
|
|
288
|
-
function titleAsset(id, params, defaultLen) {
|
|
289
|
-
if (params) {
|
|
290
|
-
return {
|
|
291
|
-
id,
|
|
292
|
-
required: params.required ? 1 : 0,
|
|
293
|
-
title: {
|
|
294
|
-
len: params.len || defaultLen,
|
|
295
|
-
},
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
return null;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Produces a Native Image asset for the configuration given.
|
|
303
|
-
*/
|
|
304
|
-
function imageAsset(id, params, type, defaultMinWidth, defaultMinHeight) {
|
|
305
|
-
return params ? {
|
|
306
|
-
id,
|
|
307
|
-
required: params.required ? 1 : 0,
|
|
308
|
-
img: {
|
|
309
|
-
type,
|
|
310
|
-
wmin: params.wmin || defaultMinWidth,
|
|
311
|
-
hmin: params.hmin || defaultMinHeight,
|
|
312
|
-
}
|
|
313
|
-
} : null;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Produces a Native Data asset for the configuration given.
|
|
318
|
-
*/
|
|
319
|
-
function dataAsset(id, params, type, defaultLen) {
|
|
320
|
-
return params ? {
|
|
321
|
-
id,
|
|
322
|
-
required: params.required ? 1 : 0,
|
|
323
|
-
data: {
|
|
324
|
-
type,
|
|
325
|
-
len: params.len || defaultLen,
|
|
326
|
-
}
|
|
327
|
-
} : null;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* Produces an OpenRTB site object.
|
|
332
|
-
*/
|
|
333
|
-
function site(bidRequests, bidderRequest) {
|
|
334
|
-
const pubId = bidRequests && bidRequests.length > 0 ? bidRequests[0].params.cp : '0';
|
|
335
|
-
const appParams = bidRequests[0].params.app;
|
|
336
|
-
if (!appParams) {
|
|
337
|
-
// use the first party data if available, and override only publisher/ref/page properties
|
|
338
|
-
var firstPartyData = bidderRequest?.ortb2?.site || {};
|
|
339
|
-
return Object.assign({}, firstPartyData, {
|
|
340
|
-
publisher: {
|
|
341
|
-
id: pubId.toString(),
|
|
342
|
-
},
|
|
343
|
-
// TODO: does the fallback make sense here?
|
|
344
|
-
ref: bidderRequest?.refererInfo?.ref || window.document.referrer,
|
|
345
|
-
page: bidderRequest?.refererInfo?.page || ''
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Produces an OpenRTB App object.
|
|
353
|
-
*/
|
|
354
|
-
function app(bidderRequest) {
|
|
355
|
-
const pubId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.cp : '0';
|
|
356
|
-
const appParams = bidderRequest[0].params.app;
|
|
357
|
-
if (appParams) {
|
|
358
|
-
return {
|
|
359
|
-
publisher: {
|
|
360
|
-
id: pubId.toString(),
|
|
361
|
-
},
|
|
362
|
-
bundle: appParams.bundle,
|
|
363
|
-
storeurl: appParams.storeUrl,
|
|
364
|
-
domain: appParams.domain,
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
return null;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* Produces an OpenRTB Device object.
|
|
372
|
-
*/
|
|
373
|
-
function device() {
|
|
374
|
-
return {
|
|
375
|
-
ua: navigator.userAgent,
|
|
376
|
-
language: (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage),
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
* Safely parses the input given. Returns null on
|
|
382
|
-
* parsing failure.
|
|
383
|
-
*/
|
|
384
|
-
function parse(rawResponse) {
|
|
385
|
-
try {
|
|
386
|
-
if (rawResponse) {
|
|
387
|
-
return JSON.parse(rawResponse);
|
|
388
|
-
}
|
|
389
|
-
} catch (ex) {
|
|
390
|
-
logError('pulsepointLite.safeParse', 'ERROR', ex);
|
|
391
|
-
}
|
|
392
|
-
return null;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Determines the AdSize for the slot.
|
|
397
|
-
*/
|
|
398
|
-
function adSize(slot, sizes) {
|
|
399
|
-
if (slot.params.cf) {
|
|
400
|
-
const size = slot.params.cf.toUpperCase().split('X');
|
|
401
|
-
const width = parseInt(slot.params.cw || size[0], 10);
|
|
402
|
-
const height = parseInt(slot.params.ch || size[1], 10);
|
|
403
|
-
return [width, height];
|
|
404
|
-
} else if (sizes && sizes.length > 0) {
|
|
405
|
-
return [sizes[0].w, sizes[0].h];
|
|
406
|
-
}
|
|
407
|
-
return [1, 1];
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* Handles the user level attributes and produces
|
|
412
|
-
* an openrtb User object.
|
|
413
|
-
*/
|
|
414
|
-
function user(bidRequest, bidderRequest) {
|
|
415
|
-
var user = bidderRequest?.ortb2?.user || { ext: {} };
|
|
416
|
-
var ext = user.ext;
|
|
417
|
-
if (bidderRequest) {
|
|
418
|
-
if (bidderRequest.gdprConsent) {
|
|
419
|
-
ext.consent = bidderRequest.gdprConsent.consentString;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
if (bidRequest) {
|
|
423
|
-
let eids = bidRequest.userIdAsEids;
|
|
424
|
-
if (eids) {
|
|
425
|
-
ext.eids = eids;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
return user;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* Produces the regulations ortb object
|
|
433
|
-
*/
|
|
434
|
-
function regs(bidderRequest) {
|
|
435
|
-
if (bidderRequest.gdprConsent || bidderRequest.uspConsent) {
|
|
436
|
-
var ext = {};
|
|
437
|
-
// GDPR applies attribute (actual consent value is in user object)
|
|
438
|
-
if (bidderRequest.gdprConsent) {
|
|
439
|
-
ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
|
|
440
|
-
}
|
|
441
|
-
// CCPA
|
|
442
|
-
if (bidderRequest.uspConsent) {
|
|
443
|
-
ext.us_privacy = bidderRequest.uspConsent;
|
|
444
|
-
}
|
|
445
|
-
return { ext };
|
|
446
|
-
}
|
|
447
|
-
return null;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/**
|
|
451
|
-
* Creates source object with supply chain
|
|
452
|
-
*/
|
|
453
|
-
function source(schain) {
|
|
454
|
-
if (schain) {
|
|
455
|
-
return {
|
|
456
|
-
ext: { schain }
|
|
457
|
-
};
|
|
458
|
-
}
|
|
459
|
-
return null;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
/**
|
|
463
|
-
* Parses the native response from the Bid given.
|
|
464
|
-
*/
|
|
465
|
-
function nativeResponse(imp, bid) {
|
|
466
|
-
if (imp['native']) {
|
|
467
|
-
const nativeAd = parse(bid.adm);
|
|
468
|
-
const keys = {};
|
|
469
|
-
if (nativeAd && nativeAd['native'] && nativeAd['native'].assets) {
|
|
470
|
-
nativeAd['native'].assets.forEach(asset => {
|
|
471
|
-
keys.title = asset.title ? asset.title.text : keys.title;
|
|
472
|
-
keys.body = asset.data && asset.data.type === 2 ? asset.data.value : keys.body;
|
|
473
|
-
keys.sponsoredBy = asset.data && asset.data.type === 1 ? asset.data.value : keys.sponsoredBy;
|
|
474
|
-
keys.image = asset.img && asset.img.type === 3 ? asset.img.url : keys.image;
|
|
475
|
-
keys.icon = asset.img && asset.img.type === 1 ? asset.img.url : keys.icon;
|
|
476
|
-
});
|
|
477
|
-
if (nativeAd['native'].link) {
|
|
478
|
-
keys.clickUrl = encodeURIComponent(nativeAd['native'].link.url);
|
|
479
|
-
}
|
|
480
|
-
keys.impressionTrackers = nativeAd['native'].imptrackers;
|
|
481
|
-
return keys;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
return null;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
function bidFloor(slot) {
|
|
488
|
-
let floor = slot.params.bidfloor;
|
|
489
|
-
if (isFn(slot.getFloor)) {
|
|
490
|
-
const floorData = slot.getFloor({
|
|
491
|
-
mediaType: slot.mediaTypes.banner ? 'banner' : slot.mediaTypes.video ? 'video' : 'Native',
|
|
492
|
-
size: '*',
|
|
493
|
-
currency: DEFAULT_CURRENCY,
|
|
494
|
-
});
|
|
495
|
-
if (floorData && floorData.floor) {
|
|
496
|
-
floor = floorData.floor;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
return floor;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
141
|
registerBidder(spec);
|