prebid.js 7.4.0 → 7.7.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/1plusXRtdProvider.js +1 -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/adnuntiusBidAdapter.js +1 -1
- package/dist/adoceanBidAdapter.js +1 -1
- package/dist/adotBidAdapter.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/bliinkBidAdapter.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/currency.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/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/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/naveggIdSystem.js +1 -1
- package/dist/newspassidBidAdapter.js +1 -0
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +131 -128
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.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 +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- 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 -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/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.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/integrationExamples/gpt/1plusXRtdProviderExample.html +112 -0
- package/karma.conf.maker.js +3 -1
- package/modules/.submodules.json +2 -1
- package/modules/1plusXRtdProvider.js +251 -0
- package/modules/1plusXRtdProvider.md +65 -0
- package/modules/adgenerationBidAdapter.js +24 -1
- package/modules/adnuntiusBidAdapter.js +26 -8
- package/modules/adoceanBidAdapter.js +10 -3
- 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/big-richmediaBidAdapter.js +3 -3
- package/modules/bliinkBidAdapter.js +120 -193
- package/modules/bliinkBidAdapter.md +2 -5
- package/modules/byDataAnalyticsAdapter.js +172 -74
- package/modules/byDataAnalyticsAdapter.md +5 -6
- package/modules/consumableBidAdapter.js +21 -1
- package/modules/criteoBidAdapter.js +7 -1
- package/modules/currency.js +2 -2
- package/modules/cwireBidAdapter.md +1 -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/impactifyBidAdapter.js +6 -2
- package/modules/ixBidAdapter.js +133 -23
- package/modules/ixBidAdapter.md +2 -5
- package/modules/jixieBidAdapter.js +10 -10
- package/modules/kargoAnalyticsAdapter.js +88 -6
- package/modules/kargoAnalyticsAdapter.md +33 -0
- package/modules/minutemediaBidAdapter.js +1 -0
- package/modules/naveggIdSystem.js +1 -12
- package/modules/newspassidBidAdapter.js +649 -0
- package/modules/nextMillenniumBidAdapter.js +17 -1
- package/modules/nextMillenniumBidAdapter.md +1 -1
- package/modules/oguryBidAdapter.js +2 -0
- package/modules/onetagBidAdapter.js +44 -7
- package/modules/prebidServerBidAdapter/index.js +7 -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/rubiconBidAdapter.js +5 -0
- package/modules/seedingAllianceBidAdapter.js +3 -0
- package/modules/seedtagBidAdapter.js +37 -1
- package/modules/sharedIdSystem.js +11 -5
- package/modules/sharethroughBidAdapter.js +9 -24
- package/modules/taboolaBidAdapter.js +1 -1
- package/modules/taboolaBidAdapter.md +3 -3
- package/modules/targetVideoBidAdapter.js +18 -0
- package/modules/userId/index.js +39 -21
- package/package.json +1 -1
- package/src/auction.js +6 -5
- package/src/consentHandler.js +11 -11
- package/src/debugging.js +5 -3
- package/src/hook.js +2 -2
- package/src/storageManager.js +4 -5
- package/src/utils/promise.js +96 -21
- package/src/utils.js +3 -2
- package/test/helpers/consentData.js +2 -1
- package/test/spec/auctionmanager_spec.js +1 -6
- package/test/spec/debugging_spec.js +2 -2
- package/test/spec/modules/1plusXRtdProvider_spec.js +430 -0
- package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -4
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +126 -14
- package/test/spec/modules/adoceanBidAdapter_spec.js +4 -1
- 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/bliinkBidAdapter_spec.js +323 -136
- package/test/spec/modules/byDataAnalyticsAdapter_spec.js +74 -24
- package/test/spec/modules/consumableBidAdapter_spec.js +122 -1
- package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
- 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/idxIdSystem_spec.js +1 -1
- package/test/spec/modules/imRtdProvider_spec.js +0 -1
- package/test/spec/modules/ixBidAdapter_spec.js +212 -5
- package/test/spec/modules/jixieBidAdapter_spec.js +8 -8
- package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
- package/test/spec/modules/minutemediaBidAdapter_spec.js +3 -0
- package/test/spec/modules/newspassidBidAdapter_spec.js +1793 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +20 -0
- package/test/spec/modules/onetagBidAdapter_spec.js +53 -4
- package/test/spec/modules/parrableIdSystem_spec.js +2 -1
- package/test/spec/modules/prebidServerBidAdapter_spec.js +20 -0
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +5 -0
- package/test/spec/modules/rasBidAdapter_spec.js +190 -0
- package/test/spec/modules/rubiconBidAdapter_spec.js +27 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +29 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
- package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
- package/test/spec/modules/targetVideoBidAdapter_spec.js +43 -0
- package/test/spec/modules/userId_spec.js +15 -2
- package/test/spec/unit/pbjs_api_spec.js +1 -5
- package/test/spec/unit/utils/promise_spec.js +283 -38
- package/test/helpers/syncPromise.js +0 -71
package/modules/ixBidAdapter.js
CHANGED
|
@@ -30,7 +30,6 @@ 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
34
|
const SUPPORTED_AD_TYPES = [BANNER, VIDEO, NATIVE];
|
|
36
35
|
const BANNER_ENDPOINT_VERSION = 7.2;
|
|
@@ -46,9 +45,9 @@ const OUTSTREAM_MINIMUM_PLAYER_SIZE = [144, 144];
|
|
|
46
45
|
const PRICE_TO_DOLLAR_FACTOR = {
|
|
47
46
|
JPY: 1
|
|
48
47
|
};
|
|
49
|
-
const
|
|
50
|
-
|
|
48
|
+
const IFRAME_USER_SYNC_URL = 'https://js-sec.indexww.com/um/ixmatch.html';
|
|
51
49
|
const FLOOR_SOURCE = { PBJS: 'p', IX: 'x' };
|
|
50
|
+
const IMG_USER_SYNC_URL = 'https://dsum.casalemedia.com/pbusermatch?origin=prebid'
|
|
52
51
|
export const ERROR_CODES = {
|
|
53
52
|
BID_SIZE_INVALID_FORMAT: 1,
|
|
54
53
|
BID_SIZE_NOT_INCLUDED: 2,
|
|
@@ -191,6 +190,9 @@ const NATIVE_EVENT_TRACKING_METHOD = {
|
|
|
191
190
|
const LOCAL_STORAGE_KEY = 'ixdiag';
|
|
192
191
|
let hasRegisteredHandler = false;
|
|
193
192
|
export const storage = getStorageManager({gvlid: GLOBAL_VENDOR_ID, bidderCode: BIDDER_CODE});
|
|
193
|
+
let siteID = 0;
|
|
194
|
+
let gdprConsent = '';
|
|
195
|
+
let usPrivacy = '';
|
|
194
196
|
|
|
195
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.
|
|
196
198
|
const MEDIA_TYPES = {
|
|
@@ -242,6 +244,8 @@ function bidToVideoImp(bid) {
|
|
|
242
244
|
}
|
|
243
245
|
|
|
244
246
|
imp.video = videoParamRef ? deepClone(bid.params.video) : {};
|
|
247
|
+
// populate imp level transactionId
|
|
248
|
+
imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid');
|
|
245
249
|
|
|
246
250
|
// copy all video properties to imp object
|
|
247
251
|
for (const adUnitProperty in videoAdUnitRef) {
|
|
@@ -353,6 +357,9 @@ function bidToNativeImp(bid) {
|
|
|
353
357
|
ver: '1.2'
|
|
354
358
|
};
|
|
355
359
|
|
|
360
|
+
// populate imp level transactionId
|
|
361
|
+
imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid');
|
|
362
|
+
|
|
356
363
|
_applyFloor(bid, imp, NATIVE);
|
|
357
364
|
|
|
358
365
|
return imp;
|
|
@@ -882,6 +889,11 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
882
889
|
if (tmax) {
|
|
883
890
|
r.ext.ixdiag.tmax = tmax
|
|
884
891
|
}
|
|
892
|
+
|
|
893
|
+
if (config.getConfig('userSync')) {
|
|
894
|
+
r.ext.ixdiag.syncsPerBidder = config.getConfig('userSync').syncsPerBidder;
|
|
895
|
+
}
|
|
896
|
+
|
|
885
897
|
// Get cached errors stored in LocalStorage
|
|
886
898
|
const cachedErrors = getCachedErrors();
|
|
887
899
|
|
|
@@ -910,7 +922,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
910
922
|
// Apply GDPR information to the request if GDPR is enabled.
|
|
911
923
|
if (bidderRequest) {
|
|
912
924
|
if (bidderRequest.gdprConsent) {
|
|
913
|
-
|
|
925
|
+
gdprConsent = bidderRequest.gdprConsent;
|
|
914
926
|
|
|
915
927
|
if (gdprConsent.hasOwnProperty('gdprApplies')) {
|
|
916
928
|
r.regs = {
|
|
@@ -936,6 +948,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
936
948
|
|
|
937
949
|
if (bidderRequest.uspConsent) {
|
|
938
950
|
deepSetValue(r, 'regs.ext.us_privacy', bidderRequest.uspConsent);
|
|
951
|
+
usPrivacy = bidderRequest.uspConsent;
|
|
939
952
|
}
|
|
940
953
|
|
|
941
954
|
if (pageUrl) {
|
|
@@ -949,7 +962,9 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
949
962
|
|
|
950
963
|
const payload = {};
|
|
951
964
|
// Use the siteId in the first bid request as the main siteId.
|
|
952
|
-
|
|
965
|
+
siteID = validBidRequests[0].params.siteId;
|
|
966
|
+
payload.s = siteID;
|
|
967
|
+
payload.v = version;
|
|
953
968
|
if (version) {
|
|
954
969
|
payload.v = version;
|
|
955
970
|
}
|
|
@@ -1038,8 +1053,14 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
1038
1053
|
currentImpressionSize = encodeURIComponent(JSON.stringify({ impressionObjects })).length;
|
|
1039
1054
|
}
|
|
1040
1055
|
|
|
1041
|
-
|
|
1056
|
+
let gpid = impressions[transactionIds[adUnitIndex]].gpid;
|
|
1042
1057
|
const dfpAdUnitCode = impressions[transactionIds[adUnitIndex]].dfp_ad_unit_code;
|
|
1058
|
+
const tid = impressions[transactionIds[adUnitIndex]].tid;
|
|
1059
|
+
const divId = impressions[transactionIds[adUnitIndex]].divId;
|
|
1060
|
+
|
|
1061
|
+
if (!gpid && dfpAdUnitCode && divId) {
|
|
1062
|
+
gpid = `${dfpAdUnitCode}#${divId}`
|
|
1063
|
+
}
|
|
1043
1064
|
if (impressionObjects.length && BANNER in impressionObjects[0]) {
|
|
1044
1065
|
const { id, banner: { topframe } } = impressionObjects[0];
|
|
1045
1066
|
const _bannerImpression = {
|
|
@@ -1050,10 +1071,11 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
1050
1071
|
},
|
|
1051
1072
|
}
|
|
1052
1073
|
|
|
1053
|
-
if (dfpAdUnitCode || gpid) {
|
|
1074
|
+
if (dfpAdUnitCode || gpid || tid) {
|
|
1054
1075
|
_bannerImpression.ext = {};
|
|
1055
1076
|
_bannerImpression.ext.dfp_ad_unit_code = dfpAdUnitCode;
|
|
1056
1077
|
_bannerImpression.ext.gpid = gpid;
|
|
1078
|
+
_bannerImpression.ext.tid = tid;
|
|
1057
1079
|
}
|
|
1058
1080
|
|
|
1059
1081
|
if ('bidfloor' in impressionObjects[0]) {
|
|
@@ -1114,6 +1136,21 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
|
|
|
1114
1136
|
}
|
|
1115
1137
|
}
|
|
1116
1138
|
|
|
1139
|
+
// add identifiers info to ixDiag
|
|
1140
|
+
const pbaAdSlot = impressions[transactionIds[adUnitIndex]].pbadslot
|
|
1141
|
+
const tagId = impressions[transactionIds[adUnitIndex]].tagId
|
|
1142
|
+
const adUnitCode = impressions[transactionIds[adUnitIndex]].adUnitCode
|
|
1143
|
+
if (pbaAdSlot || tagId || adUnitCode || divId) {
|
|
1144
|
+
const clonedRObject = deepClone(r);
|
|
1145
|
+
const requestSize = `${baseUrl}${parseQueryStringParameters({ ...payload, r: JSON.stringify(clonedRObject) })}`.length;
|
|
1146
|
+
if (requestSize < MAX_REQUEST_SIZE) {
|
|
1147
|
+
r.ext.ixdiag.pbadslot = pbaAdSlot;
|
|
1148
|
+
r.ext.ixdiag.tagid = tagId;
|
|
1149
|
+
r.ext.ixdiag.adunitcode = adUnitCode;
|
|
1150
|
+
r.ext.ixdiag.divId = divId;
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1117
1154
|
const isLastAdUnit = adUnitIndex === transactionIds.length - 1;
|
|
1118
1155
|
|
|
1119
1156
|
if (wasAdUnitImpressionsTrimmed || isLastAdUnit) {
|
|
@@ -1246,7 +1283,15 @@ function createNativeImps(validBidRequest, nativeImps) {
|
|
|
1246
1283
|
nativeImps[validBidRequest.transactionId] = {};
|
|
1247
1284
|
nativeImps[validBidRequest.transactionId].ixImps = [];
|
|
1248
1285
|
nativeImps[validBidRequest.transactionId].ixImps.push(imp);
|
|
1249
|
-
nativeImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid')
|
|
1286
|
+
nativeImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid');
|
|
1287
|
+
nativeImps[validBidRequest.transactionId].dfp_ad_unit_code = deepAccess(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot');
|
|
1288
|
+
nativeImps[validBidRequest.transactionId].pbadslot = deepAccess(validBidRequest, 'ortb2Imp.ext.data.pbadslot');
|
|
1289
|
+
nativeImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId');
|
|
1290
|
+
|
|
1291
|
+
const adUnitCode = validBidRequest.adUnitCode;
|
|
1292
|
+
const divId = document.getElementById(adUnitCode) ? adUnitCode : getGptSlotInfoForAdUnitCode(adUnitCode).divId;
|
|
1293
|
+
nativeImps[validBidRequest.transactionId].adUnitCode = adUnitCode;
|
|
1294
|
+
nativeImps[validBidRequest.transactionId].divId = divId;
|
|
1250
1295
|
}
|
|
1251
1296
|
}
|
|
1252
1297
|
|
|
@@ -1262,6 +1307,14 @@ function createVideoImps(validBidRequest, videoImps) {
|
|
|
1262
1307
|
videoImps[validBidRequest.transactionId].ixImps = [];
|
|
1263
1308
|
videoImps[validBidRequest.transactionId].ixImps.push(imp);
|
|
1264
1309
|
videoImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid');
|
|
1310
|
+
videoImps[validBidRequest.transactionId].dfp_ad_unit_code = deepAccess(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot');
|
|
1311
|
+
videoImps[validBidRequest.transactionId].pbadslot = deepAccess(validBidRequest, 'ortb2Imp.ext.data.pbadslot');
|
|
1312
|
+
videoImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId');
|
|
1313
|
+
|
|
1314
|
+
const adUnitCode = validBidRequest.adUnitCode;
|
|
1315
|
+
const divId = document.getElementById(adUnitCode) ? adUnitCode : getGptSlotInfoForAdUnitCode(adUnitCode).divId;
|
|
1316
|
+
videoImps[validBidRequest.transactionId].adUnitCode = adUnitCode;
|
|
1317
|
+
videoImps[validBidRequest.transactionId].divId = divId;
|
|
1265
1318
|
}
|
|
1266
1319
|
}
|
|
1267
1320
|
|
|
@@ -1288,6 +1341,14 @@ function createBannerImps(validBidRequest, missingBannerSizes, bannerImps) {
|
|
|
1288
1341
|
|
|
1289
1342
|
bannerImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid');
|
|
1290
1343
|
bannerImps[validBidRequest.transactionId].dfp_ad_unit_code = deepAccess(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot');
|
|
1344
|
+
bannerImps[validBidRequest.transactionId].tid = deepAccess(validBidRequest, 'ortb2Imp.ext.tid');
|
|
1345
|
+
bannerImps[validBidRequest.transactionId].pbadslot = deepAccess(validBidRequest, 'ortb2Imp.ext.data.pbadslot');
|
|
1346
|
+
bannerImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId');
|
|
1347
|
+
|
|
1348
|
+
const adUnitCode = validBidRequest.adUnitCode;
|
|
1349
|
+
const divId = document.getElementById(adUnitCode) ? adUnitCode : getGptSlotInfoForAdUnitCode(adUnitCode).divId;
|
|
1350
|
+
bannerImps[validBidRequest.transactionId].adUnitCode = adUnitCode;
|
|
1351
|
+
bannerImps[validBidRequest.transactionId].divId = divId;
|
|
1291
1352
|
|
|
1292
1353
|
// Create IX imps from params.size
|
|
1293
1354
|
if (bannerSizeDefined) {
|
|
@@ -1414,7 +1475,7 @@ function localStorageHandler(data) {
|
|
|
1414
1475
|
hasEnforcementHook: false,
|
|
1415
1476
|
valid: hasDeviceAccess()
|
|
1416
1477
|
};
|
|
1417
|
-
validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE,
|
|
1478
|
+
validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
|
|
1418
1479
|
if (permissions.valid) {
|
|
1419
1480
|
storeErrorEventData(data);
|
|
1420
1481
|
}
|
|
@@ -1596,7 +1657,17 @@ export const spec = {
|
|
|
1596
1657
|
}
|
|
1597
1658
|
|
|
1598
1659
|
if (mediaTypeVideoRef && paramsVideoRef) {
|
|
1660
|
+
const videoImp = bidToVideoImp(bid).video;
|
|
1599
1661
|
const errorList = checkVideoParams(mediaTypeVideoRef, paramsVideoRef);
|
|
1662
|
+
if (deepAccess(bid, 'mediaTypes.video.context') === OUTSTREAM && isIndexRendererPreferred(bid) && videoImp) {
|
|
1663
|
+
const outstreamPlayerSize = [deepAccess(videoImp, 'w'), deepAccess(videoImp, 'h')];
|
|
1664
|
+
const isValidSize = outstreamPlayerSize[0] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[0] && outstreamPlayerSize[1] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[1];
|
|
1665
|
+
if (!isValidSize) {
|
|
1666
|
+
logError(`IX Bid Adapter: ${outstreamPlayerSize} is an invalid size for IX outstream renderer`);
|
|
1667
|
+
return false;
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1600
1671
|
if (errorList.length) {
|
|
1601
1672
|
errorList.forEach((err) => {
|
|
1602
1673
|
logError(err, { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
|
|
@@ -1605,16 +1676,6 @@ export const spec = {
|
|
|
1605
1676
|
}
|
|
1606
1677
|
}
|
|
1607
1678
|
|
|
1608
|
-
const videoImp = bidToVideoImp(bid).video;
|
|
1609
|
-
if (deepAccess(bid, 'mediaTypes.video.context') === OUTSTREAM && isIndexRendererPreferred(bid) && videoImp) {
|
|
1610
|
-
const outstreamPlayerSize = [deepAccess(videoImp, 'w'), deepAccess(videoImp, 'h')];
|
|
1611
|
-
const isValidSize = outstreamPlayerSize[0] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[0] && outstreamPlayerSize[1] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[1];
|
|
1612
|
-
if (!isValidSize) {
|
|
1613
|
-
logError(`IX Bid Adapter: ${outstreamPlayerSize} is an invalid size for IX outstream renderer`);
|
|
1614
|
-
return false;
|
|
1615
|
-
}
|
|
1616
|
-
}
|
|
1617
|
-
|
|
1618
1679
|
return nativeMediaTypeValid(mediaTypeNativeRef);
|
|
1619
1680
|
},
|
|
1620
1681
|
|
|
@@ -1763,11 +1824,60 @@ export const spec = {
|
|
|
1763
1824
|
* @returns {array} User sync pixels
|
|
1764
1825
|
*/
|
|
1765
1826
|
getUserSyncs: function (syncOptions, serverResponses) {
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1827
|
+
const syncs = [];
|
|
1828
|
+
let publisherSyncsPerBidderOverride = null;
|
|
1829
|
+
if (serverResponses.length > 0) {
|
|
1830
|
+
publisherSyncsPerBidderOverride = deepAccess(serverResponses[0], 'body.ext.publishersyncsperbidderoverride');
|
|
1831
|
+
}
|
|
1832
|
+
if (publisherSyncsPerBidderOverride !== undefined && publisherSyncsPerBidderOverride == 0) {
|
|
1833
|
+
return [];
|
|
1834
|
+
}
|
|
1835
|
+
if (syncOptions.iframeEnabled) {
|
|
1836
|
+
syncs.push({
|
|
1837
|
+
type: 'iframe',
|
|
1838
|
+
url: IFRAME_USER_SYNC_URL
|
|
1839
|
+
})
|
|
1840
|
+
} else {
|
|
1841
|
+
let publisherSyncsPerBidder = null;
|
|
1842
|
+
if (config.getConfig('userSync')) {
|
|
1843
|
+
publisherSyncsPerBidder = config.getConfig('userSync').syncsPerBidder
|
|
1844
|
+
}
|
|
1845
|
+
if (publisherSyncsPerBidder === 0) {
|
|
1846
|
+
publisherSyncsPerBidder = publisherSyncsPerBidderOverride
|
|
1847
|
+
}
|
|
1848
|
+
if (publisherSyncsPerBidderOverride && (publisherSyncsPerBidder === 0 || publisherSyncsPerBidder)) {
|
|
1849
|
+
publisherSyncsPerBidder = publisherSyncsPerBidderOverride > publisherSyncsPerBidder ? publisherSyncsPerBidder : publisherSyncsPerBidderOverride
|
|
1850
|
+
} else {
|
|
1851
|
+
publisherSyncsPerBidder = 1
|
|
1852
|
+
}
|
|
1853
|
+
for (let i = 0; i < publisherSyncsPerBidder; i++) {
|
|
1854
|
+
syncs.push({
|
|
1855
|
+
type: 'image',
|
|
1856
|
+
url: buildImgSyncUrl(publisherSyncsPerBidder, i)
|
|
1857
|
+
})
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
return syncs;
|
|
1770
1861
|
}
|
|
1771
1862
|
};
|
|
1772
1863
|
|
|
1864
|
+
/**
|
|
1865
|
+
* Build img user sync url
|
|
1866
|
+
* @param {int} syncsPerBidder number of syncs Per Bidder
|
|
1867
|
+
* @param {int} index index to pass
|
|
1868
|
+
* @returns {string} img user sync url
|
|
1869
|
+
*/
|
|
1870
|
+
function buildImgSyncUrl(syncsPerBidder, index) {
|
|
1871
|
+
let consentString = '';
|
|
1872
|
+
let gdprApplies = '0';
|
|
1873
|
+
if (gdprConsent && gdprConsent.hasOwnProperty('gdprApplies')) {
|
|
1874
|
+
gdprApplies = gdprConsent.gdprApplies ? '1' : '0';
|
|
1875
|
+
}
|
|
1876
|
+
if (gdprConsent && gdprConsent.hasOwnProperty('consentString')) {
|
|
1877
|
+
consentString = gdprConsent.consentString || '';
|
|
1878
|
+
}
|
|
1879
|
+
|
|
1880
|
+
return IMG_USER_SYNC_URL + '&site_id=' + siteID.toString() + '&p=' + syncsPerBidder.toString() + '&i=' + index.toString() + '&gdpr=' + gdprApplies + '&gdpr_consent=' + consentString + '&us_privacy=' + (usPrivacy || '');
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1773
1883
|
registerBidder(spec);
|
package/modules/ixBidAdapter.md
CHANGED
|
@@ -502,11 +502,8 @@ to `'ix'` across all ad units that bids are being requested for does not exceed
|
|
|
502
502
|
|
|
503
503
|
### Time-To-Live (TTL)
|
|
504
504
|
|
|
505
|
-
Banner bids from
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
If an invalid bid wins, and its associated ad is rendered, it will not count
|
|
509
|
-
towards total impressions on IX's side.
|
|
505
|
+
Banner bids from Index have a TTL of 600 seconds while video bids have a TTL of three hours, after which time they become invalid.
|
|
506
|
+
**Note:** Index supports the `bid.exp` attribute in the bid response which allows our adapter to specify the maximum number of seconds allowed between the auction and billing notice. In the absence of the `bid.exp` attribute, the TTL provided above applies.
|
|
510
507
|
|
|
511
508
|
FAQs
|
|
512
509
|
====
|
|
@@ -28,14 +28,14 @@ function setIds_(clientId, sessionId) {
|
|
|
28
28
|
let expC = (new Date(new Date().setFullYear(new Date().getFullYear() + 1))).toUTCString();
|
|
29
29
|
let expS = (new Date(new Date().setMinutes(new Date().getMinutes() + sidTTLMins_))).toUTCString();
|
|
30
30
|
|
|
31
|
-
storage.setCookie('
|
|
32
|
-
storage.setCookie('
|
|
31
|
+
storage.setCookie('_jxx', clientId, expC, 'None', null);
|
|
32
|
+
storage.setCookie('_jxx', clientId, expC, 'None', dd);
|
|
33
33
|
|
|
34
|
-
storage.setCookie('
|
|
35
|
-
storage.setCookie('
|
|
34
|
+
storage.setCookie('_jxxs', sessionId, expS, 'None', null);
|
|
35
|
+
storage.setCookie('_jxxs', sessionId, expS, 'None', dd);
|
|
36
36
|
|
|
37
|
-
storage.setDataInLocalStorage('
|
|
38
|
-
storage.setDataInLocalStorage('
|
|
37
|
+
storage.setDataInLocalStorage('_jxx', clientId);
|
|
38
|
+
storage.setDataInLocalStorage('_jxxs', sessionId);
|
|
39
39
|
} catch (error) {}
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -47,14 +47,14 @@ function fetchIds_() {
|
|
|
47
47
|
session_id_ls: ''
|
|
48
48
|
};
|
|
49
49
|
try {
|
|
50
|
-
let tmp = storage.getCookie('
|
|
50
|
+
let tmp = storage.getCookie('_jxx');
|
|
51
51
|
if (tmp) ret.client_id_c = tmp;
|
|
52
|
-
tmp = storage.getCookie('
|
|
52
|
+
tmp = storage.getCookie('_jxxs');
|
|
53
53
|
if (tmp) ret.session_id_c = tmp;
|
|
54
54
|
|
|
55
|
-
tmp = storage.getDataFromLocalStorage('
|
|
55
|
+
tmp = storage.getDataFromLocalStorage('_jxx');
|
|
56
56
|
if (tmp) ret.client_id_ls = tmp;
|
|
57
|
-
tmp = storage.getDataFromLocalStorage('
|
|
57
|
+
tmp = storage.getDataFromLocalStorage('_jxxs');
|
|
58
58
|
if (tmp) ret.session_id_ls = tmp;
|
|
59
59
|
} catch (error) {}
|
|
60
60
|
return ret;
|
|
@@ -1,14 +1,96 @@
|
|
|
1
|
+
import { logError } from '../src/utils.js';
|
|
2
|
+
import { ajax } from '../src/ajax.js';
|
|
1
3
|
import adapter from '../src/AnalyticsAdapter.js';
|
|
2
4
|
import adapterManager from '../src/adapterManager.js';
|
|
5
|
+
import CONSTANTS from '../src/constants.json';
|
|
3
6
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
const EVENT_URL = 'https://krk.kargo.com/api/v1/event';
|
|
8
|
+
const KARGO_BIDDER_CODE = 'kargo';
|
|
9
|
+
|
|
10
|
+
const analyticsType = 'endpoint';
|
|
11
|
+
|
|
12
|
+
let _initOptions = {};
|
|
13
|
+
|
|
14
|
+
let _logBidResponseData = {
|
|
15
|
+
auctionId: '',
|
|
16
|
+
auctionTimeout: 0,
|
|
17
|
+
responseTime: 0,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
let _bidResponseDataLogged = [];
|
|
21
|
+
|
|
22
|
+
var kargoAnalyticsAdapter = Object.assign(
|
|
23
|
+
adapter({ analyticsType }), {
|
|
24
|
+
track({ eventType, args }) {
|
|
25
|
+
switch (eventType) {
|
|
26
|
+
case CONSTANTS.EVENTS.AUCTION_INIT: {
|
|
27
|
+
_logBidResponseData.auctionTimeout = args.timeout;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case CONSTANTS.EVENTS.BID_RESPONSE: {
|
|
31
|
+
handleBidResponseData(args);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
// handleBidResponseData: Get auction data for Kargo bids and send to server
|
|
40
|
+
function handleBidResponseData (bidResponse) {
|
|
41
|
+
// Verify this is Kargo and we haven't seen this auction data yet
|
|
42
|
+
if (bidResponse.bidder !== KARGO_BIDDER_CODE || _bidResponseDataLogged.includes(bidResponse.auctionId) !== false) {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_logBidResponseData.auctionId = bidResponse.auctionId;
|
|
47
|
+
_logBidResponseData.responseTime = bidResponse.timeToRespond;
|
|
48
|
+
sendAuctionData(_logBidResponseData);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// sendAuctionData: Send auction data to the server
|
|
52
|
+
function sendAuctionData (data) {
|
|
53
|
+
try {
|
|
54
|
+
_bidResponseDataLogged.push(data.auctionId);
|
|
55
|
+
|
|
56
|
+
if (!shouldFireEventRequest()) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
ajax(
|
|
61
|
+
`${EVENT_URL}/auction-data`,
|
|
62
|
+
null,
|
|
63
|
+
{
|
|
64
|
+
aid: data.auctionId,
|
|
65
|
+
ato: data.auctionTimeout,
|
|
66
|
+
rt: data.responseTime,
|
|
67
|
+
it: 0,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
method: 'GET',
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
logError('Error sending auction data: ', err);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Sampling rate out of 100
|
|
79
|
+
function shouldFireEventRequest () {
|
|
80
|
+
const samplingRate = (_initOptions && _initOptions.sampling) || 100;
|
|
81
|
+
return ((Math.floor(Math.random() * 100) + 1) <= parseInt(samplingRate));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
kargoAnalyticsAdapter.originEnableAnalytics = kargoAnalyticsAdapter.enableAnalytics;
|
|
85
|
+
|
|
86
|
+
kargoAnalyticsAdapter.enableAnalytics = function (config) {
|
|
87
|
+
_initOptions = config.options;
|
|
88
|
+
kargoAnalyticsAdapter.originEnableAnalytics(config);
|
|
89
|
+
};
|
|
8
90
|
|
|
9
91
|
adapterManager.registerAnalyticsAdapter({
|
|
10
|
-
adapter:
|
|
92
|
+
adapter: kargoAnalyticsAdapter,
|
|
11
93
|
code: 'kargo'
|
|
12
94
|
});
|
|
13
95
|
|
|
14
|
-
export default
|
|
96
|
+
export default kargoAnalyticsAdapter;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: Kargo Analytics Adapter
|
|
4
|
+
Module Type: Analytics Adapter
|
|
5
|
+
Maintainer: support@kargo.com
|
|
6
|
+
|
|
7
|
+
# Description
|
|
8
|
+
|
|
9
|
+
Analytics adapter for Kargo. Contact support@kargo.com for information.
|
|
10
|
+
|
|
11
|
+
# Usage
|
|
12
|
+
|
|
13
|
+
The simplest way to enable the analytics adapter is this
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
pbjs.enableAnalytics([{
|
|
17
|
+
provider: 'kargo',
|
|
18
|
+
options: {
|
|
19
|
+
sampling: 100 // value out of 100
|
|
20
|
+
}
|
|
21
|
+
}]);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
# Test Parameters
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
{
|
|
28
|
+
provider: 'kargo',
|
|
29
|
+
options: {
|
|
30
|
+
sampling: 100
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
@@ -286,6 +286,7 @@ function generateBidParameters(bid, bidderRequest) {
|
|
|
286
286
|
sizes: sizesArray,
|
|
287
287
|
floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
|
|
288
288
|
bidId: getBidIdParameter('bidId', bid),
|
|
289
|
+
loop: getBidIdParameter('bidderRequestsCount', bid),
|
|
289
290
|
bidderRequestId: getBidIdParameter('bidderRequestId', bid),
|
|
290
291
|
transactionId: getBidIdParameter('transactionId', bid),
|
|
291
292
|
};
|
|
@@ -34,17 +34,6 @@ function readnavIDFromCookie() {
|
|
|
34
34
|
return storage.cookiesAreEnabled ? (storage.findSimilarCookies('nav') ? storage.findSimilarCookies('nav')[0] : null) : null;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
function readnvgnavFromLocalStorage() {
|
|
38
|
-
var i;
|
|
39
|
-
const query = /[nvga]{3}\d+/;
|
|
40
|
-
for (i in window.localStorage) {
|
|
41
|
-
if (i.match(query) || (!query && typeof i === 'string')) {
|
|
42
|
-
const naveggId = storage.getDataFromLocalStorage(i.match(query).input).split('|')[0]
|
|
43
|
-
return naveggId.split('_')[0];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
37
|
/** @type {Submodule} */
|
|
49
38
|
export const naveggIdSubmodule = {
|
|
50
39
|
/**
|
|
@@ -73,7 +62,7 @@ export const naveggIdSubmodule = {
|
|
|
73
62
|
getId() {
|
|
74
63
|
let naveggIdStringFromLocalStorage = null;
|
|
75
64
|
if (storage.localStorageIsEnabled) {
|
|
76
|
-
naveggIdStringFromLocalStorage = readnaveggIdFromLocalStorage()
|
|
65
|
+
naveggIdStringFromLocalStorage = readnaveggIdFromLocalStorage();
|
|
77
66
|
}
|
|
78
67
|
|
|
79
68
|
const naveggIdString = naveggIdStringFromLocalStorage || readnaveggIDFromCookie() || readoldnaveggIDFromCookie() || readnvgIDFromCookie() || readnavIDFromCookie();
|