prebid.js 8.7.0 → 8.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/1plusXRtdProvider.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/a1MediaRtdProvider.js +1 -1
- package/dist/adWMGAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
- package/dist/adlooxAdServerVideo.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/admaticBidAdapter.js +1 -1
- package/dist/admixerIdSystem.js +1 -1
- package/dist/adnuntiusRtdProvider.js +1 -1
- package/dist/adpartnerBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adqueryIdSystem.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adriverIdSystem.js +1 -1
- package/dist/adtelligentIdSystem.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/adyoulikeBidAdapter.js +1 -1
- package/dist/aidemBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/akamaiDapRtdProvider.js +1 -1
- package/dist/alkimiBidAdapter.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/automatadBidAdapter.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/brandmetricsRtdProvider.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/brightcomSSPBidAdapter.js +1 -1
- package/dist/britepoolIdSystem.js +1 -1
- package/dist/browsiRtdProvider.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/categoryTranslation.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/colossussspBidAdapter.js +1 -1
- package/dist/concertAnalyticsAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/criteoIdSystem.js +1 -1
- package/dist/currency.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dacIdSystem.js +1 -1
- package/dist/dailyhuntBidAdapter.js +1 -1
- package/dist/datablocksBidAdapter.js +1 -1
- package/dist/dependencies.json +4 -1
- package/dist/dgkeywordRtdProvider.js +1 -1
- package/dist/dmdIdSystem.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningAnalyticsAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/fabrickIdSystem.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/fledgeForGpt.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/genericAnalyticsAdapter.js +1 -1
- package/dist/geoedgeRtdProvider.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/gnetBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/growthCodeAnalyticsAdapter.js +1 -1
- package/dist/growthCodeIdSystem.js +1 -1
- package/dist/growthCodeRtdProvider.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronAnalyticsAdapter.js +1 -1
- package/dist/hadronIdSystem.js +1 -1
- package/dist/hadronRtdProvider.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/iasRtdProvider.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/idImportLibrary.js +1 -1
- package/dist/identityLinkIdSystem.js +1 -1
- package/dist/imRtdProvider.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/impactifyBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/imuIdSystem.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqIdSystem.js +1 -1
- package/dist/invisiblyAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.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/konduitWrapper.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/limelightDigitalBidAdapter.js +1 -1
- package/dist/liveIntentAnalyticsAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.js +1 -1
- package/dist/luponmediaBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/mantisBidAdapter.js +1 -1
- package/dist/marsmediaAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/merkleIdSystem.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/mgidRtdProvider.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/mspa.js +1 -1
- package/dist/mwOpenLinkIdSystem.js +1 -1
- package/dist/nativoBidAdapter.js +1 -1
- package/dist/naveggIdSystem.js +1 -1
- package/dist/neuwoRtdProvider.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +248 -247
- package/dist/novatiqIdSystem.js +1 -1
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/open8BidAdapter.js +1 -1
- package/dist/operaadsBidAdapter.js +1 -1
- package/dist/operaadsIdSystem.js +1 -0
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/optimeraRtdProvider.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/oxxionAnalyticsAdapter.js +1 -1
- package/dist/oxxionRtdProvider.js +1 -1
- package/dist/parrableIdSystem.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/priceFloors.js +1 -1
- package/dist/prismaBidAdapter.js +1 -1
- package/dist/pubgeniusBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.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/qwarryBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/reconciliationRtdProvider.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevadRtdProvider.js +1 -1
- package/dist/retailspotBidAdapter.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/rubiconBidAdapter.js +1 -1
- package/dist/scaleableAnalyticsAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/silverpushBidAdapter.js +1 -1
- package/dist/sirdataRtdProvider.js +1 -1
- package/dist/slimcutBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smartyadsBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/snigelBidAdapter.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/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/talkadsBidAdapter.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/timeoutRtdProvider.js +1 -1
- package/dist/topicsFpdModule.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unifiedIdSystem.js +1 -1
- package/dist/verizonMediaIdSystem.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/weboramaRtdProvider.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/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspBidAdapter.js +1 -1
- package/integrationExamples/gpt/growthcode.html +3 -12
- package/integrationExamples/topics/topics-server.js +72 -0
- package/libraries/mspa/activityControls.js +3 -1
- package/modules/.submodules.json +2 -1
- package/modules/a1MediaRtdProvider.js +1 -1
- package/modules/adagioBidAdapter.js +11 -3
- package/modules/admaticBidAdapter.js +5 -0
- package/modules/adqueryBidAdapter.js +23 -21
- package/modules/adqueryIdSystem.js +45 -30
- package/modules/adrelevantisBidAdapter.js +2 -0
- package/modules/bidViewability.js +7 -0
- package/modules/bidViewability.md +9 -8
- package/modules/brandmetricsRtdProvider.js +30 -27
- package/modules/concertBidAdapter.js +1 -0
- package/modules/criteoBidAdapter.js +66 -43
- package/modules/fledgeForGpt.js +17 -4
- package/modules/fledgeForGpt.md +17 -10
- package/modules/geoedgeRtdProvider.js +44 -18
- package/modules/geoedgeRtdProvider.md +2 -1
- package/modules/growthCodeAnalyticsAdapter.js +7 -4
- package/modules/growthCodeAnalyticsAdapter.md +1 -7
- package/modules/liveIntentIdSystem.js +16 -1
- package/modules/nativoBidAdapter.js +21 -3
- package/modules/nexx360BidAdapter.js +7 -1
- package/modules/onetagBidAdapter.js +3 -0
- package/modules/operaadsBidAdapter.js +5 -0
- package/modules/operaadsBidAdapter.md +5 -5
- package/modules/operaadsIdSystem.js +106 -0
- package/modules/operaadsIdSystem.md +52 -0
- package/modules/oxxionAnalyticsAdapter.js +22 -5
- package/modules/prebidServerBidAdapter/index.js +8 -2
- package/modules/pubmaticAnalyticsAdapter.js +16 -3
- package/modules/rubiconBidAdapter.js +2 -2
- package/modules/smartyadsBidAdapter.js +18 -1
- package/modules/snigelBidAdapter.js +69 -16
- package/modules/snigelBidAdapter.md +9 -3
- package/modules/topicsFpdModule.js +35 -9
- package/modules/visxBidAdapter.js +51 -1
- package/package.json +2 -2
- package/src/adapters/bidderFactory.js +14 -5
- package/src/adloader.js +1 -0
- package/src/ajax.js +126 -87
- package/src/constants.json +8 -2
- package/src/native.js +14 -3
- package/test/mocks/xhr.js +256 -9
- package/test/spec/libraries/mspa/activityControls_spec.js +6 -0
- package/test/spec/modules/adagioBidAdapter_spec.js +15 -0
- package/test/spec/modules/adlooxAdServerVideo_spec.js +1 -5
- package/test/spec/modules/adlooxRtdProvider_spec.js +1 -5
- package/test/spec/modules/admaticBidAdapter_spec.js +5 -0
- package/test/spec/modules/adqueryIdSystem_spec.js +13 -24
- package/test/spec/modules/bidViewability_spec.js +32 -1
- package/test/spec/modules/brandmetricsRtdProvider_spec.js +6 -0
- package/test/spec/modules/categoryTranslation_spec.js +7 -9
- package/test/spec/modules/concertBidAdapter_spec.js +1 -1
- package/test/spec/modules/conversantAnalyticsAdapter_spec.js +3 -5
- package/test/spec/modules/criteoBidAdapter_spec.js +228 -0
- package/test/spec/modules/currency_spec.js +2 -2
- package/test/spec/modules/dmdIdSystem_spec.js +2 -2
- package/test/spec/modules/eids_spec.js +48 -0
- package/test/spec/modules/euidIdSystem_spec.js +10 -9
- package/test/spec/modules/feedadBidAdapter_spec.js +1 -1
- package/test/spec/modules/fledge_spec.js +117 -43
- package/test/spec/modules/geoedgeRtdProvider_spec.js +52 -39
- package/test/spec/modules/greenbidsRtdProvider_spec.js +3 -12
- package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +0 -1
- package/test/spec/modules/hadronIdSystem_spec.js +1 -1
- package/test/spec/modules/id5AnalyticsAdapter_spec.js +1 -7
- package/test/spec/modules/id5IdSystem_spec.js +25 -25
- package/test/spec/modules/identityLinkIdSystem_spec.js +0 -2
- package/test/spec/modules/intentIqIdSystem_spec.js +0 -2
- package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +2 -6
- package/test/spec/modules/jwplayerRtdProvider_spec.js +26 -28
- package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +5 -0
- package/test/spec/modules/liveIntentIdSystem_spec.js +5 -0
- package/test/spec/modules/magniteAnalyticsAdapter_spec.js +2 -2
- package/test/spec/modules/mgidRtdProvider_spec.js +1 -5
- package/test/spec/modules/nativoBidAdapter_spec.js +6 -1
- package/test/spec/modules/nexx360BidAdapter_spec.js +48 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +5 -19
- package/test/spec/modules/onetagBidAdapter_spec.js +69 -0
- package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/operaadsIdSystem_spec.js +53 -0
- package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +6 -1
- package/test/spec/modules/prebidServerBidAdapter_spec.js +33 -2
- package/test/spec/modules/priceFloors_spec.js +33 -37
- package/test/spec/modules/publinkIdSystem_spec.js +1 -1
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +102 -18
- package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +2 -8
- package/test/spec/modules/rubiconBidAdapter_spec.js +24 -0
- package/test/spec/modules/smartyadsBidAdapter_spec.js +49 -0
- package/test/spec/modules/snigelBidAdapter_spec.js +57 -6
- package/test/spec/modules/teadsIdSystem_spec.js +1 -1
- package/test/spec/modules/topicsFpdModule_spec.js +102 -1
- package/test/spec/modules/uid2IdSystem_helpers.js +5 -5
- package/test/spec/modules/uid2IdSystem_spec.js +24 -24
- package/test/spec/modules/userId_spec.js +1 -1
- package/test/spec/modules/visxBidAdapter_spec.js +151 -1
- package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +2 -5
- package/test/spec/native_spec.js +20 -5
- package/test/spec/unit/core/ajax_spec.js +403 -0
- package/test/spec/unit/core/bidderFactory_spec.js +80 -8
- package/test/spec/videoCache_spec.js +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {config} from '../src/config.js';
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {BANNER} from '../src/mediaTypes.js';
|
|
4
|
-
import {deepAccess, isArray, isFn, isPlainObject} from '../src/utils.js';
|
|
4
|
+
import {deepAccess, isArray, isFn, isPlainObject, inIframe, getDNT} from '../src/utils.js';
|
|
5
5
|
import {hasPurpose1Consent} from '../src/utils/gpdr.js';
|
|
6
6
|
import {getGlobal} from '../src/prebidGlobal.js';
|
|
7
7
|
|
|
@@ -13,6 +13,7 @@ const DEFAULT_CURRENCIES = ['USD'];
|
|
|
13
13
|
const FLOOR_MATCH_ALL_SIZES = '*';
|
|
14
14
|
|
|
15
15
|
const getConfig = config.getConfig;
|
|
16
|
+
const refreshes = {};
|
|
16
17
|
|
|
17
18
|
export const spec = {
|
|
18
19
|
code: BIDDER_CODE,
|
|
@@ -29,12 +30,15 @@ export const spec = {
|
|
|
29
30
|
method: 'POST',
|
|
30
31
|
url: getEndpoint(),
|
|
31
32
|
data: JSON.stringify({
|
|
32
|
-
id: bidderRequest.
|
|
33
|
+
id: bidderRequest.auctionId,
|
|
34
|
+
accountId: deepAccess(bidRequests, '0.params.accountId'),
|
|
35
|
+
site: deepAccess(bidRequests, '0.params.site'),
|
|
33
36
|
cur: getCurrencies(),
|
|
34
37
|
test: getTestFlag(),
|
|
35
|
-
devw: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
|
|
36
|
-
devh: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
|
|
37
38
|
version: getGlobal().version,
|
|
39
|
+
gpp: deepAccess(bidderRequest, 'gppConsent.gppString') || deepAccess(bidderRequest, 'ortb2.regs.gpp'),
|
|
40
|
+
gpp_sid:
|
|
41
|
+
deepAccess(bidderRequest, 'gppConsent.applicableSections') || deepAccess(bidderRequest, 'ortb2.regs.gpp_sid'),
|
|
38
42
|
gdprApplies: gdprApplies,
|
|
39
43
|
gdprConsentString: gdprApplies === true ? deepAccess(bidderRequest, 'gdprConsent.consentString') : undefined,
|
|
40
44
|
gdprConsentProv: gdprApplies === true ? deepAccess(bidderRequest, 'gdprConsent.addtlConsent') : undefined,
|
|
@@ -43,12 +47,24 @@ export const spec = {
|
|
|
43
47
|
eids: deepAccess(bidRequests, '0.userIdAsEids'),
|
|
44
48
|
schain: deepAccess(bidRequests, '0.schain'),
|
|
45
49
|
page: getPage(bidderRequest),
|
|
50
|
+
topframe: inIframe() === true ? 0 : 1,
|
|
51
|
+
device: {
|
|
52
|
+
w: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
|
|
53
|
+
h: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
|
|
54
|
+
dnt: getDNT() ? 1 : 0,
|
|
55
|
+
language: getLanguage(),
|
|
56
|
+
},
|
|
46
57
|
placements: bidRequests.map((r) => {
|
|
47
58
|
return {
|
|
48
|
-
|
|
59
|
+
id: r.adUnitCode,
|
|
60
|
+
tid: r.transactionId,
|
|
61
|
+
gpid: deepAccess(r, 'ortb2Imp.ext.gpid'),
|
|
62
|
+
pbadslot: deepAccess(r, 'ortb2Imp.ext.data.pbadslot') || deepAccess(r, 'ortb2Imp.ext.gpid'),
|
|
49
63
|
name: r.params.placement,
|
|
50
64
|
sizes: r.sizes,
|
|
51
65
|
floor: getPriceFloor(r, BANNER, FLOOR_MATCH_ALL_SIZES),
|
|
66
|
+
refresh: getRefreshInformation(r.adUnitCode),
|
|
67
|
+
params: r.params.additionalParams,
|
|
52
68
|
};
|
|
53
69
|
}),
|
|
54
70
|
}),
|
|
@@ -56,14 +72,14 @@ export const spec = {
|
|
|
56
72
|
};
|
|
57
73
|
},
|
|
58
74
|
|
|
59
|
-
interpretResponse: function (serverResponse) {
|
|
75
|
+
interpretResponse: function (serverResponse, bidRequest) {
|
|
60
76
|
if (!serverResponse.body || !serverResponse.body.bids) {
|
|
61
77
|
return [];
|
|
62
78
|
}
|
|
63
79
|
|
|
64
80
|
return serverResponse.body.bids.map((bid) => {
|
|
65
81
|
return {
|
|
66
|
-
requestId: bid.
|
|
82
|
+
requestId: mapIdToRequestId(bid.id, bidRequest),
|
|
67
83
|
cpm: bid.price,
|
|
68
84
|
creativeId: bid.crid,
|
|
69
85
|
currency: serverResponse.body.cur,
|
|
@@ -77,9 +93,9 @@ export const spec = {
|
|
|
77
93
|
});
|
|
78
94
|
},
|
|
79
95
|
|
|
80
|
-
getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
|
|
96
|
+
getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) {
|
|
81
97
|
const syncUrl = getSyncUrl(responses || []);
|
|
82
|
-
if (syncUrl && syncOptions.iframeEnabled && hasSyncConsent(gdprConsent, uspConsent)) {
|
|
98
|
+
if (syncUrl && syncOptions.iframeEnabled && hasSyncConsent(gdprConsent, uspConsent, gppConsent)) {
|
|
83
99
|
return [{type: 'iframe', url: getSyncEndpoint(syncUrl, gdprConsent)}];
|
|
84
100
|
}
|
|
85
101
|
},
|
|
@@ -101,6 +117,14 @@ function getTestFlag() {
|
|
|
101
117
|
return getConfig(`${BIDDER_CODE}.test`) === true;
|
|
102
118
|
}
|
|
103
119
|
|
|
120
|
+
function getLanguage() {
|
|
121
|
+
return navigator && navigator.language
|
|
122
|
+
? navigator.language.indexOf('-') != -1
|
|
123
|
+
? navigator.language.split('-')[0]
|
|
124
|
+
: navigator.language
|
|
125
|
+
: undefined;
|
|
126
|
+
}
|
|
127
|
+
|
|
104
128
|
function getCurrencies() {
|
|
105
129
|
const currencyOverrides = getConfig(`${BIDDER_CODE}.cur`);
|
|
106
130
|
if (currencyOverrides !== undefined && (!isArray(currencyOverrides) || currencyOverrides.length === 0)) {
|
|
@@ -130,14 +154,43 @@ function getPriceFloor(bidRequest, mediaType, size) {
|
|
|
130
154
|
}
|
|
131
155
|
}
|
|
132
156
|
|
|
133
|
-
function
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
157
|
+
function getRefreshInformation(adUnitCode) {
|
|
158
|
+
const refresh = refreshes[adUnitCode];
|
|
159
|
+
if (!refresh) {
|
|
160
|
+
refreshes[adUnitCode] = {
|
|
161
|
+
count: 0,
|
|
162
|
+
previousTime: new Date(),
|
|
163
|
+
};
|
|
164
|
+
return undefined;
|
|
140
165
|
}
|
|
166
|
+
|
|
167
|
+
const currentTime = new Date();
|
|
168
|
+
const timeDifferenceSeconds = Math.floor((currentTime - refresh.previousTime) / 1000);
|
|
169
|
+
refresh.count += 1;
|
|
170
|
+
refresh.previousTime = currentTime;
|
|
171
|
+
return {
|
|
172
|
+
count: refresh.count,
|
|
173
|
+
time: timeDifferenceSeconds,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function mapIdToRequestId(id, bidRequest) {
|
|
178
|
+
return bidRequest.bidderRequest.bids.filter((bid) => bid.adUnitCode === id)[0].bidId;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function hasUspConsent(uspConsent) {
|
|
182
|
+
return typeof uspConsent !== 'string' || !(uspConsent[0] === '1' && uspConsent[2] === 'Y');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function hasGppConsent(gppConsent) {
|
|
186
|
+
return (
|
|
187
|
+
!(gppConsent && Array.isArray(gppConsent.applicableSections)) ||
|
|
188
|
+
gppConsent.applicableSections.every((section) => typeof section === 'number' && section <= 5)
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function hasSyncConsent(gdprConsent, uspConsent, gppConsent) {
|
|
193
|
+
return hasPurpose1Consent(gdprConsent) && hasUspConsent(uspConsent) && hasGppConsent(gppConsent);
|
|
141
194
|
}
|
|
142
195
|
|
|
143
196
|
function getSyncUrl(responses) {
|
|
@@ -15,9 +15,13 @@ Please reach out to us [through our contact form](https://snigel.com/get-in-touc
|
|
|
15
15
|
|
|
16
16
|
# Parameters
|
|
17
17
|
|
|
18
|
-
| Name
|
|
19
|
-
|
|
|
20
|
-
|
|
|
18
|
+
| Name | Required | Description |
|
|
19
|
+
| :-------- | :------- | :------------------- |
|
|
20
|
+
| accountId | Yes | Account identifier |
|
|
21
|
+
| site | Yes | Site identifier |
|
|
22
|
+
| placement | Yes | Placement identifier |
|
|
23
|
+
|
|
24
|
+
Snigel will provide all of these parameters to you.
|
|
21
25
|
|
|
22
26
|
# Test
|
|
23
27
|
|
|
@@ -37,6 +41,8 @@ var adUnits = [
|
|
|
37
41
|
{
|
|
38
42
|
bidder: "snigel",
|
|
39
43
|
params: {
|
|
44
|
+
accountId: "1000",
|
|
45
|
+
site: "test.com",
|
|
40
46
|
placement: "prebid_test_placement",
|
|
41
47
|
},
|
|
42
48
|
},
|
|
@@ -12,6 +12,7 @@ import {MODULE_TYPE_BIDDER} from '../src/activities/modules.js';
|
|
|
12
12
|
|
|
13
13
|
const MODULE_NAME = 'topicsFpd';
|
|
14
14
|
const DEFAULT_EXPIRATION_DAYS = 21;
|
|
15
|
+
const DEFAULT_FETCH_RATE_IN_DAYS = 1;
|
|
15
16
|
let LOAD_TOPICS_INITIALISE = false;
|
|
16
17
|
|
|
17
18
|
export function reset() {
|
|
@@ -85,6 +86,7 @@ export function getTopicsData(name, topics, taxonomies = TAXONOMIES) {
|
|
|
85
86
|
if (name != null) {
|
|
86
87
|
datum.name = name;
|
|
87
88
|
}
|
|
89
|
+
|
|
88
90
|
return datum;
|
|
89
91
|
})
|
|
90
92
|
);
|
|
@@ -96,6 +98,7 @@ function isTopicsSupported(doc = document) {
|
|
|
96
98
|
|
|
97
99
|
export function getTopics(doc = document) {
|
|
98
100
|
let topics = null;
|
|
101
|
+
|
|
99
102
|
try {
|
|
100
103
|
if (isTopicsSupported(doc)) {
|
|
101
104
|
topics = GreedyPromise.resolve(doc.browsingTopics());
|
|
@@ -106,6 +109,7 @@ export function getTopics(doc = document) {
|
|
|
106
109
|
if (topics == null) {
|
|
107
110
|
topics = GreedyPromise.resolve([]);
|
|
108
111
|
}
|
|
112
|
+
|
|
109
113
|
return topics;
|
|
110
114
|
}
|
|
111
115
|
|
|
@@ -165,7 +169,7 @@ export function receiveMessage(evt) {
|
|
|
165
169
|
let data = safeJSONParse(evt.data);
|
|
166
170
|
if (includes(getLoadedIframeURL(), evt.origin) && data && data.segment && !isEmpty(data.segment.topics)) {
|
|
167
171
|
const {domain, topics, bidder} = data.segment;
|
|
168
|
-
const iframeTopicsData = getTopicsData(domain, topics)
|
|
172
|
+
const iframeTopicsData = getTopicsData(domain, topics);
|
|
169
173
|
iframeTopicsData && storeInLocalStorage(bidder, iframeTopicsData);
|
|
170
174
|
}
|
|
171
175
|
} catch (err) { }
|
|
@@ -178,13 +182,15 @@ Function to store Topics data recieved from iframe in storage(name: "prebid:topi
|
|
|
178
182
|
*/
|
|
179
183
|
export function storeInLocalStorage(bidder, topics) {
|
|
180
184
|
const storedSegments = new Map(safeJSONParse(coreStorage.getDataFromLocalStorage(topicStorageName)));
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
185
|
+
const topicsObj = {
|
|
186
|
+
[lastUpdated]: new Date().getTime()
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
topics.forEach((topic) => {
|
|
190
|
+
topicsObj[topic.ext.segclass] = topic;
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
storedSegments.set(bidder, topicsObj);
|
|
188
194
|
coreStorage.setDataInLocalStorage(topicStorageName, JSON.stringify([...storedSegments]));
|
|
189
195
|
}
|
|
190
196
|
|
|
@@ -215,10 +221,11 @@ function listenMessagesFromTopicIframe() {
|
|
|
215
221
|
export function loadTopicsForBidders(doc = document) {
|
|
216
222
|
if (!isTopicsSupported(doc)) return;
|
|
217
223
|
const topics = config.getConfig('userSync.topics') || bidderIframeList;
|
|
224
|
+
|
|
218
225
|
if (topics) {
|
|
219
226
|
listenMessagesFromTopicIframe();
|
|
220
227
|
const randomBidders = getRandomBidders(topics.bidders || [], topics.maxTopicCaller || 1)
|
|
221
|
-
randomBidders && randomBidders.forEach(({ bidder, iframeURL }) => {
|
|
228
|
+
randomBidders && randomBidders.forEach(({ bidder, iframeURL, fetchUrl, fetchRate }) => {
|
|
222
229
|
if (bidder && iframeURL) {
|
|
223
230
|
let ifrm = doc.createElement('iframe');
|
|
224
231
|
ifrm.name = 'ifrm_'.concat(bidder);
|
|
@@ -227,6 +234,25 @@ export function loadTopicsForBidders(doc = document) {
|
|
|
227
234
|
setLoadedIframeURL(new URL(iframeURL).origin);
|
|
228
235
|
iframeURL && doc.documentElement.appendChild(ifrm);
|
|
229
236
|
}
|
|
237
|
+
|
|
238
|
+
if (bidder && fetchUrl) {
|
|
239
|
+
let storedSegments = new Map(safeJSONParse(coreStorage.getDataFromLocalStorage(topicStorageName)));
|
|
240
|
+
const bidderLsEntry = storedSegments.get(bidder);
|
|
241
|
+
|
|
242
|
+
if (!bidderLsEntry || (bidderLsEntry && isCachedDataExpired(bidderLsEntry[lastUpdated], fetchRate || DEFAULT_FETCH_RATE_IN_DAYS))) {
|
|
243
|
+
window.fetch(`${fetchUrl}?bidder=${bidder}`, {browsingTopics: true})
|
|
244
|
+
.then(response => {
|
|
245
|
+
return response.json();
|
|
246
|
+
})
|
|
247
|
+
.then(data => {
|
|
248
|
+
if (data && data.segment && !isEmpty(data.segment.topics)) {
|
|
249
|
+
const {domain, topics, bidder} = data.segment;
|
|
250
|
+
const fetchTopicsData = getTopicsData(domain, topics);
|
|
251
|
+
fetchTopicsData && storeInLocalStorage(bidder, fetchTopicsData);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
230
256
|
})
|
|
231
257
|
} else {
|
|
232
258
|
logWarn(`Topics config not defined under userSync Object`);
|
|
@@ -3,6 +3,7 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
|
3
3
|
import { config } from '../src/config.js';
|
|
4
4
|
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
5
5
|
import { INSTREAM as VIDEO_INSTREAM } from '../src/video.js';
|
|
6
|
+
import {getStorageManager} from '../src/storageManager.js';
|
|
6
7
|
const BIDDER_CODE = 'visx';
|
|
7
8
|
const GVLID = 154;
|
|
8
9
|
const BASE_URL = 'https://t.visx.net';
|
|
@@ -29,6 +30,7 @@ const LOG_ERROR_MESS = {
|
|
|
29
30
|
videoMissing: 'Bid request videoType property is missing - '
|
|
30
31
|
};
|
|
31
32
|
const currencyWhiteList = ['EUR', 'USD', 'GBP', 'PLN'];
|
|
33
|
+
export const storage = getStorageManager({bidderCode: BIDDER_CODE});
|
|
32
34
|
export const spec = {
|
|
33
35
|
code: BIDDER_CODE,
|
|
34
36
|
gvlid: GVLID,
|
|
@@ -117,10 +119,13 @@ export const spec = {
|
|
|
117
119
|
...(payloadSchain && { schain: payloadSchain })
|
|
118
120
|
}
|
|
119
121
|
};
|
|
122
|
+
|
|
123
|
+
const vads = _getUserId();
|
|
120
124
|
const user = {
|
|
121
125
|
ext: {
|
|
122
126
|
...(payloadUserEids && { eids: payloadUserEids }),
|
|
123
|
-
...(payload.gdpr_consent && { consent: payload.gdpr_consent })
|
|
127
|
+
...(payload.gdpr_consent && { consent: payload.gdpr_consent }),
|
|
128
|
+
...(vads && { vads })
|
|
124
129
|
}
|
|
125
130
|
};
|
|
126
131
|
const regs = ('gdpr_applies' in payload) && {
|
|
@@ -382,4 +387,49 @@ function _isAdSlotExists(adUnitCode) {
|
|
|
382
387
|
return false;
|
|
383
388
|
}
|
|
384
389
|
|
|
390
|
+
// Generate user id (25 chars) with NanoID
|
|
391
|
+
// https://github.com/ai/nanoid/
|
|
392
|
+
function _generateUserId() {
|
|
393
|
+
for (
|
|
394
|
+
var t = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict',
|
|
395
|
+
e = new Date().getTime() % 1073741824,
|
|
396
|
+
i = '',
|
|
397
|
+
o = 0;
|
|
398
|
+
o < 5;
|
|
399
|
+
o++
|
|
400
|
+
) {
|
|
401
|
+
i += t[e % 64];
|
|
402
|
+
e = Math.floor(e / 64);
|
|
403
|
+
}
|
|
404
|
+
for (o = 20; o--;) i += t[(64 * Math.random()) | 0];
|
|
405
|
+
return i;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
function _getUserId() {
|
|
409
|
+
const USER_ID_KEY = '__vads';
|
|
410
|
+
let vads;
|
|
411
|
+
|
|
412
|
+
if (storage.cookiesAreEnabled()) {
|
|
413
|
+
vads = storage.getCookie(USER_ID_KEY);
|
|
414
|
+
} else if (storage.localStorageIsEnabled()) {
|
|
415
|
+
vads = storage.getDataFromLocalStorage(USER_ID_KEY);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (vads && vads.length) {
|
|
419
|
+
return vads;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
vads = _generateUserId();
|
|
423
|
+
if (storage.cookiesAreEnabled()) {
|
|
424
|
+
const expires = new Date(Date.now() + 2592e6).toUTCString();
|
|
425
|
+
storage.setCookie(USER_ID_KEY, vads, expires);
|
|
426
|
+
return vads;
|
|
427
|
+
} else if (storage.localStorageIsEnabled()) {
|
|
428
|
+
storage.setDataInLocalStorage(USER_ID_KEY, vads);
|
|
429
|
+
return vads;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return null;
|
|
433
|
+
}
|
|
434
|
+
|
|
385
435
|
registerBidder(spec);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prebid.js",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.9.0",
|
|
4
4
|
"description": "Header Bidding Management Library",
|
|
5
5
|
"main": "src/prebid.js",
|
|
6
6
|
"scripts": {
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
"express": "^4.15.4",
|
|
133
133
|
"fun-hooks": "^0.9.9",
|
|
134
134
|
"just-clone": "^1.0.2",
|
|
135
|
-
"live-connect-js": "^
|
|
135
|
+
"live-connect-js": "^6.0.0"
|
|
136
136
|
},
|
|
137
137
|
"optionalDependencies": {
|
|
138
138
|
"fsevents": "^2.3.2"
|
|
@@ -25,7 +25,7 @@ import {useMetrics} from '../utils/perfMetrics.js';
|
|
|
25
25
|
import {isActivityAllowed} from '../activities/rules.js';
|
|
26
26
|
import {activityParams} from '../activities/activityParams.js';
|
|
27
27
|
import {MODULE_TYPE_BIDDER} from '../activities/modules.js';
|
|
28
|
-
import {ACTIVITY_TRANSMIT_TID} from '../activities/activities.js';
|
|
28
|
+
import {ACTIVITY_TRANSMIT_TID, ACTIVITY_TRANSMIT_UFPD} from '../activities/activities.js';
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* This file aims to support Adapters during the Prebid 0.x -> 1.x transition.
|
|
@@ -454,6 +454,15 @@ export const processBidderRequests = hook('sync', function (spec, bids, bidderRe
|
|
|
454
454
|
onRequest(request);
|
|
455
455
|
|
|
456
456
|
const networkDone = requestMetrics.startTiming('net');
|
|
457
|
+
|
|
458
|
+
function getOptions(defaults) {
|
|
459
|
+
const ro = request.options;
|
|
460
|
+
return Object.assign(defaults, ro, {
|
|
461
|
+
browsingTopics: ro?.hasOwnProperty('browsingTopics') && !ro.browsingTopics
|
|
462
|
+
? false
|
|
463
|
+
: isActivityAllowed(ACTIVITY_TRANSMIT_UFPD, activityParams(MODULE_TYPE_BIDDER, spec.code))
|
|
464
|
+
})
|
|
465
|
+
}
|
|
457
466
|
switch (request.method) {
|
|
458
467
|
case 'GET':
|
|
459
468
|
ajax(
|
|
@@ -463,10 +472,10 @@ export const processBidderRequests = hook('sync', function (spec, bids, bidderRe
|
|
|
463
472
|
error: onFailure
|
|
464
473
|
},
|
|
465
474
|
undefined,
|
|
466
|
-
|
|
475
|
+
getOptions({
|
|
467
476
|
method: 'GET',
|
|
468
477
|
withCredentials: true
|
|
469
|
-
}
|
|
478
|
+
})
|
|
470
479
|
);
|
|
471
480
|
break;
|
|
472
481
|
case 'POST':
|
|
@@ -477,11 +486,11 @@ export const processBidderRequests = hook('sync', function (spec, bids, bidderRe
|
|
|
477
486
|
error: onFailure
|
|
478
487
|
},
|
|
479
488
|
typeof request.data === 'string' ? request.data : JSON.stringify(request.data),
|
|
480
|
-
|
|
489
|
+
getOptions({
|
|
481
490
|
method: 'POST',
|
|
482
491
|
contentType: 'text/plain',
|
|
483
492
|
withCredentials: true
|
|
484
|
-
}
|
|
493
|
+
})
|
|
485
494
|
);
|
|
486
495
|
break;
|
|
487
496
|
default:
|
package/src/adloader.js
CHANGED
package/src/ajax.js
CHANGED
|
@@ -1,99 +1,138 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import {config} from './config.js';
|
|
2
|
+
import {buildUrl, logError, parseUrl} from './utils.js';
|
|
3
3
|
|
|
4
|
-
const
|
|
4
|
+
export const dep = {
|
|
5
|
+
fetch: window.fetch.bind(window),
|
|
6
|
+
makeRequest: (r, o) => new Request(r, o),
|
|
7
|
+
timeout(timeout, resource) {
|
|
8
|
+
const ctl = new AbortController();
|
|
9
|
+
let cancelTimer = setTimeout(() => {
|
|
10
|
+
ctl.abort();
|
|
11
|
+
logError(`Request timeout after ${timeout}ms`, resource);
|
|
12
|
+
cancelTimer = null;
|
|
13
|
+
}, timeout);
|
|
14
|
+
return {
|
|
15
|
+
signal: ctl.signal,
|
|
16
|
+
done() {
|
|
17
|
+
cancelTimer && clearTimeout(cancelTimer)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const GET = 'GET';
|
|
24
|
+
const POST = 'POST';
|
|
25
|
+
const CTYPE = 'Content-Type';
|
|
5
26
|
|
|
6
27
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* @param url string url
|
|
11
|
-
* @param callback {object | function} callback
|
|
12
|
-
* @param data mixed data
|
|
13
|
-
* @param options object
|
|
28
|
+
* transform legacy `ajax` parameters into a fetch request.
|
|
29
|
+
* @returns {Request}
|
|
14
30
|
*/
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
export function toFetchRequest(url, data, options = {}) {
|
|
32
|
+
const method = options.method || (data ? POST : GET);
|
|
33
|
+
if (method === GET && data) {
|
|
34
|
+
const urlInfo = parseUrl(url, options);
|
|
35
|
+
Object.assign(urlInfo.search, data);
|
|
36
|
+
url = buildUrl(urlInfo);
|
|
37
|
+
}
|
|
38
|
+
const headers = new Headers(options.customHeaders);
|
|
39
|
+
headers.set(CTYPE, options.contentType || 'text/plain');
|
|
40
|
+
const rqOpts = {
|
|
41
|
+
method,
|
|
42
|
+
headers
|
|
43
|
+
}
|
|
44
|
+
if (method !== GET && data) {
|
|
45
|
+
rqOpts.body = data;
|
|
46
|
+
}
|
|
47
|
+
if (options.withCredentials) {
|
|
48
|
+
rqOpts.credentials = 'include';
|
|
49
|
+
}
|
|
50
|
+
if (options.browsingTopics && isSecureContext) {
|
|
51
|
+
// the Request constructor will throw an exception if the browser supports topics
|
|
52
|
+
// but we're not in a secure context
|
|
53
|
+
rqOpts.browsingTopics = true;
|
|
54
|
+
}
|
|
55
|
+
return dep.makeRequest(url, rqOpts);
|
|
56
|
+
}
|
|
33
57
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Return a version of `fetch` that automatically cancels requests after `timeout` milliseconds.
|
|
60
|
+
*
|
|
61
|
+
* If provided, `request` and `done` should be functions accepting a single argument.
|
|
62
|
+
* `request` is invoked at the beginning of each request, and `done` at the end; both are passed its origin.
|
|
63
|
+
*
|
|
64
|
+
* @returns {function(*, {}?): Promise<Response>}
|
|
65
|
+
*/
|
|
66
|
+
export function fetcherFactory(timeout = 3000, {request, done} = {}) {
|
|
67
|
+
let fetcher = (resource, options) => {
|
|
68
|
+
let to;
|
|
69
|
+
if (timeout != null && options?.signal == null && !config.getConfig('disableAjaxTimeout')) {
|
|
70
|
+
to = dep.timeout(timeout, resource);
|
|
71
|
+
options = Object.assign({signal: to.signal}, options);
|
|
72
|
+
}
|
|
73
|
+
let pm = dep.fetch(resource, options);
|
|
74
|
+
if (to?.done != null) pm = pm.finally(to.done);
|
|
75
|
+
return pm;
|
|
76
|
+
};
|
|
37
77
|
|
|
38
|
-
|
|
78
|
+
if (request != null || done != null) {
|
|
79
|
+
fetcher = ((fetch) => function (resource, options) {
|
|
80
|
+
const origin = new URL(resource?.url == null ? resource : resource.url, document.location).origin;
|
|
81
|
+
let req = fetch(resource, options);
|
|
82
|
+
request && request(origin);
|
|
83
|
+
if (done) req = req.finally(() => done(origin));
|
|
84
|
+
return req;
|
|
85
|
+
})(fetcher);
|
|
86
|
+
}
|
|
87
|
+
return fetcher;
|
|
88
|
+
}
|
|
39
89
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
90
|
+
function toXHR({status, statusText = '', headers, url}, responseText) {
|
|
91
|
+
let xml = 0;
|
|
92
|
+
return {
|
|
93
|
+
readyState: XMLHttpRequest.DONE,
|
|
94
|
+
status,
|
|
95
|
+
statusText,
|
|
96
|
+
responseText,
|
|
97
|
+
response: responseText,
|
|
98
|
+
responseType: '',
|
|
99
|
+
responseURL: url,
|
|
100
|
+
get responseXML() {
|
|
101
|
+
if (xml === 0) {
|
|
102
|
+
try {
|
|
103
|
+
xml = new DOMParser().parseFromString(responseText, headers?.get(CTYPE)?.split(';')?.[0])
|
|
104
|
+
} catch (e) {
|
|
105
|
+
xml = null;
|
|
106
|
+
logError(e);
|
|
51
107
|
}
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
// Disabled timeout temporarily to avoid xhr failed requests. https://github.com/prebid/Prebid.js/issues/2648
|
|
55
|
-
if (!config.getConfig('disableAjaxTimeout')) {
|
|
56
|
-
x.ontimeout = function () {
|
|
57
|
-
logError(' xhr timeout after ', x.timeout, 'ms');
|
|
58
|
-
};
|
|
59
108
|
}
|
|
109
|
+
return xml;
|
|
110
|
+
},
|
|
111
|
+
getResponseHeader: (header) => headers?.has(header) ? headers.get(header) : null,
|
|
112
|
+
}
|
|
113
|
+
}
|
|
60
114
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
x.withCredentials = true;
|
|
76
|
-
}
|
|
77
|
-
_each(options.customHeaders, (value, header) => {
|
|
78
|
-
x.setRequestHeader(header, value);
|
|
79
|
-
});
|
|
80
|
-
if (options.preflight) {
|
|
81
|
-
x.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
|
82
|
-
}
|
|
83
|
-
x.setRequestHeader('Content-Type', options.contentType || 'text/plain');
|
|
84
|
-
|
|
85
|
-
if (typeof request === 'function') {
|
|
86
|
-
request(parser.origin);
|
|
87
|
-
}
|
|
115
|
+
/**
|
|
116
|
+
* attach legacy `ajax` callbacks to a fetch promise.
|
|
117
|
+
*/
|
|
118
|
+
export function attachCallbacks(fetchPm, callback) {
|
|
119
|
+
const {success, error} = typeof callback === 'object' && callback != null ? callback : {
|
|
120
|
+
success: typeof callback === 'function' ? callback : () => null,
|
|
121
|
+
error: (e, x) => logError('Network error', e, x)
|
|
122
|
+
};
|
|
123
|
+
fetchPm.then(response => response.text().then((responseText) => [response, responseText]))
|
|
124
|
+
.then(([response, responseText]) => {
|
|
125
|
+
const xhr = toXHR(response, responseText);
|
|
126
|
+
response.ok || response.status === 304 ? success(responseText, xhr) : error(response.statusText, xhr);
|
|
127
|
+
}, () => error('', toXHR({status: 0}, '')));
|
|
128
|
+
}
|
|
88
129
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
} catch (error) {
|
|
95
|
-
logError('xhr construction', error);
|
|
96
|
-
typeof callback === 'object' && callback !== null && callback.error(error);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
130
|
+
export function ajaxBuilder(timeout = 3000, {request, done} = {}) {
|
|
131
|
+
const fetcher = fetcherFactory(timeout, {request, done});
|
|
132
|
+
return function (url, callback, data, options = {}) {
|
|
133
|
+
attachCallbacks(fetcher(toFetchRequest(url, data, options)), callback);
|
|
134
|
+
};
|
|
99
135
|
}
|
|
136
|
+
|
|
137
|
+
export const ajax = ajaxBuilder();
|
|
138
|
+
export const fetch = fetcherFactory();
|