prebid.js 7.26.0 → 7.28.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/.github/workflows/issue_tracker.yml +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adWMGAnalyticsAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adhashBidAdapter.js +1 -1
- package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
- package/dist/adlooxAdServerVideo.js +1 -1
- package/dist/adlooxAnalyticsAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/admaticBidAdapter.js +1 -1
- package/dist/admixerBidAdapter.js +1 -1
- package/dist/adomikAnalyticsAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adxpremiumAnalyticsAdapter.js +1 -1
- package/dist/aidemBidAdapter.js +1 -0
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/analyticsAdapter.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/bidViewability.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/browsiRtdProvider.js +1 -1
- package/dist/bucksenseBidAdapter.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertAnalyticsAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -1
- package/dist/consentManagementUsp.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/datablocksAnalyticsAdapter.js +1 -1
- package/dist/dependencies.json +6 -0
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/discoveryBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningAnalyticsAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/fluctBidAdapter.js +1 -1
- package/dist/ftrackIdSystem.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/genericAnalyticsAdapter.js +1 -0
- package/dist/geoedgeRtdProvider.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/glomexBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/googleAnalyticsAdapter.js +1 -1
- package/dist/gravitoIdSystem.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/growthCodeAnalyticsAdapter.js +1 -0
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronAnalyticsAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/impactifyBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/invisiblyAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerRtdProvider.js +1 -1
- package/dist/kargoAnalyticsAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kinessoIdSystem.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/limelightDigitalBidAdapter.js +1 -1
- package/dist/liveIntentAnalyticsAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediagoBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +206 -202
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxAnalyticsAdapter.js +1 -1
- package/dist/optimonAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pbsExtensions.js +1 -1
- package/dist/pianoDmpAnalyticsAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +2 -2
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
- package/dist/pubCommonId.js +1 -1
- package/dist/pubProvidedIdSystem.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubperfAnalyticsAdapter.js +1 -1
- package/dist/pubstackAnalyticsAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pulsepointAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/quantcastIdSystem.js +1 -1
- package/dist/rasBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/realvuAnalyticsAdapter.js +1 -1
- package/dist/redtramBidAdapter.js +1 -0
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevantAnalyticsAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rivrAnalyticsAdapter.js +1 -1
- package/dist/roxotAnalyticsAdapter.js +1 -1
- package/dist/rtbhouseBidAdapter.js +1 -1
- package/dist/rtdModule.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/s2sTesting.js +1 -1
- package/dist/scaleableAnalyticsAdapter.js +1 -1
- package/dist/schain.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/sigmoidAnalyticsAdapter.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/sonobiAnalyticsAdapter.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/staqAnalyticsAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tapadIdSystem.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/teadsIdSystem.js +1 -1
- package/dist/terceptAnalyticsAdapter.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/weboramaRtdProvider.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/yieldlabBidAdapter.js +1 -1
- package/dist/yieldliftBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/growthcode.html +134 -0
- package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
- package/libraries/ortb2.5StrictTranslator/dsl.js +54 -0
- package/libraries/ortb2.5StrictTranslator/spec.js +81 -0
- package/libraries/ortb2.5StrictTranslator/translator.js +37 -0
- package/libraries/ortb2.5Translator/translator.js +82 -0
- package/modules/33acrossIdSystem.js +3 -0
- package/modules/adhashBidAdapter.js +115 -30
- package/modules/adhashBidAdapter.md +1 -3
- package/modules/admaticBidAdapter.js +10 -1
- package/modules/admixerBidAdapter.js +1 -1
- package/modules/aidemBidAdapter.js +492 -0
- package/modules/aidemBidAdapter.md +187 -0
- package/modules/browsiRtdProvider.js +6 -4
- package/modules/bucksenseBidAdapter.js +1 -1
- package/modules/criteoBidAdapter.js +3 -3
- package/modules/discoveryBidAdapter.js +3 -0
- package/modules/eplanningBidAdapter.js +2 -6
- package/modules/fluctBidAdapter.js +5 -0
- package/modules/gdprEnforcement.js +26 -24
- package/modules/genericAnalyticsAdapter.js +157 -0
- package/modules/geoedgeRtdProvider.js +22 -0
- package/modules/glomexBidAdapter.js +2 -0
- package/modules/gravitoIdSystem.js +3 -4
- package/modules/gridBidAdapter.js +1 -1
- package/modules/gridNMBidAdapter.js +1 -1
- package/modules/growthCodeAnalyticsAdapter.js +176 -0
- package/modules/growthCodeAnalyticsAdapter.md +41 -0
- package/modules/impactifyBidAdapter.js +19 -1
- package/modules/jwplayerRtdProvider.js +1 -2
- package/modules/kargoBidAdapter.js +1 -1
- package/modules/lassoBidAdapter.js +8 -4
- package/modules/limelightDigitalBidAdapter.js +1 -1
- package/modules/liveIntentIdSystem.js +1 -2
- package/modules/mediagoBidAdapter.js +2 -1
- package/modules/minutemediaBidAdapter.md +3 -3
- package/modules/nexx360BidAdapter.js +264 -138
- package/modules/openxBidAdapter.md +15 -14
- package/modules/pubCommonId.js +2 -1
- package/modules/pubProvidedIdSystem.js +2 -0
- package/modules/rasBidAdapter.js +8 -3
- package/modules/rasBidAdapter.md +16 -15
- package/modules/redtramBidAdapter.js +155 -0
- package/modules/redtramBidAdapter.md +33 -0
- package/modules/riseBidAdapter.js +15 -0
- package/modules/riseBidAdapter.md +3 -3
- package/modules/rtbhouseBidAdapter.js +90 -29
- package/modules/rubiconBidAdapter.js +2 -1
- package/modules/seedtagBidAdapter.js +67 -56
- package/modules/seedtagBidAdapter.md +60 -0
- package/modules/sharedIdSystem.js +3 -1
- package/modules/smartxBidAdapter.js +1 -1
- package/modules/smnBidAdapter.md +52 -0
- package/modules/taboolaBidAdapter.js +20 -7
- package/modules/tripleliftBidAdapter.js +1 -1
- package/modules/ttdBidAdapter.js +4 -0
- package/modules/vidazooBidAdapter.js +31 -8
- package/modules/yandexBidAdapter.js +85 -19
- package/modules/yandexBidAdapter.md +7 -7
- package/modules/yieldlabBidAdapter.js +10 -4
- package/modules/yieldliftBidAdapter.js +3 -3
- package/package.json +2 -2
- package/src/auction.js +30 -4
- package/src/consentHandler.js +8 -0
- package/src/constants.json +2 -1
- package/src/events.js +4 -0
- package/src/native.js +31 -20
- package/src/refererDetection.js +6 -1
- package/src/storageManager.js +6 -3
- package/test/helpers/analytics.js +34 -0
- package/test/helpers/refererDetectionHelper.js +88 -0
- package/test/mocks/analyticsStub.js +3 -1
- package/test/spec/AnalyticsAdapter_spec.js +119 -116
- package/test/spec/auctionmanager_spec.js +119 -1
- package/test/spec/modules/33acrossIdSystem_spec.js +4 -1
- package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
- package/test/spec/modules/adhashBidAdapter_spec.js +65 -11
- package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
- package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
- package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
- package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
- package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
- package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
- package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
- package/test/spec/modules/fpdModule_spec.js +1 -1
- package/test/spec/modules/gdprEnforcement_spec.js +115 -68
- package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
- package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
- package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
- package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
- package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
- package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
- package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
- package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
- package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
- package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
- package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
- package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
- package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
- package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
- package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
- package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
- package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
- package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
- package/test/spec/modules/rasBidAdapter_spec.js +5 -1
- package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
- package/test/spec/modules/riseBidAdapter_spec.js +24 -0
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
- package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
- package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
- package/test/spec/modules/taboolaBidAdapter_spec.js +39 -0
- package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
- package/test/spec/modules/ttdBidAdapter_spec.js +50 -9
- package/test/spec/modules/vidazooBidAdapter_spec.js +173 -27
- package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
- package/test/spec/modules/yieldlabBidAdapter_spec.js +49 -20
- package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
- package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
- package/test/spec/native_spec.js +68 -56
- package/test/spec/ortb2.5StrictTranslator/dsl_spec.js +137 -0
- package/test/spec/ortb2.5StrictTranslator/spec_spec.js +358 -0
- package/test/spec/ortb2.5StrictTranslator/translator_spec.js +16 -0
- package/test/spec/ortb2.5Translator/translator_spec.js +64 -0
- package/test/spec/refererDetection_spec.js +46 -95
- package/test/spec/unit/core/storageManager_spec.js +2 -1
|
@@ -4,7 +4,7 @@ import { BANNER } from '../src/mediaTypes.js';
|
|
|
4
4
|
|
|
5
5
|
const WHO = 'BKSHBID-005';
|
|
6
6
|
const BIDDER_CODE = 'bucksense';
|
|
7
|
-
const URL = 'https://
|
|
7
|
+
const URL = 'https://directo.prebidserving.com/prebidjs/';
|
|
8
8
|
|
|
9
9
|
export const spec = {
|
|
10
10
|
code: BIDDER_CODE,
|
|
@@ -672,18 +672,18 @@ function enrichSlotWithFloors(slot, bidRequest) {
|
|
|
672
672
|
if (bidRequest.mediaTypes?.banner) {
|
|
673
673
|
slotFloors.banner = {};
|
|
674
674
|
const bannerSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'))
|
|
675
|
-
bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = getFloor({ size: bannerSize, mediaType: BANNER }));
|
|
675
|
+
bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = getFloor.call(bidRequest, { size: bannerSize, mediaType: BANNER }));
|
|
676
676
|
}
|
|
677
677
|
|
|
678
678
|
if (bidRequest.mediaTypes?.video) {
|
|
679
679
|
slotFloors.video = {};
|
|
680
680
|
const videoSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize'))
|
|
681
|
-
videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = getFloor({ size: videoSize, mediaType: VIDEO }));
|
|
681
|
+
videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = getFloor.call(bidRequest, { size: videoSize, mediaType: VIDEO }));
|
|
682
682
|
}
|
|
683
683
|
|
|
684
684
|
if (bidRequest.mediaTypes?.native) {
|
|
685
685
|
slotFloors.native = {};
|
|
686
|
-
slotFloors.native['*'] = getFloor({ size: '*', mediaType: NATIVE });
|
|
686
|
+
slotFloors.native['*'] = getFloor.call(bidRequest, { size: '*', mediaType: NATIVE });
|
|
687
687
|
}
|
|
688
688
|
|
|
689
689
|
if (Object.keys(slotFloors).length > 0) {
|
|
@@ -277,6 +277,8 @@ function getItems(validBidRequests, bidderRequest) {
|
|
|
277
277
|
function getParam(validBidRequests, bidderRequest) {
|
|
278
278
|
const pubcid = utils.deepAccess(validBidRequests[0], 'crumbs.pubcid');
|
|
279
279
|
let isMobile = getDevice() ? 1 : 0;
|
|
280
|
+
// input test status by Publisher. more frequently for test true req
|
|
281
|
+
let isTest = validBidRequests[0].params.test || 0;
|
|
280
282
|
let auctionId = getKv(bidderRequest, 'auctionId');
|
|
281
283
|
let items = getItems(validBidRequests, bidderRequest);
|
|
282
284
|
|
|
@@ -290,6 +292,7 @@ function getParam(validBidRequests, bidderRequest) {
|
|
|
290
292
|
if (items && items.length) {
|
|
291
293
|
let c = {
|
|
292
294
|
id: 'pp_hbjs_' + auctionId,
|
|
295
|
+
test: +isTest,
|
|
293
296
|
at: 1,
|
|
294
297
|
bcat: globals['bcat'],
|
|
295
298
|
badv: globals['adv'],
|
|
@@ -128,9 +128,9 @@ export const spec = {
|
|
|
128
128
|
advertiserDomains: ad.adom
|
|
129
129
|
};
|
|
130
130
|
}
|
|
131
|
-
if (
|
|
131
|
+
if (request && request.data && request.data.vv) {
|
|
132
132
|
bidResponse.vastXml = ad.adm;
|
|
133
|
-
bidResponse.
|
|
133
|
+
bidResponse.mediaType = VIDEO;
|
|
134
134
|
} else {
|
|
135
135
|
bidResponse.ad = ad.adm;
|
|
136
136
|
}
|
|
@@ -504,8 +504,4 @@ function registerAuction(storageID) {
|
|
|
504
504
|
return true;
|
|
505
505
|
}
|
|
506
506
|
|
|
507
|
-
function isVastResponse(bid) {
|
|
508
|
-
return bid.adm.match(/^(<VAST)|(<VideoAdServingTemplate)/gmi);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
507
|
registerBidder(spec);
|
|
@@ -62,6 +62,11 @@ export const spec = {
|
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
data.params = request.params;
|
|
65
|
+
|
|
66
|
+
if (request.schain) {
|
|
67
|
+
data.schain = request.schain;
|
|
68
|
+
}
|
|
69
|
+
|
|
65
70
|
const searchParams = new URLSearchParams({
|
|
66
71
|
dfpUnitCode: request.params.dfpUnitCode,
|
|
67
72
|
tagId: request.params.tagId,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* This module gives publishers extra set of features to enforce individual purposes of TCF v2
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {deepAccess, hasDeviceAccess, isArray, logWarn} from '../src/utils.js';
|
|
5
|
+
import {deepAccess, hasDeviceAccess, isArray, logError, logWarn} from '../src/utils.js';
|
|
6
6
|
import {config} from '../src/config.js';
|
|
7
7
|
import adapterManager, {gdprDataHandler} from '../src/adapterManager.js';
|
|
8
8
|
import {find, includes} from '../src/polyfill.js';
|
|
@@ -11,13 +11,7 @@ import {getHook} from '../src/hook.js';
|
|
|
11
11
|
import {validateStorageEnforcement} from '../src/storageManager.js';
|
|
12
12
|
import * as events from '../src/events.js';
|
|
13
13
|
import CONSTANTS from '../src/constants.json';
|
|
14
|
-
|
|
15
|
-
// modules for which vendor consent is not needed (see https://github.com/prebid/Prebid.js/issues/8161)
|
|
16
|
-
const VENDORLESS_MODULES = new Set([
|
|
17
|
-
'sharedId',
|
|
18
|
-
'pubCommonId',
|
|
19
|
-
'pubProvidedId',
|
|
20
|
-
]);
|
|
14
|
+
import {VENDORLESS_GVLID} from '../src/consentHandler.js';
|
|
21
15
|
|
|
22
16
|
export const STRICT_STORAGE_ENFORCEMENT = 'strictStorageEnforcement';
|
|
23
17
|
|
|
@@ -71,7 +65,7 @@ export const internal = {
|
|
|
71
65
|
* @param {{string|Object}} - module
|
|
72
66
|
* @return {number} - GVL ID
|
|
73
67
|
*/
|
|
74
|
-
export function getGvlid(module) {
|
|
68
|
+
export function getGvlid(module, ...args) {
|
|
75
69
|
let gvlid = null;
|
|
76
70
|
if (module) {
|
|
77
71
|
// Check user defined GVL Mapping in pbjs.setConfig()
|
|
@@ -86,7 +80,7 @@ export function getGvlid(module) {
|
|
|
86
80
|
return gvlid;
|
|
87
81
|
}
|
|
88
82
|
|
|
89
|
-
gvlid = internal.getGvlidForBidAdapter(moduleCode) || internal.getGvlidForUserIdModule(module) || internal.getGvlidForAnalyticsAdapter(moduleCode);
|
|
83
|
+
gvlid = internal.getGvlidForBidAdapter(moduleCode) || internal.getGvlidForUserIdModule(module) || internal.getGvlidForAnalyticsAdapter(moduleCode, ...args);
|
|
90
84
|
}
|
|
91
85
|
return gvlid;
|
|
92
86
|
}
|
|
@@ -120,10 +114,19 @@ function getGvlidForUserIdModule(userIdModule) {
|
|
|
120
114
|
/**
|
|
121
115
|
* Returns GVL ID for an analytics adapter. If an analytics adapter does not have an associated GVL ID, it returns 'null'.
|
|
122
116
|
* @param {string} code - 'provider' property on the analytics adapter config
|
|
117
|
+
* @param {{}} config - analytics configuration object
|
|
123
118
|
* @return {number} GVL ID
|
|
124
119
|
*/
|
|
125
|
-
function getGvlidForAnalyticsAdapter(code) {
|
|
126
|
-
|
|
120
|
+
function getGvlidForAnalyticsAdapter(code, config) {
|
|
121
|
+
const adapter = adapterManager.getAnalyticsAdapter(code);
|
|
122
|
+
return adapter?.gvlid || ((gvlid) => {
|
|
123
|
+
if (typeof gvlid !== 'function') return gvlid;
|
|
124
|
+
try {
|
|
125
|
+
return gvlid.call(adapter.adapter, config);
|
|
126
|
+
} catch (e) {
|
|
127
|
+
logError(`Error invoking ${code} adapter.gvlid()`, e)
|
|
128
|
+
}
|
|
129
|
+
})(adapter?.adapter?.gvlid)
|
|
127
130
|
}
|
|
128
131
|
|
|
129
132
|
export function shouldEnforce(consentData, purpose, name) {
|
|
@@ -145,20 +148,20 @@ export function shouldEnforce(consentData, purpose, name) {
|
|
|
145
148
|
* @param {Object} consentData - gdpr consent data
|
|
146
149
|
* @param {string=} currentModule - Bidder code of the current module
|
|
147
150
|
* @param {number=} gvlId - GVL ID for the module
|
|
148
|
-
* @param vendorlessModule a predicate function that takes a module name, and returns true if the module does not need vendor consent
|
|
149
151
|
* @returns {boolean}
|
|
150
152
|
*/
|
|
151
|
-
export function validateRules(rule, consentData, currentModule, gvlId
|
|
153
|
+
export function validateRules(rule, consentData, currentModule, gvlId) {
|
|
152
154
|
const purposeId = TCF2[Object.keys(TCF2).filter(purposeName => TCF2[purposeName].name === rule.purpose)[0]].id;
|
|
153
155
|
|
|
154
156
|
// return 'true' if vendor present in 'vendorExceptions'
|
|
155
|
-
if (
|
|
157
|
+
if ((rule.vendorExceptions || []).includes(currentModule)) {
|
|
156
158
|
return true;
|
|
157
159
|
}
|
|
160
|
+
const vendorConsentRequred = !((gvlId === VENDORLESS_GVLID || (rule.softVendorExceptions || []).includes(currentModule)))
|
|
158
161
|
|
|
159
162
|
// get data from the consent string
|
|
160
163
|
const purposeConsent = deepAccess(consentData, `vendorData.purpose.consents.${purposeId}`);
|
|
161
|
-
const vendorConsent = deepAccess(consentData, `vendorData.vendor.consents.${gvlId}`);
|
|
164
|
+
const vendorConsent = vendorConsentRequred ? deepAccess(consentData, `vendorData.vendor.consents.${gvlId}`) : true;
|
|
162
165
|
const liTransparency = deepAccess(consentData, `vendorData.purpose.legitimateInterests.${purposeId}`);
|
|
163
166
|
|
|
164
167
|
/*
|
|
@@ -166,7 +169,7 @@ export function validateRules(rule, consentData, currentModule, gvlId, vendorles
|
|
|
166
169
|
or the user has consented. Similar with vendors.
|
|
167
170
|
*/
|
|
168
171
|
const purposeAllowed = rule.enforcePurpose === false || purposeConsent === true;
|
|
169
|
-
const vendorAllowed =
|
|
172
|
+
const vendorAllowed = rule.enforceVendor === false || vendorConsent === true;
|
|
170
173
|
|
|
171
174
|
/*
|
|
172
175
|
Few if any vendors should be declaring Legitimate Interest for Device Access (Purpose 1), but some are claiming
|
|
@@ -183,19 +186,18 @@ export function validateRules(rule, consentData, currentModule, gvlId, vendorles
|
|
|
183
186
|
/**
|
|
184
187
|
* This hook checks whether module has permission to access device or not. Device access include cookie and local storage
|
|
185
188
|
* @param {Function} fn reference to original function (used by hook logic)
|
|
186
|
-
* @param isVendorless if true, do not require vendor consent (for e.g. core modules)
|
|
187
189
|
* @param {Number=} gvlid gvlid of the module
|
|
188
190
|
* @param {string=} moduleName name of the module
|
|
189
191
|
* @param result
|
|
190
192
|
*/
|
|
191
|
-
export function deviceAccessHook(fn,
|
|
193
|
+
export function deviceAccessHook(fn, gvlid, moduleName, result, {validate = validateRules} = {}) {
|
|
192
194
|
result = Object.assign({}, {
|
|
193
195
|
hasEnforcementHook: true
|
|
194
196
|
});
|
|
195
197
|
if (!hasDeviceAccess()) {
|
|
196
198
|
logWarn('Device access is disabled by Publisher');
|
|
197
199
|
result.valid = false;
|
|
198
|
-
} else if (
|
|
200
|
+
} else if (gvlid === VENDORLESS_GVLID && !strictStorageEnforcement) {
|
|
199
201
|
// for vendorless (core) storage, do not enforce rules unless strictStorageEnforcement is set
|
|
200
202
|
result.valid = true;
|
|
201
203
|
} else {
|
|
@@ -203,13 +205,13 @@ export function deviceAccessHook(fn, isVendorless, gvlid, moduleName, result, {v
|
|
|
203
205
|
if (shouldEnforce(consentData, 1, moduleName)) {
|
|
204
206
|
const curBidder = config.getCurrentBidder();
|
|
205
207
|
// Bidders have a copy of storage object with bidder code binded. Aliases will also pass the same bidder code when invoking storage functions and hence if alias tries to access device we will try to grab the gvl id for alias instead of original bidder
|
|
206
|
-
if (curBidder && (curBidder
|
|
208
|
+
if (curBidder && (curBidder !== moduleName) && adapterManager.aliasRegistry[curBidder] === moduleName) {
|
|
207
209
|
gvlid = getGvlid(curBidder);
|
|
208
210
|
} else {
|
|
209
211
|
gvlid = getGvlid(moduleName) || gvlid;
|
|
210
212
|
}
|
|
211
213
|
const curModule = moduleName || curBidder;
|
|
212
|
-
let isAllowed = validate(purpose1Rule, consentData, curModule, gvlid,
|
|
214
|
+
let isAllowed = validate(purpose1Rule, consentData, curModule, gvlid,);
|
|
213
215
|
if (isAllowed) {
|
|
214
216
|
result.valid = true;
|
|
215
217
|
} else {
|
|
@@ -221,7 +223,7 @@ export function deviceAccessHook(fn, isVendorless, gvlid, moduleName, result, {v
|
|
|
221
223
|
result.valid = true;
|
|
222
224
|
}
|
|
223
225
|
}
|
|
224
|
-
fn.call(this,
|
|
226
|
+
fn.call(this, gvlid, moduleName, result);
|
|
225
227
|
}
|
|
226
228
|
|
|
227
229
|
/**
|
|
@@ -314,7 +316,7 @@ export function enableAnalyticsHook(fn, config) {
|
|
|
314
316
|
}
|
|
315
317
|
config = config.filter(conf => {
|
|
316
318
|
const analyticsAdapterCode = conf.provider;
|
|
317
|
-
const gvlid = getGvlid(analyticsAdapterCode);
|
|
319
|
+
const gvlid = getGvlid(analyticsAdapterCode, conf);
|
|
318
320
|
const isAllowed = !!validateRules(purpose7Rule, consentData, analyticsAdapterCode, gvlid);
|
|
319
321
|
if (!isAllowed) {
|
|
320
322
|
analyticsBlocked.push(analyticsAdapterCode);
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import AnalyticsAdapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
|
|
2
|
+
import {prefixLog, isPlainObject} from '../src/utils.js';
|
|
3
|
+
import * as CONSTANTS from '../src/constants.json';
|
|
4
|
+
import adapterManager from '../src/adapterManager.js';
|
|
5
|
+
import {ajaxBuilder} from '../src/ajax.js';
|
|
6
|
+
|
|
7
|
+
const DEFAULTS = {
|
|
8
|
+
batchSize: 1,
|
|
9
|
+
batchDelay: 100,
|
|
10
|
+
method: 'POST'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const TYPES = {
|
|
14
|
+
handler: 'function',
|
|
15
|
+
batchSize: 'number',
|
|
16
|
+
batchDelay: 'number',
|
|
17
|
+
gvlid: 'number',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const MAX_CALL_DEPTH = 20;
|
|
21
|
+
|
|
22
|
+
export function GenericAnalytics() {
|
|
23
|
+
const parent = AnalyticsAdapter({analyticsType: 'endpoint'});
|
|
24
|
+
const {logError, logWarn} = prefixLog('Generic analytics:');
|
|
25
|
+
let batch = [];
|
|
26
|
+
let callDepth = 0;
|
|
27
|
+
let options, handler, timer, translate;
|
|
28
|
+
|
|
29
|
+
function optionsAreValid(options) {
|
|
30
|
+
if (!options.url && !options.handler) {
|
|
31
|
+
logError('options must specify either `url` or `handler`')
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (options.hasOwnProperty('method') && !['GET', 'POST'].includes(options.method)) {
|
|
35
|
+
logError('options.method must be GET or POST');
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
for (const [field, type] of Object.entries(TYPES)) {
|
|
39
|
+
// eslint-disable-next-line valid-typeof
|
|
40
|
+
if (options.hasOwnProperty(field) && typeof options[field] !== type) {
|
|
41
|
+
logError(`options.${field} must be a ${type}`);
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (options.hasOwnProperty('events')) {
|
|
46
|
+
if (!isPlainObject(options.events)) {
|
|
47
|
+
logError('options.events must be an object');
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
for (const [event, handler] of Object.entries(options.events)) {
|
|
51
|
+
if (!CONSTANTS.EVENTS.hasOwnProperty(event)) {
|
|
52
|
+
logWarn(`options.events.${event} does not match any known Prebid event`);
|
|
53
|
+
if (typeof handler !== 'function') {
|
|
54
|
+
logError(`options.events.${event} must be a function`);
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function processBatch() {
|
|
64
|
+
const currentBatch = batch;
|
|
65
|
+
batch = [];
|
|
66
|
+
callDepth++;
|
|
67
|
+
try {
|
|
68
|
+
// the pub-provided handler may inadvertently cause an infinite chain of events;
|
|
69
|
+
// even just logging an exception from it may cause an AUCTION_DEBUG event, that
|
|
70
|
+
// gets back to the handler, that throws another exception etc.
|
|
71
|
+
// to avoid the issue, put a cap on recursion
|
|
72
|
+
if (callDepth === MAX_CALL_DEPTH) {
|
|
73
|
+
logError('detected probable infinite recursion, discarding events', currentBatch);
|
|
74
|
+
}
|
|
75
|
+
if (callDepth >= MAX_CALL_DEPTH) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
handler(currentBatch);
|
|
80
|
+
} catch (e) {
|
|
81
|
+
logError('error executing options.handler', e);
|
|
82
|
+
}
|
|
83
|
+
} finally {
|
|
84
|
+
callDepth--;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function translator(eventHandlers) {
|
|
89
|
+
if (!eventHandlers) {
|
|
90
|
+
return (data) => data;
|
|
91
|
+
}
|
|
92
|
+
return function ({eventType, args}) {
|
|
93
|
+
if (eventHandlers.hasOwnProperty(eventType)) {
|
|
94
|
+
try {
|
|
95
|
+
return eventHandlers[eventType](args);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
logError(`error executing options.events.${eventType}`, e);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return Object.assign(
|
|
104
|
+
Object.create(parent),
|
|
105
|
+
{
|
|
106
|
+
gvlid(config) {
|
|
107
|
+
return config?.options?.gvlid
|
|
108
|
+
},
|
|
109
|
+
enableAnalytics(config) {
|
|
110
|
+
if (optionsAreValid(config?.options || {})) {
|
|
111
|
+
options = Object.assign({}, DEFAULTS, config.options);
|
|
112
|
+
handler = options.handler || defaultHandler(options);
|
|
113
|
+
translate = translator(options.events);
|
|
114
|
+
parent.enableAnalytics.call(this, config);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
track(event) {
|
|
118
|
+
if (event.eventType === CONSTANTS.EVENTS.AUCTION_INIT && event.args.hasOwnProperty('config')) {
|
|
119
|
+
// clean up auctionInit event
|
|
120
|
+
// TODO: remove this special case in v8
|
|
121
|
+
delete event.args.config;
|
|
122
|
+
}
|
|
123
|
+
const datum = translate(event);
|
|
124
|
+
if (datum != null) {
|
|
125
|
+
batch.push(datum);
|
|
126
|
+
if (timer != null) {
|
|
127
|
+
clearTimeout(timer);
|
|
128
|
+
timer = null;
|
|
129
|
+
}
|
|
130
|
+
if (batch.length >= options.batchSize) {
|
|
131
|
+
processBatch();
|
|
132
|
+
} else {
|
|
133
|
+
timer = setTimeout(processBatch, options.batchDelay);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function defaultHandler({url, method, batchSize, ajax = ajaxBuilder()}) {
|
|
142
|
+
const callbacks = {
|
|
143
|
+
success() {},
|
|
144
|
+
error() {}
|
|
145
|
+
}
|
|
146
|
+
const extract = batchSize > 1 ? (events) => events : (events) => events[0];
|
|
147
|
+
const serialize = method === 'GET' ? (data) => ({data: JSON.stringify(data)}) : (data) => JSON.stringify(data);
|
|
148
|
+
|
|
149
|
+
return function (events) {
|
|
150
|
+
ajax(url, callbacks, serialize(extract(events)), {method})
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
adapterManager.registerAnalyticsAdapter({
|
|
155
|
+
adapter: GenericAnalytics(),
|
|
156
|
+
code: 'generic',
|
|
157
|
+
});
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
import { submodule } from '../src/hook.js';
|
|
19
19
|
import { ajax } from '../src/ajax.js';
|
|
20
20
|
import { generateUUID, insertElement, isEmpty, logError } from '../src/utils.js';
|
|
21
|
+
import * as events from '../src/events.js';
|
|
22
|
+
import CONSTANTS from '../src/constants.json';
|
|
21
23
|
|
|
22
24
|
/** @type {string} */
|
|
23
25
|
const SUBMODULE_NAME = 'geoedge';
|
|
@@ -105,6 +107,7 @@ function getMacros(bid, key) {
|
|
|
105
107
|
'%%PATTERN:hb_bidder%%': bid.bidderCode,
|
|
106
108
|
'%_isHb!': true,
|
|
107
109
|
'%_hbcid!': bid.creativeId || '',
|
|
110
|
+
'%_hbadomains': bid.meta && bid.meta.advertiserDomains,
|
|
108
111
|
'%%PATTERN:hb_pb%%': bid.pbHg,
|
|
109
112
|
'%%SITE%%': location.hostname,
|
|
110
113
|
'%_pimp%': PV_ID
|
|
@@ -184,6 +187,24 @@ function conditionallyWrap(bidResponse, config, userConsent) {
|
|
|
184
187
|
}
|
|
185
188
|
}
|
|
186
189
|
|
|
190
|
+
/**
|
|
191
|
+
* Fire billable events for applicable bids
|
|
192
|
+
*/
|
|
193
|
+
function fireBillableEventsForApplicableBids(params) {
|
|
194
|
+
events.on(CONSTANTS.EVENTS.BID_WON, function (winningBid) {
|
|
195
|
+
if (shouldWrap(winningBid, params)) {
|
|
196
|
+
events.emit(CONSTANTS.EVENTS.BILLABLE_EVENT, {
|
|
197
|
+
vendor: SUBMODULE_NAME,
|
|
198
|
+
billingId: generateUUID(),
|
|
199
|
+
type: 'impression',
|
|
200
|
+
transactionId: winningBid.transactionId,
|
|
201
|
+
auctionId: winningBid.auctionId,
|
|
202
|
+
bidId: winningBid.requestId
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
187
208
|
function init(config, userConsent) {
|
|
188
209
|
let params = config.params;
|
|
189
210
|
if (!params || !params.key) {
|
|
@@ -191,6 +212,7 @@ function init(config, userConsent) {
|
|
|
191
212
|
return false;
|
|
192
213
|
}
|
|
193
214
|
preloadClient(params.key);
|
|
215
|
+
fireBillableEventsForApplicableBids(params);
|
|
194
216
|
return true;
|
|
195
217
|
}
|
|
196
218
|
|
|
@@ -4,9 +4,11 @@ import {BANNER} from '../src/mediaTypes.js';
|
|
|
4
4
|
|
|
5
5
|
const ENDPOINT = 'https://prebid.mes.glomex.cloud/request-bid'
|
|
6
6
|
const BIDDER_CODE = 'glomex'
|
|
7
|
+
const GVLID = 967
|
|
7
8
|
|
|
8
9
|
export const spec = {
|
|
9
10
|
code: BIDDER_CODE,
|
|
11
|
+
gvlid: GVLID,
|
|
10
12
|
supportedMediaTypes: [BANNER],
|
|
11
13
|
|
|
12
14
|
isBidRequestValid: function (bid) {
|
|
@@ -39,19 +39,18 @@ export const gravitoIdSystemSubmodule = {
|
|
|
39
39
|
* decode the stored id value for passing to bid requests
|
|
40
40
|
* @function
|
|
41
41
|
* @param { {gravitompId: string} } value
|
|
42
|
-
* @returns { {gravitompId: {
|
|
42
|
+
* @returns { {gravitompId: {string} } | undefined }
|
|
43
43
|
*/
|
|
44
44
|
decode: function(value) {
|
|
45
45
|
if (value && typeof value === 'object') {
|
|
46
|
-
|
|
46
|
+
var result = {};
|
|
47
47
|
if (value.gravitompId) {
|
|
48
|
-
result
|
|
48
|
+
result = value.gravitompId
|
|
49
49
|
}
|
|
50
50
|
return {gravitompId: result};
|
|
51
51
|
}
|
|
52
52
|
return undefined;
|
|
53
53
|
},
|
|
54
|
-
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
submodule('userId', gravitoIdSystemSubmodule);
|
|
@@ -652,7 +652,7 @@ function getUserIdFromFPDStorage() {
|
|
|
652
652
|
function segmentProcessing(segment, forceSegName) {
|
|
653
653
|
return segment
|
|
654
654
|
.map((seg) => {
|
|
655
|
-
const value = seg && (seg.
|
|
655
|
+
const value = seg && (seg.id || seg);
|
|
656
656
|
if (typeof value === 'string' || typeof value === 'number') {
|
|
657
657
|
return {
|
|
658
658
|
value: value.toString(),
|
|
@@ -432,7 +432,7 @@ export function getSyncUrl() {
|
|
|
432
432
|
function segmentProcessing(segment, forceSegName) {
|
|
433
433
|
return segment
|
|
434
434
|
.map((seg) => {
|
|
435
|
-
const value = seg && (seg.
|
|
435
|
+
const value = seg && (seg.id || seg);
|
|
436
436
|
if (typeof value === 'string' || typeof value === 'number') {
|
|
437
437
|
return {
|
|
438
438
|
value: value.toString(),
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* growthCodeAnalyticsAdapter.js - GrowthCode Analytics Adapter
|
|
3
|
+
*/
|
|
4
|
+
import { ajax } from '../src/ajax.js';
|
|
5
|
+
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
|
|
6
|
+
import adapterManager from '../src/adapterManager.js';
|
|
7
|
+
import * as utils from '../src/utils.js';
|
|
8
|
+
import CONSTANTS from '../src/constants.json';
|
|
9
|
+
import { getStorageManager } from '../src/storageManager.js';
|
|
10
|
+
import {getRefererInfo} from '../src/refererDetection.js';
|
|
11
|
+
import {logError, logInfo} from '../src/utils.js';
|
|
12
|
+
|
|
13
|
+
const MODULE_NAME = 'growthCodeAnalytics';
|
|
14
|
+
const DEFAULT_PID = 'INVALID_PID'
|
|
15
|
+
const ENDPOINT_URL = 'https://p2.gcprivacy.com/v1/pb/analytics'
|
|
16
|
+
|
|
17
|
+
export const storage = getStorageManager();
|
|
18
|
+
|
|
19
|
+
let sessionId = utils.generateUUID();
|
|
20
|
+
|
|
21
|
+
let trackEvents = [];
|
|
22
|
+
let pid = DEFAULT_PID;
|
|
23
|
+
let url = ENDPOINT_URL;
|
|
24
|
+
|
|
25
|
+
let eventQueue = [];
|
|
26
|
+
|
|
27
|
+
let startAuction = 0;
|
|
28
|
+
let bidRequestTimeout = 0;
|
|
29
|
+
let analyticsType = 'endpoint';
|
|
30
|
+
|
|
31
|
+
let growthCodeAnalyticsAdapter = Object.assign(adapter({url: url, analyticsType}), {
|
|
32
|
+
track({eventType, eventData}) {
|
|
33
|
+
eventData = eventData ? JSON.parse(JSON.stringify(eventData)) : {};
|
|
34
|
+
let data = {};
|
|
35
|
+
if (!trackEvents.includes(eventType)) return;
|
|
36
|
+
switch (eventType) {
|
|
37
|
+
case CONSTANTS.EVENTS.AUCTION_INIT: {
|
|
38
|
+
data = eventData;
|
|
39
|
+
startAuction = data.timestamp;
|
|
40
|
+
bidRequestTimeout = data.timeout;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
case CONSTANTS.EVENTS.AUCTION_END: {
|
|
45
|
+
data = eventData;
|
|
46
|
+
data.start = startAuction;
|
|
47
|
+
data.end = Date.now();
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
case CONSTANTS.EVENTS.BID_ADJUSTMENT: {
|
|
52
|
+
data.bidders = eventData;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
case CONSTANTS.EVENTS.BID_TIMEOUT: {
|
|
57
|
+
data.bidders = eventData;
|
|
58
|
+
data.duration = bidRequestTimeout;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
case CONSTANTS.EVENTS.BID_REQUESTED: {
|
|
63
|
+
data = eventData;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
case CONSTANTS.EVENTS.BID_RESPONSE: {
|
|
68
|
+
data = eventData;
|
|
69
|
+
delete data.ad;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
case CONSTANTS.EVENTS.BID_WON: {
|
|
74
|
+
data = eventData;
|
|
75
|
+
delete data.ad;
|
|
76
|
+
delete data.adUrl;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
case CONSTANTS.EVENTS.BIDDER_DONE: {
|
|
81
|
+
data = eventData;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
case CONSTANTS.EVENTS.SET_TARGETING: {
|
|
86
|
+
data.targetings = eventData;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
case CONSTANTS.EVENTS.REQUEST_BIDS: {
|
|
91
|
+
data = eventData;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
case CONSTANTS.EVENTS.ADD_AD_UNITS: {
|
|
96
|
+
data = eventData;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
default:
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
data.eventType = eventType;
|
|
105
|
+
data.timestamp = data.timestamp || Date.now();
|
|
106
|
+
|
|
107
|
+
sendEvent(data);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
growthCodeAnalyticsAdapter.originEnableAnalytics = growthCodeAnalyticsAdapter.enableAnalytics;
|
|
112
|
+
|
|
113
|
+
growthCodeAnalyticsAdapter.enableAnalytics = function(conf = {}) {
|
|
114
|
+
if (typeof conf.options === 'object') {
|
|
115
|
+
if (conf.options.pid) {
|
|
116
|
+
pid = conf.options.pid;
|
|
117
|
+
url = conf.options.url ? conf.options.url : ENDPOINT_URL;
|
|
118
|
+
} else {
|
|
119
|
+
logError(MODULE_NAME + ' Not a valid PartnerID')
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
if (conf.options.trackEvents) {
|
|
123
|
+
trackEvents = conf.options.trackEvents;
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
logError(MODULE_NAME + ' Invalid configuration');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
growthCodeAnalyticsAdapter.originEnableAnalytics(conf);
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
function logToServer() {
|
|
134
|
+
if (pid === DEFAULT_PID) return;
|
|
135
|
+
if (eventQueue.length > 1) {
|
|
136
|
+
let data = {
|
|
137
|
+
session: sessionId,
|
|
138
|
+
pid: pid,
|
|
139
|
+
timestamp: Date.now(),
|
|
140
|
+
timezoneoffset: new Date().getTimezoneOffset(),
|
|
141
|
+
url: getRefererInfo().page,
|
|
142
|
+
referer: document.referrer,
|
|
143
|
+
events: eventQueue
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
ajax(url, {
|
|
147
|
+
success: response => {
|
|
148
|
+
logInfo(MODULE_NAME + ' Send Data to Server')
|
|
149
|
+
},
|
|
150
|
+
error: error => {
|
|
151
|
+
logInfo(MODULE_NAME + ' Problem Send Data to Server: ' + error)
|
|
152
|
+
}
|
|
153
|
+
}, JSON.stringify(data), {method: 'POST', withCredentials: true})
|
|
154
|
+
|
|
155
|
+
eventQueue = [
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function sendEvent(event) {
|
|
161
|
+
eventQueue.push(event);
|
|
162
|
+
logInfo(MODULE_NAME + 'Analytics Event: ' + event);
|
|
163
|
+
|
|
164
|
+
if (event.eventType === CONSTANTS.EVENTS.AUCTION_END) {
|
|
165
|
+
logToServer();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
adapterManager.registerAnalyticsAdapter({
|
|
170
|
+
adapter: growthCodeAnalyticsAdapter,
|
|
171
|
+
code: 'growthCodeAnalytics'
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
growthCodeAnalyticsAdapter.logToServer = logToServer;
|
|
175
|
+
|
|
176
|
+
export default growthCodeAnalyticsAdapter;
|