prebid.js 7.3.0 → 7.6.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/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/adnuntiusBidAdapter.js +1 -1
- package/dist/adotBidAdapter.js +1 -1
- package/dist/adpod.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adrinoBidAdapter.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.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/atsAnalyticsAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/byDataAnalyticsAdapter.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/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/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.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/imRtdProvider.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/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 -1
- 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/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/newspassidBidAdapter.js +1 -0
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +131 -127
- 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/priceFloors.js +1 -1
- 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/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/rasBidAdapter.js +1 -0
- 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/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/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/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/gulpfile.js +1 -1
- package/karma.conf.maker.js +3 -1
- package/modules/adgenerationBidAdapter.js +24 -1
- package/modules/adnuntiusBidAdapter.js +26 -8
- package/modules/adotBidAdapter.js +13 -4
- package/modules/adrinoBidAdapter.js +10 -2
- package/modules/adrinoBidAdapter.md +6 -0
- package/modules/adtelligentBidAdapter.js +2 -1
- package/modules/appnexusBidAdapter.js +3 -3
- package/modules/atsAnalyticsAdapter.js +4 -5
- package/modules/byDataAnalyticsAdapter.js +172 -74
- package/modules/byDataAnalyticsAdapter.md +5 -6
- package/modules/consumableBidAdapter.js +12 -1
- 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/eplanningBidAdapter.js +82 -97
- package/modules/gdprEnforcement.js +8 -14
- package/modules/gridNMBidAdapter.js +45 -4
- 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/imRtdProvider.js +0 -8
- package/modules/insticatorBidAdapter.js +9 -0
- package/modules/ixBidAdapter.js +462 -58
- 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/minutemediaBidAdapter.js +1 -0
- package/modules/missenaBidAdapter.js +20 -2
- package/modules/newspassidBidAdapter.js +649 -0
- package/modules/nextMillenniumBidAdapter.js +17 -1
- package/modules/oguryBidAdapter.js +2 -0
- package/modules/openxBidAdapter.md +3 -1
- package/modules/openxOrtbBidAdapter.js +349 -0
- package/modules/openxOrtbBidAdapter.md +105 -0
- package/modules/priceFloors.js +1 -1
- package/modules/pubCommonId.js +1 -2
- package/modules/pubxaiAnalyticsAdapter.js +6 -1
- package/modules/rasBidAdapter.js +149 -0
- package/modules/rasBidAdapter.md +50 -0
- package/modules/readpeakBidAdapter.js +15 -6
- package/modules/relaidoBidAdapter.js +19 -4
- package/modules/seedtagBidAdapter.js +37 -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/taboolaBidAdapter.js +1 -1
- package/modules/taboolaBidAdapter.md +3 -3
- package/modules/ventesBidAdapter.js +1 -1
- package/modules/ventesBidAdapter.md +1 -1
- package/modules/vrtcalBidAdapter.js +35 -0
- package/package.json +1 -1
- package/plugins/pbjsGlobals.js +2 -1
- package/src/storageManager.js +4 -5
- package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -4
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +126 -14
- package/test/spec/modules/adotBidAdapter_spec.js +12 -9
- package/test/spec/modules/adrinoBidAdapter_spec.js +22 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +165 -156
- package/test/spec/modules/byDataAnalyticsAdapter_spec.js +74 -24
- package/test/spec/modules/consumableBidAdapter_spec.js +75 -0
- package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
- package/test/spec/modules/debugging_mod_spec.js +7 -0
- package/test/spec/modules/eplanningBidAdapter_spec.js +58 -18
- package/test/spec/modules/gdprEnforcement_spec.js +53 -100
- package/test/spec/modules/gridNMBidAdapter_spec.js +32 -0
- package/test/spec/modules/hadronIdSystem_spec.js +2 -2
- package/test/spec/modules/imRtdProvider_spec.js +0 -1
- package/test/spec/modules/insticatorBidAdapter_spec.js +22 -1
- package/test/spec/modules/ixBidAdapter_spec.js +470 -10
- package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
- package/test/spec/modules/kargoBidAdapter_spec.js +1 -0
- package/test/spec/modules/minutemediaBidAdapter_spec.js +3 -0
- package/test/spec/modules/missenaBidAdapter_spec.js +36 -14
- package/test/spec/modules/newspassidBidAdapter_spec.js +1793 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +20 -0
- package/test/spec/modules/openxOrtbBidAdapter_spec.js +1303 -0
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +5 -0
- package/test/spec/modules/rasBidAdapter_spec.js +190 -0
- package/test/spec/modules/readpeakBidAdapter_spec.js +1 -0
- package/test/spec/modules/relaidoBidAdapter_spec.js +29 -2
- package/test/spec/modules/seedtagBidAdapter_spec.js +29 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
- package/test/spec/modules/shinezBidAdapter_spec.js +479 -0
- package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
- package/test/spec/modules/ventesBidAdapter_spec.js +2 -2
- package/test/spec/modules/vrtcalBidAdapter_spec.js +17 -0
- package/webpack.conf.js +1 -1
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
import { logInfo, logError, deepAccess, logWarn, deepSetValue, isArray, contains, parseUrl } from '../src/utils.js';
|
|
2
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
3
|
+
import { BANNER, NATIVE } from '../src/mediaTypes.js';
|
|
4
|
+
import {config} from '../src/config.js';
|
|
5
|
+
import {getPriceBucketString} from '../src/cpmBucketManager.js';
|
|
6
|
+
import {getRefererInfo} from '../src/refererDetection.js';
|
|
7
|
+
const BIDDER_CODE = 'newspassid';
|
|
8
|
+
const ORIGIN = 'https://bidder.newspassid.com' // applies only to auction & cookie
|
|
9
|
+
const AUCTIONURI = '/openrtb2/auction';
|
|
10
|
+
const NEWSPASSCOOKIESYNC = '/static/load-cookie.html';
|
|
11
|
+
const NEWSPASSVERSION = '1.0.1';
|
|
12
|
+
export const spec = {
|
|
13
|
+
version: NEWSPASSVERSION,
|
|
14
|
+
code: BIDDER_CODE,
|
|
15
|
+
supportedMediaTypes: [BANNER],
|
|
16
|
+
cookieSyncBag: {publisherId: null, siteId: null, userIdObject: {}}, // variables we want to make available to cookie sync
|
|
17
|
+
propertyBag: {config: null, pageId: null, buildRequestsStart: 0, buildRequestsEnd: 0, endpointOverride: null}, /* allow us to store vars in instance scope - needs to be an object to be mutable */
|
|
18
|
+
config_defaults: {
|
|
19
|
+
'logId': 'NEWSPASSID',
|
|
20
|
+
'bidder': 'newspassid',
|
|
21
|
+
'auctionUrl': ORIGIN + AUCTIONURI,
|
|
22
|
+
'cookieSyncUrl': ORIGIN + NEWSPASSCOOKIESYNC
|
|
23
|
+
},
|
|
24
|
+
loadConfiguredData(bid) {
|
|
25
|
+
if (this.propertyBag.config) { return; }
|
|
26
|
+
this.propertyBag.config = JSON.parse(JSON.stringify(this.config_defaults));
|
|
27
|
+
let bidder = bid.bidder || 'newspassid';
|
|
28
|
+
this.propertyBag.config.logId = bidder.toUpperCase();
|
|
29
|
+
this.propertyBag.config.bidder = bidder;
|
|
30
|
+
let bidderConfig = config.getConfig(bidder) || {};
|
|
31
|
+
logInfo('got bidderConfig: ', JSON.parse(JSON.stringify(bidderConfig)));
|
|
32
|
+
let arrGetParams = this.getGetParametersAsObject();
|
|
33
|
+
if (bidderConfig.endpointOverride) {
|
|
34
|
+
if (bidderConfig.endpointOverride.origin) {
|
|
35
|
+
this.propertyBag.endpointOverride = bidderConfig.endpointOverride.origin;
|
|
36
|
+
this.propertyBag.config.auctionUrl = bidderConfig.endpointOverride.origin + AUCTIONURI;
|
|
37
|
+
this.propertyBag.config.cookieSyncUrl = bidderConfig.endpointOverride.origin + NEWSPASSCOOKIESYNC;
|
|
38
|
+
}
|
|
39
|
+
if (bidderConfig.endpointOverride.cookieSyncUrl) {
|
|
40
|
+
this.propertyBag.config.cookieSyncUrl = bidderConfig.endpointOverride.cookieSyncUrl;
|
|
41
|
+
}
|
|
42
|
+
if (bidderConfig.endpointOverride.auctionUrl) {
|
|
43
|
+
this.propertyBag.endpointOverride = bidderConfig.endpointOverride.auctionUrl;
|
|
44
|
+
this.propertyBag.config.auctionUrl = bidderConfig.endpointOverride.auctionUrl;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
if (arrGetParams.hasOwnProperty('auction')) {
|
|
49
|
+
logInfo('GET: setting auction endpoint to: ' + arrGetParams.auction);
|
|
50
|
+
this.propertyBag.config.auctionUrl = arrGetParams.auction;
|
|
51
|
+
}
|
|
52
|
+
if (arrGetParams.hasOwnProperty('cookiesync')) {
|
|
53
|
+
logInfo('GET: setting cookiesync to: ' + arrGetParams.cookiesync);
|
|
54
|
+
this.propertyBag.config.cookieSyncUrl = arrGetParams.cookiesync;
|
|
55
|
+
}
|
|
56
|
+
} catch (e) {}
|
|
57
|
+
logInfo('set propertyBag.config to', this.propertyBag.config);
|
|
58
|
+
},
|
|
59
|
+
getAuctionUrl() {
|
|
60
|
+
return this.propertyBag.config.auctionUrl;
|
|
61
|
+
},
|
|
62
|
+
getCookieSyncUrl() {
|
|
63
|
+
return this.propertyBag.config.cookieSyncUrl;
|
|
64
|
+
},
|
|
65
|
+
isBidRequestValid(bid) {
|
|
66
|
+
this.loadConfiguredData(bid);
|
|
67
|
+
logInfo('isBidRequestValid : ', config.getConfig(), bid);
|
|
68
|
+
let adUnitCode = bid.adUnitCode; // adunit[n].code
|
|
69
|
+
let err1 = 'VALIDATION FAILED : missing {param} : siteId, placementId and publisherId are REQUIRED'
|
|
70
|
+
if (!(bid.params.hasOwnProperty('placementId'))) {
|
|
71
|
+
logError(err1.replace('{param}', 'placementId'), adUnitCode);
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (!this.isValidPlacementId(bid.params.placementId)) {
|
|
75
|
+
logError('VALIDATION FAILED : placementId must be exactly 10 numeric characters', adUnitCode);
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (!(bid.params.hasOwnProperty('publisherId'))) {
|
|
79
|
+
logError(err1.replace('{param}', 'publisherId'), adUnitCode);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (!(bid.params.publisherId).toString().match(/^[a-zA-Z0-9\-]{12}$/)) {
|
|
83
|
+
logError('VALIDATION FAILED : publisherId must be exactly 12 alphanumeric characters including hyphens', adUnitCode);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (!(bid.params.hasOwnProperty('siteId'))) {
|
|
87
|
+
logError(err1.replace('{param}', 'siteId'), adUnitCode);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (!(bid.params.siteId).toString().match(/^[0-9]{10}$/)) {
|
|
91
|
+
logError('VALIDATION FAILED : siteId must be exactly 10 numeric characters', adUnitCode);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
if (bid.params.hasOwnProperty('customParams')) {
|
|
95
|
+
logError('VALIDATION FAILED : customParams should be renamed to customData', adUnitCode);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (bid.params.hasOwnProperty('customData')) {
|
|
99
|
+
if (!Array.isArray(bid.params.customData)) {
|
|
100
|
+
logError('VALIDATION FAILED : customData is not an Array', adUnitCode);
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
if (bid.params.customData.length < 1) {
|
|
104
|
+
logError('VALIDATION FAILED : customData is an array but does not contain any elements', adUnitCode);
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
if (!(bid.params.customData[0]).hasOwnProperty('targeting')) {
|
|
108
|
+
logError('VALIDATION FAILED : customData[0] does not contain "targeting"', adUnitCode);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
if (typeof bid.params.customData[0]['targeting'] != 'object') {
|
|
112
|
+
logError('VALIDATION FAILED : customData[0] targeting is not an object', adUnitCode);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
},
|
|
118
|
+
isValidPlacementId(placementId) {
|
|
119
|
+
return placementId.toString().match(/^[0-9]{10}$/);
|
|
120
|
+
},
|
|
121
|
+
buildRequests(validBidRequests, bidderRequest) {
|
|
122
|
+
this.loadConfiguredData(validBidRequests[0]);
|
|
123
|
+
this.propertyBag.buildRequestsStart = new Date().getTime();
|
|
124
|
+
logInfo(`buildRequests time: ${this.propertyBag.buildRequestsStart} v ${NEWSPASSVERSION} validBidRequests`, JSON.parse(JSON.stringify(validBidRequests)), 'bidderRequest', JSON.parse(JSON.stringify(bidderRequest)));
|
|
125
|
+
if (this.blockTheRequest()) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
let htmlParams = {'publisherId': '', 'siteId': ''};
|
|
129
|
+
if (validBidRequests.length > 0) {
|
|
130
|
+
this.cookieSyncBag.userIdObject = Object.assign(this.cookieSyncBag.userIdObject, this.findAllUserIds(validBidRequests[0]));
|
|
131
|
+
this.cookieSyncBag.siteId = deepAccess(validBidRequests[0], 'params.siteId');
|
|
132
|
+
this.cookieSyncBag.publisherId = deepAccess(validBidRequests[0], 'params.publisherId');
|
|
133
|
+
htmlParams = validBidRequests[0].params;
|
|
134
|
+
}
|
|
135
|
+
logInfo('cookie sync bag', this.cookieSyncBag);
|
|
136
|
+
let singleRequest = config.getConfig('newspassid.singleRequest');
|
|
137
|
+
singleRequest = singleRequest !== false; // undefined & true will be true
|
|
138
|
+
logInfo(`config newspassid.singleRequest : `, singleRequest);
|
|
139
|
+
let npRequest = {}; // we only want to set specific properties on this, not validBidRequests[0].params
|
|
140
|
+
logInfo('going to get ortb2 from bidder request...');
|
|
141
|
+
let fpd = deepAccess(bidderRequest, 'ortb2', null);
|
|
142
|
+
logInfo('got fpd: ', fpd);
|
|
143
|
+
if (fpd && deepAccess(fpd, 'user')) {
|
|
144
|
+
logInfo('added FPD user object');
|
|
145
|
+
npRequest.user = fpd.user;
|
|
146
|
+
}
|
|
147
|
+
const getParams = this.getGetParametersAsObject();
|
|
148
|
+
const isTestMode = getParams['nptestmode'] || null; // this can be any string, it's used for testing ads
|
|
149
|
+
npRequest.device = {'w': window.innerWidth, 'h': window.innerHeight};
|
|
150
|
+
let placementIdOverrideFromGetParam = this.getPlacementIdOverrideFromGetParam(); // null or string
|
|
151
|
+
let schain = null;
|
|
152
|
+
let tosendtags = validBidRequests.map(npBidRequest => {
|
|
153
|
+
var obj = {};
|
|
154
|
+
let placementId = placementIdOverrideFromGetParam || this.getPlacementId(npBidRequest); // prefer to use a valid override param, else the bidRequest placement Id
|
|
155
|
+
obj.id = npBidRequest.bidId; // this causes an error if we change it to something else, even if you update the bidRequest object: "WARNING: Bidder newspass made bid for unknown request ID: mb7953.859498327448. Ignoring."
|
|
156
|
+
obj.tagid = placementId;
|
|
157
|
+
let parsed = parseUrl(getRefererInfo().page);
|
|
158
|
+
obj.secure = parsed.protocol === 'https' ? 1 : 0;
|
|
159
|
+
let arrBannerSizes = [];
|
|
160
|
+
if (!npBidRequest.hasOwnProperty('mediaTypes')) {
|
|
161
|
+
if (npBidRequest.hasOwnProperty('sizes')) {
|
|
162
|
+
logInfo('no mediaTypes detected - will use the sizes array in the config root');
|
|
163
|
+
arrBannerSizes = npBidRequest.sizes;
|
|
164
|
+
} else {
|
|
165
|
+
logInfo('Cannot set sizes for banner type');
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
if (npBidRequest.mediaTypes.hasOwnProperty(BANNER)) {
|
|
169
|
+
arrBannerSizes = npBidRequest.mediaTypes[BANNER].sizes; /* Note - if there is a sizes element in the config root it will be pushed into here */
|
|
170
|
+
logInfo('setting banner size from the mediaTypes.banner element for bidId ' + obj.id + ': ', arrBannerSizes);
|
|
171
|
+
}
|
|
172
|
+
if (npBidRequest.mediaTypes.hasOwnProperty(NATIVE)) {
|
|
173
|
+
obj.native = npBidRequest.mediaTypes[NATIVE];
|
|
174
|
+
logInfo('setting native object from the mediaTypes.native element: ' + obj.id + ':', obj.native);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (arrBannerSizes.length > 0) {
|
|
178
|
+
obj.banner = {
|
|
179
|
+
topframe: 1,
|
|
180
|
+
w: arrBannerSizes[0][0] || 0,
|
|
181
|
+
h: arrBannerSizes[0][1] || 0,
|
|
182
|
+
format: arrBannerSizes.map(s => {
|
|
183
|
+
return {w: s[0], h: s[1]};
|
|
184
|
+
})
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
obj.placementId = placementId;
|
|
188
|
+
deepSetValue(obj, 'ext.prebid', {'storedrequest': {'id': placementId}});
|
|
189
|
+
obj.ext['newspassid'] = {};
|
|
190
|
+
obj.ext['newspassid'].adUnitCode = npBidRequest.adUnitCode; // eg. 'mpu'
|
|
191
|
+
obj.ext['newspassid'].transactionId = npBidRequest.transactionId; // this is the transactionId PER adUnit, common across bidders for this unit
|
|
192
|
+
if (npBidRequest.params.hasOwnProperty('customData')) {
|
|
193
|
+
obj.ext['newspassid'].customData = npBidRequest.params.customData;
|
|
194
|
+
}
|
|
195
|
+
logInfo(`obj.ext.newspassid is `, obj.ext['newspassid']);
|
|
196
|
+
if (isTestMode != null) {
|
|
197
|
+
logInfo('setting isTestMode to ', isTestMode);
|
|
198
|
+
if (obj.ext['newspassid'].hasOwnProperty('customData')) {
|
|
199
|
+
for (let i = 0; i < obj.ext['newspassid'].customData.length; i++) {
|
|
200
|
+
obj.ext['newspassid'].customData[i]['targeting']['nptestmode'] = isTestMode;
|
|
201
|
+
}
|
|
202
|
+
} else {
|
|
203
|
+
obj.ext['newspassid'].customData = [{'settings': {}, 'targeting': {}}];
|
|
204
|
+
obj.ext['newspassid'].customData[0].targeting['nptestmode'] = isTestMode;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (fpd && deepAccess(fpd, 'site')) {
|
|
208
|
+
logInfo('adding fpd.site');
|
|
209
|
+
if (deepAccess(obj, 'ext.newspassid.customData.0.targeting', false)) {
|
|
210
|
+
obj.ext.newspassid.customData[0].targeting = Object.assign(obj.ext.newspassid.customData[0].targeting, fpd.site);
|
|
211
|
+
} else {
|
|
212
|
+
deepSetValue(obj, 'ext.newspassid.customData.0.targeting', fpd.site);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (!schain && deepAccess(npBidRequest, 'schain')) {
|
|
216
|
+
schain = npBidRequest.schain;
|
|
217
|
+
}
|
|
218
|
+
return obj;
|
|
219
|
+
});
|
|
220
|
+
let extObj = {};
|
|
221
|
+
extObj['newspassid'] = {};
|
|
222
|
+
extObj['newspassid']['np_pb_v'] = NEWSPASSVERSION;
|
|
223
|
+
extObj['newspassid']['np_rw'] = placementIdOverrideFromGetParam ? 1 : 0;
|
|
224
|
+
if (validBidRequests.length > 0) {
|
|
225
|
+
let userIds = this.cookieSyncBag.userIdObject; // 2021-01-06 - slight optimisation - we've already found this info
|
|
226
|
+
if (userIds.hasOwnProperty('pubcid')) {
|
|
227
|
+
extObj['newspassid'].pubcid = userIds.pubcid;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
extObj['newspassid'].pv = this.getPageId(); // attach the page ID that will be common to all auction calls for this page if refresh() is called
|
|
231
|
+
let whitelistAdserverKeys = config.getConfig('newspassid.np_whitelist_adserver_keys');
|
|
232
|
+
let useWhitelistAdserverKeys = isArray(whitelistAdserverKeys) && whitelistAdserverKeys.length > 0;
|
|
233
|
+
extObj['newspassid']['np_kvp_rw'] = useWhitelistAdserverKeys ? 1 : 0;
|
|
234
|
+
if (getParams.hasOwnProperty('npf')) { extObj['newspassid']['npf'] = getParams.npf === 'true' || getParams.npf === '1' ? 1 : 0; }
|
|
235
|
+
if (getParams.hasOwnProperty('nppf')) { extObj['newspassid']['nppf'] = getParams.nppf === 'true' || getParams.nppf === '1' ? 1 : 0; }
|
|
236
|
+
if (getParams.hasOwnProperty('nprp') && getParams.nprp.match(/^[0-3]$/)) { extObj['newspassid']['nprp'] = parseInt(getParams.nprp); }
|
|
237
|
+
if (getParams.hasOwnProperty('npip') && getParams.npip.match(/^\d+$/)) { extObj['newspassid']['npip'] = parseInt(getParams.npip); }
|
|
238
|
+
if (this.propertyBag.endpointOverride != null) { extObj['newspassid']['origin'] = this.propertyBag.endpointOverride; }
|
|
239
|
+
let userExtEids = deepAccess(validBidRequests, '0.userIdAsEids', []); // generate the UserIDs in the correct format for UserId module
|
|
240
|
+
npRequest.site = {
|
|
241
|
+
'publisher': {'id': htmlParams.publisherId},
|
|
242
|
+
'page': getRefererInfo().page,
|
|
243
|
+
'id': htmlParams.siteId
|
|
244
|
+
};
|
|
245
|
+
npRequest.test = config.getConfig('debug') ? 1 : 0;
|
|
246
|
+
if (bidderRequest && bidderRequest.uspConsent) {
|
|
247
|
+
logInfo('ADDING USP consent info');
|
|
248
|
+
deepSetValue(npRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent);
|
|
249
|
+
} else {
|
|
250
|
+
logInfo('WILL NOT ADD USP consent info; no bidderRequest.uspConsent.');
|
|
251
|
+
}
|
|
252
|
+
if (schain) { // we set this while iterating over the bids
|
|
253
|
+
logInfo('schain found');
|
|
254
|
+
deepSetValue(npRequest, 'source.ext.schain', schain);
|
|
255
|
+
}
|
|
256
|
+
if (config.getConfig('coppa') === true) {
|
|
257
|
+
deepSetValue(npRequest, 'regs.coppa', 1);
|
|
258
|
+
}
|
|
259
|
+
if (singleRequest) {
|
|
260
|
+
logInfo('buildRequests starting to generate response for a single request');
|
|
261
|
+
npRequest.id = bidderRequest.auctionId; // Unique ID of the bid request, provided by the exchange.
|
|
262
|
+
npRequest.auctionId = bidderRequest.auctionId; // not sure if this should be here?
|
|
263
|
+
npRequest.imp = tosendtags;
|
|
264
|
+
npRequest.ext = extObj;
|
|
265
|
+
deepSetValue(npRequest, 'source.tid', bidderRequest.auctionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
|
|
266
|
+
deepSetValue(npRequest, 'user.ext.eids', userExtEids);
|
|
267
|
+
var ret = {
|
|
268
|
+
method: 'POST',
|
|
269
|
+
url: this.getAuctionUrl(),
|
|
270
|
+
data: JSON.stringify(npRequest),
|
|
271
|
+
bidderRequest: bidderRequest
|
|
272
|
+
};
|
|
273
|
+
logInfo('buildRequests request data for single = ', JSON.parse(JSON.stringify(npRequest)));
|
|
274
|
+
this.propertyBag.buildRequestsEnd = new Date().getTime();
|
|
275
|
+
logInfo(`buildRequests going to return for single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, ret);
|
|
276
|
+
return ret;
|
|
277
|
+
}
|
|
278
|
+
let arrRet = tosendtags.map(imp => {
|
|
279
|
+
logInfo('buildRequests starting to generate non-single response, working on imp : ', imp);
|
|
280
|
+
let npRequestSingle = Object.assign({}, npRequest);
|
|
281
|
+
imp.ext['newspassid'].pageAuctionId = bidderRequest['auctionId']; // make a note in the ext object of what the original auctionId was, in the bidderRequest object
|
|
282
|
+
npRequestSingle.id = imp.ext['newspassid'].transactionId; // Unique ID of the bid request, provided by the exchange.
|
|
283
|
+
npRequestSingle.auctionId = imp.ext['newspassid'].transactionId; // not sure if this should be here?
|
|
284
|
+
npRequestSingle.imp = [imp];
|
|
285
|
+
npRequestSingle.ext = extObj;
|
|
286
|
+
deepSetValue(npRequestSingle, 'source.tid', imp.ext['newspassid'].transactionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
|
|
287
|
+
deepSetValue(npRequestSingle, 'user.ext.eids', userExtEids);
|
|
288
|
+
logInfo('buildRequests RequestSingle (for non-single) = ', npRequestSingle);
|
|
289
|
+
return {
|
|
290
|
+
method: 'POST',
|
|
291
|
+
url: this.getAuctionUrl(),
|
|
292
|
+
data: JSON.stringify(npRequestSingle),
|
|
293
|
+
bidderRequest: bidderRequest
|
|
294
|
+
};
|
|
295
|
+
});
|
|
296
|
+
this.propertyBag.buildRequestsEnd = new Date().getTime();
|
|
297
|
+
logInfo(`buildRequests going to return for non-single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, arrRet);
|
|
298
|
+
return arrRet;
|
|
299
|
+
},
|
|
300
|
+
interpretResponse(serverResponse, request) {
|
|
301
|
+
if (request && request.bidderRequest && request.bidderRequest.bids) { this.loadConfiguredData(request.bidderRequest.bids[0]); }
|
|
302
|
+
let startTime = new Date().getTime();
|
|
303
|
+
logInfo(`interpretResponse time: ${startTime}. buildRequests done -> interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`);
|
|
304
|
+
logInfo(`serverResponse, request`, JSON.parse(JSON.stringify(serverResponse)), JSON.parse(JSON.stringify(request)));
|
|
305
|
+
serverResponse = serverResponse.body || {};
|
|
306
|
+
if (!serverResponse.hasOwnProperty('seatbid')) {
|
|
307
|
+
return [];
|
|
308
|
+
}
|
|
309
|
+
if (typeof serverResponse.seatbid !== 'object') {
|
|
310
|
+
return [];
|
|
311
|
+
}
|
|
312
|
+
let arrAllBids = [];
|
|
313
|
+
let enhancedAdserverTargeting = config.getConfig('newspassid.enhancedAdserverTargeting');
|
|
314
|
+
logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
|
|
315
|
+
if (typeof enhancedAdserverTargeting == 'undefined') {
|
|
316
|
+
enhancedAdserverTargeting = true;
|
|
317
|
+
}
|
|
318
|
+
logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
|
|
319
|
+
serverResponse.seatbid = injectAdIdsIntoAllBidResponses(serverResponse.seatbid); // we now make sure that each bid in the bidresponse has a unique (within page) adId attribute.
|
|
320
|
+
serverResponse.seatbid = this.removeSingleBidderMultipleBids(serverResponse.seatbid);
|
|
321
|
+
let whitelistAdserverKeys = config.getConfig('newspassid.np_whitelist_adserver_keys');
|
|
322
|
+
let useWhitelistAdserverKeys = isArray(whitelistAdserverKeys) && whitelistAdserverKeys.length > 0;
|
|
323
|
+
for (let i = 0; i < serverResponse.seatbid.length; i++) {
|
|
324
|
+
let sb = serverResponse.seatbid[i];
|
|
325
|
+
for (let j = 0; j < sb.bid.length; j++) {
|
|
326
|
+
let thisRequestBid = this.getBidRequestForBidId(sb.bid[j].impid, request.bidderRequest.bids);
|
|
327
|
+
logInfo(`seatbid:${i}, bid:${j} Going to set default w h for seatbid/bidRequest`, sb.bid[j], thisRequestBid);
|
|
328
|
+
const {defaultWidth, defaultHeight} = defaultSize(thisRequestBid);
|
|
329
|
+
let thisBid = this.addStandardProperties(sb.bid[j], defaultWidth, defaultHeight);
|
|
330
|
+
thisBid.meta = {advertiserDomains: thisBid.adomain || []};
|
|
331
|
+
let bidType = deepAccess(thisBid, 'ext.prebid.type');
|
|
332
|
+
logInfo(`this bid type is : ${bidType}`, j);
|
|
333
|
+
let adserverTargeting = {};
|
|
334
|
+
if (enhancedAdserverTargeting) {
|
|
335
|
+
let allBidsForThisBidid = this.getAllBidsForBidId(thisBid.bidId, serverResponse.seatbid);
|
|
336
|
+
logInfo('Going to iterate allBidsForThisBidId', allBidsForThisBidid);
|
|
337
|
+
Object.keys(allBidsForThisBidid).forEach((bidderName, index, ar2) => {
|
|
338
|
+
logInfo(`adding adserverTargeting for ${bidderName} for bidId ${thisBid.bidId}`);
|
|
339
|
+
adserverTargeting['np_' + bidderName] = bidderName;
|
|
340
|
+
adserverTargeting['np_' + bidderName + '_crid'] = String(allBidsForThisBidid[bidderName].crid);
|
|
341
|
+
adserverTargeting['np_' + bidderName + '_adv'] = String(allBidsForThisBidid[bidderName].adomain);
|
|
342
|
+
adserverTargeting['np_' + bidderName + '_adId'] = String(allBidsForThisBidid[bidderName].adId);
|
|
343
|
+
adserverTargeting['np_' + bidderName + '_pb_r'] = getRoundedBid(allBidsForThisBidid[bidderName].price, allBidsForThisBidid[bidderName].ext.prebid.type);
|
|
344
|
+
if (allBidsForThisBidid[bidderName].hasOwnProperty('dealid')) {
|
|
345
|
+
adserverTargeting['np_' + bidderName + '_dealid'] = String(allBidsForThisBidid[bidderName].dealid);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
} else {
|
|
349
|
+
logInfo(`newspassid.enhancedAdserverTargeting is set to false, no per-bid keys will be sent to adserver.`);
|
|
350
|
+
}
|
|
351
|
+
let {seat: winningSeat, bid: winningBid} = this.getWinnerForRequestBid(thisBid.bidId, serverResponse.seatbid);
|
|
352
|
+
adserverTargeting['np_auc_id'] = String(request.bidderRequest.auctionId);
|
|
353
|
+
adserverTargeting['np_winner'] = String(winningSeat);
|
|
354
|
+
adserverTargeting['np_bid'] = 'true';
|
|
355
|
+
if (enhancedAdserverTargeting) {
|
|
356
|
+
adserverTargeting['np_imp_id'] = String(winningBid.impid);
|
|
357
|
+
adserverTargeting['np_pb_r'] = getRoundedBid(winningBid.price, bidType);
|
|
358
|
+
adserverTargeting['np_adId'] = String(winningBid.adId);
|
|
359
|
+
adserverTargeting['np_size'] = `${winningBid.width}x${winningBid.height}`;
|
|
360
|
+
}
|
|
361
|
+
if (useWhitelistAdserverKeys) { // delete any un-whitelisted keys
|
|
362
|
+
logInfo('Going to filter out adserver targeting keys not in the whitelist: ', whitelistAdserverKeys);
|
|
363
|
+
Object.keys(adserverTargeting).forEach(function(key) { if (whitelistAdserverKeys.indexOf(key) === -1) { delete adserverTargeting[key]; } });
|
|
364
|
+
}
|
|
365
|
+
thisBid.adserverTargeting = adserverTargeting;
|
|
366
|
+
arrAllBids.push(thisBid);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
let endTime = new Date().getTime();
|
|
370
|
+
logInfo(`interpretResponse going to return at time ${endTime} (took ${endTime - startTime}ms) Time from buildRequests Start -> interpretRequests End = ${endTime - this.propertyBag.buildRequestsStart}ms`, arrAllBids);
|
|
371
|
+
return arrAllBids;
|
|
372
|
+
},
|
|
373
|
+
removeSingleBidderMultipleBids(seatbid) {
|
|
374
|
+
var ret = [];
|
|
375
|
+
for (let i = 0; i < seatbid.length; i++) {
|
|
376
|
+
let sb = seatbid[i];
|
|
377
|
+
var retSeatbid = {'seat': sb.seat, 'bid': []};
|
|
378
|
+
var bidIds = [];
|
|
379
|
+
for (let j = 0; j < sb.bid.length; j++) {
|
|
380
|
+
var candidate = sb.bid[j];
|
|
381
|
+
if (contains(bidIds, candidate.impid)) {
|
|
382
|
+
continue; // we've already fully assessed this impid, found the highest bid from this seat for it
|
|
383
|
+
}
|
|
384
|
+
bidIds.push(candidate.impid);
|
|
385
|
+
for (let k = j + 1; k < sb.bid.length; k++) {
|
|
386
|
+
if (sb.bid[k].impid === candidate.impid && sb.bid[k].price > candidate.price) {
|
|
387
|
+
candidate = sb.bid[k];
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
retSeatbid.bid.push(candidate);
|
|
391
|
+
}
|
|
392
|
+
ret.push(retSeatbid);
|
|
393
|
+
}
|
|
394
|
+
return ret;
|
|
395
|
+
},
|
|
396
|
+
getUserSyncs(optionsType, serverResponse, gdprConsent, usPrivacy) {
|
|
397
|
+
logInfo('getUserSyncs optionsType', optionsType, 'serverResponse', serverResponse, 'usPrivacy', usPrivacy, 'cookieSyncBag', this.cookieSyncBag);
|
|
398
|
+
if (!serverResponse || serverResponse.length === 0) {
|
|
399
|
+
return [];
|
|
400
|
+
}
|
|
401
|
+
if (optionsType.iframeEnabled) {
|
|
402
|
+
var arrQueryString = [];
|
|
403
|
+
if (config.getConfig('debug')) {
|
|
404
|
+
arrQueryString.push('pbjs_debug=true');
|
|
405
|
+
}
|
|
406
|
+
arrQueryString.push('usp_consent=' + (usPrivacy || ''));
|
|
407
|
+
for (let keyname in this.cookieSyncBag.userIdObject) {
|
|
408
|
+
arrQueryString.push(keyname + '=' + this.cookieSyncBag.userIdObject[keyname]);
|
|
409
|
+
}
|
|
410
|
+
arrQueryString.push('publisherId=' + this.cookieSyncBag.publisherId);
|
|
411
|
+
arrQueryString.push('siteId=' + this.cookieSyncBag.siteId);
|
|
412
|
+
arrQueryString.push('cb=' + Date.now());
|
|
413
|
+
arrQueryString.push('bidder=' + this.propertyBag.config.bidder);
|
|
414
|
+
var strQueryString = arrQueryString.join('&');
|
|
415
|
+
if (strQueryString.length > 0) {
|
|
416
|
+
strQueryString = '?' + strQueryString;
|
|
417
|
+
}
|
|
418
|
+
logInfo('getUserSyncs going to return cookie sync url : ' + this.getCookieSyncUrl() + strQueryString);
|
|
419
|
+
return [{
|
|
420
|
+
type: 'iframe',
|
|
421
|
+
url: this.getCookieSyncUrl() + strQueryString
|
|
422
|
+
}];
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
getBidRequestForBidId(bidId, arrBids) {
|
|
426
|
+
for (let i = 0; i < arrBids.length; i++) {
|
|
427
|
+
if (arrBids[i].bidId === bidId) { // bidId in the request comes back as impid in the seatbid bids
|
|
428
|
+
return arrBids[i];
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return null;
|
|
432
|
+
},
|
|
433
|
+
findAllUserIds(bidRequest) {
|
|
434
|
+
var ret = {};
|
|
435
|
+
let searchKeysSingle = ['pubcid', 'tdid', 'idl_env', 'criteoId', 'lotamePanoramaId', 'fabrickId'];
|
|
436
|
+
if (bidRequest.hasOwnProperty('userId')) {
|
|
437
|
+
for (let arrayId in searchKeysSingle) {
|
|
438
|
+
let key = searchKeysSingle[arrayId];
|
|
439
|
+
if (bidRequest.userId.hasOwnProperty(key)) {
|
|
440
|
+
if (typeof (bidRequest.userId[key]) == 'string') {
|
|
441
|
+
ret[key] = bidRequest.userId[key];
|
|
442
|
+
} else if (typeof (bidRequest.userId[key]) == 'object') {
|
|
443
|
+
logError(`WARNING: findAllUserIds had to use first key in user object to get value for bid.userId key: ${key}. Prebid adapter should be updated.`);
|
|
444
|
+
ret[key] = bidRequest.userId[key][Object.keys(bidRequest.userId[key])[0]]; // cannot use Object.values
|
|
445
|
+
} else {
|
|
446
|
+
logError(`failed to get string key value for userId : ${key}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
let lipbid = deepAccess(bidRequest.userId, 'lipb.lipbid');
|
|
451
|
+
if (lipbid) {
|
|
452
|
+
ret['lipb'] = {'lipbid': lipbid};
|
|
453
|
+
}
|
|
454
|
+
let id5id = deepAccess(bidRequest.userId, 'id5id.uid');
|
|
455
|
+
if (id5id) {
|
|
456
|
+
ret['id5id'] = id5id;
|
|
457
|
+
}
|
|
458
|
+
let parrableId = deepAccess(bidRequest.userId, 'parrableId.eid');
|
|
459
|
+
if (parrableId) {
|
|
460
|
+
ret['parrableId'] = parrableId;
|
|
461
|
+
}
|
|
462
|
+
let sharedid = deepAccess(bidRequest.userId, 'sharedid.id');
|
|
463
|
+
if (sharedid) {
|
|
464
|
+
ret['sharedid'] = sharedid;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
if (!ret.hasOwnProperty('pubcid')) {
|
|
468
|
+
let pubcid = deepAccess(bidRequest, 'crumbs.pubcid');
|
|
469
|
+
if (pubcid) {
|
|
470
|
+
ret['pubcid'] = pubcid; // if built with old pubCommonId module
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return ret;
|
|
474
|
+
},
|
|
475
|
+
getPlacementId(bidRequest) {
|
|
476
|
+
return (bidRequest.params.placementId).toString();
|
|
477
|
+
},
|
|
478
|
+
getPlacementIdOverrideFromGetParam() {
|
|
479
|
+
let arr = this.getGetParametersAsObject();
|
|
480
|
+
if (arr.hasOwnProperty('npstoredrequest')) {
|
|
481
|
+
if (this.isValidPlacementId(arr['npstoredrequest'])) {
|
|
482
|
+
logInfo(`using GET npstoredrequest ` + arr['npstoredrequest'] + ' to replace placementId');
|
|
483
|
+
return arr['npstoredrequest'];
|
|
484
|
+
} else {
|
|
485
|
+
logError(`GET npstoredrequest FAILED VALIDATION - will not use it`);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return null;
|
|
489
|
+
},
|
|
490
|
+
getGetParametersAsObject() {
|
|
491
|
+
let parsed = parseUrl(getRefererInfo().page);
|
|
492
|
+
logInfo('getGetParametersAsObject found:', parsed.search);
|
|
493
|
+
return parsed.search;
|
|
494
|
+
},
|
|
495
|
+
blockTheRequest() {
|
|
496
|
+
let npRequest = config.getConfig('newspassid.np_request');
|
|
497
|
+
if (typeof npRequest == 'boolean' && !npRequest) {
|
|
498
|
+
logWarn(`Will not allow auction : np_request is set to false`);
|
|
499
|
+
return true;
|
|
500
|
+
}
|
|
501
|
+
return false;
|
|
502
|
+
},
|
|
503
|
+
getPageId: function() {
|
|
504
|
+
if (this.propertyBag.pageId == null) {
|
|
505
|
+
let randPart = '';
|
|
506
|
+
let allowable = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|
507
|
+
for (let i = 20; i > 0; i--) {
|
|
508
|
+
randPart += allowable[Math.floor(Math.random() * 36)];
|
|
509
|
+
}
|
|
510
|
+
this.propertyBag.pageId = new Date().getTime() + '_' + randPart;
|
|
511
|
+
}
|
|
512
|
+
return this.propertyBag.pageId;
|
|
513
|
+
},
|
|
514
|
+
addStandardProperties(seatBid, defaultWidth, defaultHeight) {
|
|
515
|
+
seatBid.cpm = seatBid.price;
|
|
516
|
+
seatBid.bidId = seatBid.impid;
|
|
517
|
+
seatBid.requestId = seatBid.impid;
|
|
518
|
+
seatBid.width = seatBid.w || defaultWidth;
|
|
519
|
+
seatBid.height = seatBid.h || defaultHeight;
|
|
520
|
+
seatBid.ad = seatBid.adm;
|
|
521
|
+
seatBid.netRevenue = true;
|
|
522
|
+
seatBid.creativeId = seatBid.crid;
|
|
523
|
+
seatBid.currency = 'USD';
|
|
524
|
+
seatBid.ttl = 300;
|
|
525
|
+
return seatBid;
|
|
526
|
+
},
|
|
527
|
+
getWinnerForRequestBid(requestBidId, serverResponseSeatBid) {
|
|
528
|
+
let thisBidWinner = null;
|
|
529
|
+
let winningSeat = null;
|
|
530
|
+
for (let j = 0; j < serverResponseSeatBid.length; j++) {
|
|
531
|
+
let theseBids = serverResponseSeatBid[j].bid;
|
|
532
|
+
let thisSeat = serverResponseSeatBid[j].seat;
|
|
533
|
+
for (let k = 0; k < theseBids.length; k++) {
|
|
534
|
+
if (theseBids[k].impid === requestBidId) {
|
|
535
|
+
if ((thisBidWinner == null) || (thisBidWinner.price < theseBids[k].price)) {
|
|
536
|
+
thisBidWinner = theseBids[k];
|
|
537
|
+
winningSeat = thisSeat;
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
return {'seat': winningSeat, 'bid': thisBidWinner};
|
|
544
|
+
},
|
|
545
|
+
getAllBidsForBidId(matchBidId, serverResponseSeatBid) {
|
|
546
|
+
let objBids = {};
|
|
547
|
+
for (let j = 0; j < serverResponseSeatBid.length; j++) {
|
|
548
|
+
let theseBids = serverResponseSeatBid[j].bid;
|
|
549
|
+
let thisSeat = serverResponseSeatBid[j].seat;
|
|
550
|
+
for (let k = 0; k < theseBids.length; k++) {
|
|
551
|
+
if (theseBids[k].impid === matchBidId) {
|
|
552
|
+
if (objBids.hasOwnProperty(thisSeat)) { // > 1 bid for an adunit from a bidder - only use the one with the highest bid
|
|
553
|
+
if (objBids[thisSeat]['price'] < theseBids[k].price) {
|
|
554
|
+
objBids[thisSeat] = theseBids[k];
|
|
555
|
+
}
|
|
556
|
+
} else {
|
|
557
|
+
objBids[thisSeat] = theseBids[k];
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return objBids;
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
export function injectAdIdsIntoAllBidResponses(seatbid) {
|
|
566
|
+
logInfo('injectAdIdsIntoAllBidResponses', seatbid);
|
|
567
|
+
for (let i = 0; i < seatbid.length; i++) {
|
|
568
|
+
let sb = seatbid[i];
|
|
569
|
+
for (let j = 0; j < sb.bid.length; j++) {
|
|
570
|
+
sb.bid[j]['adId'] = `${sb.bid[j]['impid']}-${i}-np-${j}`;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
return seatbid;
|
|
574
|
+
}
|
|
575
|
+
export function checkDeepArray(Arr) {
|
|
576
|
+
if (Array.isArray(Arr)) {
|
|
577
|
+
if (Array.isArray(Arr[0])) {
|
|
578
|
+
return Arr[0];
|
|
579
|
+
} else {
|
|
580
|
+
return Arr;
|
|
581
|
+
}
|
|
582
|
+
} else {
|
|
583
|
+
return Arr;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
export function defaultSize(thebidObj) {
|
|
587
|
+
if (!thebidObj) {
|
|
588
|
+
logInfo('defaultSize received empty bid obj! going to return fixed default size');
|
|
589
|
+
return {
|
|
590
|
+
'defaultHeight': 250,
|
|
591
|
+
'defaultWidth': 300
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
const {sizes} = thebidObj;
|
|
595
|
+
const returnObject = {};
|
|
596
|
+
returnObject.defaultWidth = checkDeepArray(sizes)[0];
|
|
597
|
+
returnObject.defaultHeight = checkDeepArray(sizes)[1];
|
|
598
|
+
return returnObject;
|
|
599
|
+
}
|
|
600
|
+
export function getRoundedBid(price, mediaType) {
|
|
601
|
+
const mediaTypeGranularity = config.getConfig(`mediaTypePriceGranularity.${mediaType}`); // might be string or object or nothing; if set then this takes precedence over 'priceGranularity'
|
|
602
|
+
let objBuckets = config.getConfig('customPriceBucket'); // this is always an object - {} if strBuckets is not 'custom'
|
|
603
|
+
let strBuckets = config.getConfig('priceGranularity'); // priceGranularity value, always a string ** if priceGranularity is set to an object then it's always 'custom' **
|
|
604
|
+
let theConfigObject = getGranularityObject(mediaType, mediaTypeGranularity, strBuckets, objBuckets);
|
|
605
|
+
let theConfigKey = getGranularityKeyName(mediaType, mediaTypeGranularity, strBuckets);
|
|
606
|
+
logInfo('getRoundedBid. price:', price, 'mediaType:', mediaType, 'configkey:', theConfigKey, 'configObject:', theConfigObject, 'mediaTypeGranularity:', mediaTypeGranularity, 'strBuckets:', strBuckets);
|
|
607
|
+
let priceStringsObj = getPriceBucketString(
|
|
608
|
+
price,
|
|
609
|
+
theConfigObject,
|
|
610
|
+
config.getConfig('currency.granularityMultiplier')
|
|
611
|
+
);
|
|
612
|
+
logInfo('priceStringsObj', priceStringsObj);
|
|
613
|
+
let granularityNamePriceStringsKeyMapping = {
|
|
614
|
+
'medium': 'med',
|
|
615
|
+
'custom': 'custom',
|
|
616
|
+
'high': 'high',
|
|
617
|
+
'low': 'low',
|
|
618
|
+
'dense': 'dense'
|
|
619
|
+
};
|
|
620
|
+
if (granularityNamePriceStringsKeyMapping.hasOwnProperty(theConfigKey)) {
|
|
621
|
+
let priceStringsKey = granularityNamePriceStringsKeyMapping[theConfigKey];
|
|
622
|
+
logInfo('getRoundedBid: looking for priceStringsKey:', priceStringsKey);
|
|
623
|
+
return priceStringsObj[priceStringsKey];
|
|
624
|
+
}
|
|
625
|
+
return priceStringsObj['auto'];
|
|
626
|
+
}
|
|
627
|
+
export function getGranularityKeyName(mediaType, mediaTypeGranularity, strBuckets) {
|
|
628
|
+
if (typeof mediaTypeGranularity === 'string') {
|
|
629
|
+
return mediaTypeGranularity;
|
|
630
|
+
}
|
|
631
|
+
if (typeof mediaTypeGranularity === 'object') {
|
|
632
|
+
return 'custom';
|
|
633
|
+
}
|
|
634
|
+
if (typeof strBuckets === 'string') {
|
|
635
|
+
return strBuckets;
|
|
636
|
+
}
|
|
637
|
+
return 'auto'; // fall back to a default key - should literally never be needed.
|
|
638
|
+
}
|
|
639
|
+
export function getGranularityObject(mediaType, mediaTypeGranularity, strBuckets, objBuckets) {
|
|
640
|
+
if (typeof mediaTypeGranularity === 'object') {
|
|
641
|
+
return mediaTypeGranularity;
|
|
642
|
+
}
|
|
643
|
+
if (strBuckets === 'custom') {
|
|
644
|
+
return objBuckets;
|
|
645
|
+
}
|
|
646
|
+
return '';
|
|
647
|
+
}
|
|
648
|
+
registerBidder(spec);
|
|
649
|
+
logInfo(`*BidAdapter ${NEWSPASSVERSION} was loaded`);
|
|
@@ -35,8 +35,11 @@ export const spec = {
|
|
|
35
35
|
|
|
36
36
|
'nextMillennium': {
|
|
37
37
|
'refresh_count': window.nmmRefreshCounts[bid.adUnitCode]++,
|
|
38
|
+
'elOffsets': getBoundingClient(bid),
|
|
39
|
+
'scrollTop': window.pageYOffset || document.documentElement.scrollTop
|
|
38
40
|
}
|
|
39
|
-
}
|
|
41
|
+
},
|
|
42
|
+
...bid.ortb2
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
const gdprConsent = bidderRequest && bidderRequest.gdprConsent;
|
|
@@ -132,6 +135,19 @@ export const spec = {
|
|
|
132
135
|
}];
|
|
133
136
|
},
|
|
134
137
|
};
|
|
138
|
+
function getAdEl(bid) {
|
|
139
|
+
// best way I could think of to get El, is by matching adUnitCode to google slots...
|
|
140
|
+
const slot = window.googletag && window.googletag.pubads && window.googletag.pubads().getSlots().find(slot => slot.getAdUnitPath() === bid.adUnitCode);
|
|
141
|
+
const slotElementId = slot && slot.getSlotElementId();
|
|
142
|
+
if (!slotElementId) return null;
|
|
143
|
+
return document.querySelector('#' + slotElementId);
|
|
144
|
+
}
|
|
145
|
+
function getBoundingClient(bid) {
|
|
146
|
+
// console.log(bid)
|
|
147
|
+
const el = getAdEl(bid)
|
|
148
|
+
if (!el) return {}
|
|
149
|
+
return el.getBoundingClientRect();
|
|
150
|
+
}
|
|
135
151
|
|
|
136
152
|
function getPlacementId(bid) {
|
|
137
153
|
const groupId = getBidIdParameter('group_id', bid.params)
|