prebid.js 9.53.2 → 9.53.4
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/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioRtdProvider.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/aniviewBidAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidderTimeoutUtils.js +1 -0
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bitmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgeuppBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/chunk-core.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/contxtfulBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/debugging-standalone.js +1 -1
- package/dist/dependencies.json +10 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/equativBidAdapter.js +1 -1
- package/dist/eskimiBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/excoBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/fwsspBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsBidAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmobiBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentId.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/luceadBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.js +1 -1
- package/dist/madsenseBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/medianetUtils.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/mobilefuseBidAdapter.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/nexx360Utils.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/nodalsAiRtdProvider.js +1 -1
- package/dist/not-for-prod/prebid.js +178 -175
- package/dist/objectGuard.js +1 -1
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optableRtdProvider.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubmaticIdSystem.js +1 -1
- package/dist/pubmaticRtdProvider.js +1 -1
- package/dist/pubmaticUtils.js +1 -0
- 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/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseUtils.js +1 -1
- package/dist/rtdModule.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sevioBidAdapter.js +1 -0
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/showheroes-bsBidAdapter.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/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sparteoBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.js +1 -1
- package/dist/timeoutRtdProvider.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/unrulyBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooUtils.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/yahooAdsBidAdapter.js +1 -1
- package/dist/yandexBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/pubmaticRtdProvider_Example.html +161 -0
- package/libraries/bidderTimeoutUtils/bidderTimeoutUtils.js +119 -0
- package/libraries/objectGuard/objectGuard.js +170 -48
- package/libraries/objectGuard/ortbGuard.js +33 -43
- package/libraries/pubmaticUtils/plugins/dynamicTimeout.js +209 -0
- package/libraries/pubmaticUtils/plugins/floorProvider.js +168 -0
- package/libraries/pubmaticUtils/plugins/pluginManager.js +106 -0
- package/libraries/pubmaticUtils/plugins/unifiedPricingRule.js +375 -0
- package/libraries/pubmaticUtils/pubmaticUtils.js +76 -0
- package/modules/adagioAnalyticsAdapter.js +6 -1
- package/modules/adagioBidAdapter.js +12 -5
- package/modules/adagioRtdProvider.js +41 -35
- package/modules/fwsspBidAdapter.js +134 -69
- package/modules/fwsspBidAdapter.md +121 -26
- package/modules/optableRtdProvider.js +33 -12
- package/modules/pubmaticAnalyticsAdapter.js +315 -587
- package/modules/pubmaticBidAdapter.js +71 -8
- package/modules/pubmaticIdSystem.js +4 -4
- package/modules/pubmaticRtdProvider.js +105 -613
- package/modules/rtdModule/index.js +23 -6
- package/modules/sevioBidAdapter.js +413 -0
- package/modules/sevioBidAdapter.md +29 -0
- package/modules/sparteoBidAdapter.js +122 -10
- package/modules/timeoutRtdProvider.js +2 -105
- package/modules/ttdBidAdapter.js +0 -5
- package/modules/userId/eids.js +1 -1
- package/modules/userId/index.js +32 -1
- package/package.json +1 -1
- package/src/auction.js +3 -0
- package/test/spec/activities/objectGuard_spec.js +189 -32
- package/test/spec/activities/ortbGuard_spec.js +10 -15
- package/test/spec/libraries/bidderTimeoutUtils/bidderTimeoutUtils_spec.js +213 -0
- package/test/spec/libraries/pubmaticUtils/plugins/dynamicTimeout_spec.js +746 -0
- package/test/spec/libraries/pubmaticUtils/plugins/floorProvider_spec.js +184 -0
- package/test/spec/libraries/pubmaticUtils/plugins/pluginManager_spec.js +489 -0
- package/test/spec/libraries/pubmaticUtils/plugins/unifiedPricingRule_spec.js +359 -0
- package/test/spec/libraries/pubmaticUtils/pubmaticUtils_spec.js +236 -0
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +94 -24
- package/test/spec/modules/adagioRtdProvider_spec.js +17 -17
- package/test/spec/modules/fwsspBidAdapter_spec.js +513 -78
- package/test/spec/modules/optableRtdProvider_spec.js +55 -5
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +634 -916
- package/test/spec/modules/pubmaticBidAdapter_spec.js +260 -1
- package/test/spec/modules/pubmaticRtdProvider_spec.js +252 -1505
- package/test/spec/modules/realTimeDataModule_spec.js +58 -8
- package/test/spec/modules/sevioBidAdapter_spec.js +513 -0
- package/test/spec/modules/sparteoBidAdapter_spec.js +528 -43
- package/test/spec/modules/timeoutRtdProvider_spec.js +1 -201
- package/test/spec/modules/ttdBidAdapter_spec.js +0 -33
- package/test/spec/modules/userId_spec.js +115 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.pbjsChunk=self.pbjsChunk||[]).push([[69380],{64668:(e,t,i)=>{var r=i(7873),n=i(91069),o=i(70433),s=i(63172),d=i(71371),a=i(57377),p=i(95789);const c="USD",u=300,m=!0,l="https://prebid-outstream.yieldmo.com/bundle.js",g=["mimes","startdelay","placement","plcmt","skipafter","protocols","api","playbackmethod","maxduration","minduration","pos","skip","skippable"],f=["name","domain","cat","keywords"],b=(0,n.getWindowTop)(),y=2,v=0,h=["description","title","pr","page_url"],A={code:"yieldmo",supportedMediaTypes:[d.D4,d.G_],gvlid:173,isBidRequestValid:function(e){return!!(e&&e.adUnitCode&&e.bidId&&(x(e)||I(e))&&function(e){if(!I(e))return!0;const t=(e,t,i)=>{let r=`"${e}" is required`;throw i&&(r+=" when "+i),new Error(r)},i=(e,t,i)=>{throw i=i?", expected: "+i:"",t=JSON.stringify(t),new Error(`"${e}"=${t} is invalid${i}`)},r=e=>void 0!==e,s=(t,i,r,n)=>{if(0===t.indexOf("video")){const s="params."+t,d="mediaTypes."+t,a=(0,o.A)(e,s),p=(0,o.A)(e,d),c=i(a),u=i(p);return c?a:u||(c?u||r(d,p,n):r(s,a,n),a||p)}{const s=(0,o.A)(e,t);return i(s)||r(t,s,n),s}};try{return s("video.context",(e=>!(0,n.isEmpty)(e)),t),s("params.placementId",(e=>!(0,n.isEmpty)(e)),t),s("video.playerSize",(e=>(0,n.isArrayOfNums)(e,2)||(0,n.isArray)(e)&&e.every((e=>(0,n.isArrayOfNums)(e,2)))),i,"array of 2 integers, ex: [640,480] or [[640,480]]"),s("video.mimes",(e=>r(e)),t),s("video.mimes",(e=>(0,n.isArray)(e)&&e.every((e=>(0,n.isStr)(e)))),i,'array of strings, ex: ["video/mp4"]'),s("video.protocols",(e=>r(e)),t),s("video.api",(e=>r(e)),t),s("video.api",(e=>(0,n.isArrayOfNums)(e)&&e.every((e=>e>=1))),i,"array of numbers, ex: [2,3]"),s("video.playbackmethod",(e=>!r(e)||(0,n.isArrayOfNums)(e)),i,"array of integers, ex: [2,6]"),s("video.maxduration",(e=>r(e)),t),s("video.maxduration",(e=>(0,n.isInteger)(e)),i),s("video.minduration",(e=>!r(e)||(0,n.isNumber)(e)),i),s("video.skippable",(e=>!r(e)||(0,n.isBoolean)(e)),i),s("video.skipafter",(e=>!r(e)||(0,n.isNumber)(e)),i),s("video.pos",(e=>!r(e)||(0,n.isNumber)(e)),i),s("params.badv",(e=>!r(e)||(0,n.isArray)(e)),i,'array of strings, ex: ["ford.com","pepsi.com"]'),s("params.bcat",(e=>!r(e)||(0,n.isArray)(e)),i,'array of strings, ex: ["IAB1-5","IAB1-6"]'),!0}catch(e){return(0,n.logError)(e.message),!1}}(e))},buildRequests:function(e,t){const i=function(e){return!!e.refererInfo?.referer?.includes("pb_force_a")}(t),r=E("/exchange/prebid",i),a=E("/exchange/prebidvideo",i),p=e.filter((e=>x(e))),c=e.filter((e=>I(e)));let u=[];const m=function(e){if((0,o.A)(e,"userIdAsEids"))return e.userIdAsEids||[]}(e[0])||[],l=function(e){const t=(0,o.A)(e,"ortb2.user.data")||[],i=t.filter((e=>{const t=e.ext?.segtax;return t>=600&&t<=609}))[0];if(i){return{taxonomy:i.ext.segtax,classifier:i.ext.segclass,topics:Object.values(i.segment).map((e=>Number(e)))}}return null}(t),f=function(e){const t=(0,o.A)(e,"ortb2.device.ext.cdep")||null;return t}(t);if(p.length>0){let e={pbav:"9.53.
|
|
1
|
+
(self.pbjsChunk=self.pbjsChunk||[]).push([[69380],{64668:(e,t,i)=>{var r=i(7873),n=i(91069),o=i(70433),s=i(63172),d=i(71371),a=i(57377),p=i(95789);const c="USD",u=300,m=!0,l="https://prebid-outstream.yieldmo.com/bundle.js",g=["mimes","startdelay","placement","plcmt","skipafter","protocols","api","playbackmethod","maxduration","minduration","pos","skip","skippable"],f=["name","domain","cat","keywords"],b=(0,n.getWindowTop)(),y=2,v=0,h=["description","title","pr","page_url"],A={code:"yieldmo",supportedMediaTypes:[d.D4,d.G_],gvlid:173,isBidRequestValid:function(e){return!!(e&&e.adUnitCode&&e.bidId&&(x(e)||I(e))&&function(e){if(!I(e))return!0;const t=(e,t,i)=>{let r=`"${e}" is required`;throw i&&(r+=" when "+i),new Error(r)},i=(e,t,i)=>{throw i=i?", expected: "+i:"",t=JSON.stringify(t),new Error(`"${e}"=${t} is invalid${i}`)},r=e=>void 0!==e,s=(t,i,r,n)=>{if(0===t.indexOf("video")){const s="params."+t,d="mediaTypes."+t,a=(0,o.A)(e,s),p=(0,o.A)(e,d),c=i(a),u=i(p);return c?a:u||(c?u||r(d,p,n):r(s,a,n),a||p)}{const s=(0,o.A)(e,t);return i(s)||r(t,s,n),s}};try{return s("video.context",(e=>!(0,n.isEmpty)(e)),t),s("params.placementId",(e=>!(0,n.isEmpty)(e)),t),s("video.playerSize",(e=>(0,n.isArrayOfNums)(e,2)||(0,n.isArray)(e)&&e.every((e=>(0,n.isArrayOfNums)(e,2)))),i,"array of 2 integers, ex: [640,480] or [[640,480]]"),s("video.mimes",(e=>r(e)),t),s("video.mimes",(e=>(0,n.isArray)(e)&&e.every((e=>(0,n.isStr)(e)))),i,'array of strings, ex: ["video/mp4"]'),s("video.protocols",(e=>r(e)),t),s("video.api",(e=>r(e)),t),s("video.api",(e=>(0,n.isArrayOfNums)(e)&&e.every((e=>e>=1))),i,"array of numbers, ex: [2,3]"),s("video.playbackmethod",(e=>!r(e)||(0,n.isArrayOfNums)(e)),i,"array of integers, ex: [2,6]"),s("video.maxduration",(e=>r(e)),t),s("video.maxduration",(e=>(0,n.isInteger)(e)),i),s("video.minduration",(e=>!r(e)||(0,n.isNumber)(e)),i),s("video.skippable",(e=>!r(e)||(0,n.isBoolean)(e)),i),s("video.skipafter",(e=>!r(e)||(0,n.isNumber)(e)),i),s("video.pos",(e=>!r(e)||(0,n.isNumber)(e)),i),s("params.badv",(e=>!r(e)||(0,n.isArray)(e)),i,'array of strings, ex: ["ford.com","pepsi.com"]'),s("params.bcat",(e=>!r(e)||(0,n.isArray)(e)),i,'array of strings, ex: ["IAB1-5","IAB1-6"]'),!0}catch(e){return(0,n.logError)(e.message),!1}}(e))},buildRequests:function(e,t){const i=function(e){return!!e.refererInfo?.referer?.includes("pb_force_a")}(t),r=E("/exchange/prebid",i),a=E("/exchange/prebidvideo",i),p=e.filter((e=>x(e))),c=e.filter((e=>I(e)));let u=[];const m=function(e){if((0,o.A)(e,"userIdAsEids"))return e.userIdAsEids||[]}(e[0])||[],l=function(e){const t=(0,o.A)(e,"ortb2.user.data")||[],i=t.filter((e=>{const t=e.ext?.segtax;return t>=600&&t<=609}))[0];if(i){return{taxonomy:i.ext.segtax,classifier:i.ext.segclass,topics:Object.values(i.segment).map((e=>Number(e)))}}return null}(t),f=function(e){const t=(0,o.A)(e,"ortb2.device.ext.cdep")||null;return t}(t);if(p.length>0){let e={pbav:"9.53.4-pre",p:[],page_url:t.refererInfo.page,bust:(new Date).getTime().toString(),dnt:"1"===window.doNotTrack||"1"===window.navigator.doNotTrack||!1,description:w(),tmax:t.timeout||400,userConsent:JSON.stringify({gdprApplies:(0,o.A)(t,"gdprConsent.gdprApplies")||"",cmp:(0,o.A)(t,"gdprConsent.consentString")||"",gpp:(0,o.A)(t,"gppConsent.gppString")||"",gpp_sid:(0,o.A)(t,"gppConsent.applicableSections")||[]}),us_privacy:(0,o.A)(t,"uspConsent")||""};l&&(e.topics=JSON.stringify(l));const i=S(t);i&&(e.gpc=i),f&&(e.cdep=f),function(){try{if((0,n.getWindowTop)().location.href)return!0}catch(e){return!1}}()&&(e.pr=b.document&&b.document.referrer||"",e.scrd=b.devicePixelRatio||0,e.title=b.document.title||"",e.w=(0,n.getWinDimensions)().innerWidth,e.h=(0,n.getWinDimensions)().innerHeight);const s=window.navigator.maxTouchPoints;s&&(e.mtp=s),p.forEach((t=>{e.p.push(function(e){const t=(0,o.A)(e,"ortb2Imp.ext.gpid")||(0,o.A)(e,"ortb2Imp.ext.data.pbadslot"),i=(0,o.A)(e,"ortb2Imp.ext.tagid"),r=(0,o.A)(e,"ortb2Imp.ext.divid"),n={placement_id:e.adUnitCode,callback_id:e.bidId,sizes:e.mediaTypes.banner.sizes};if(e.params){e.params.placementId&&(n.ym_placement_id=e.params.placementId);const t=k(e,d.D4);t&&(n.bidFloor=t)}t&&(n.gpid=t);i&&(n.tagid=i);r&&(n.divid=r);const s=(0,o.A)(e,"ortb2Imp.ext.tid");s&&(n.tid=s);e.auctionId&&(n.auctionId=e.auctionId);return JSON.stringify(n)}(t));const i=_(t,"pubcid");i?e.pubcid=i:t.crumbs&&t.crumbs.pubcid&&(e.pubcid=t.crumbs.pubcid);const r=_(t,"tdid");r&&(e.tdid=r);const n=_(t,"criteoId");n&&(e.cri_prebid=n),t.schain&&(e.schain=JSON.stringify(t.schain)),(0,o.A)(t,"params.lr_env")&&(e.ats_envelope=t.params.lr_env)})),e.p="["+e.p.toString()+"]",m.length&&(e.eids=JSON.stringify(m));let a=`${r}?${(0,n.parseQueryStringParameters)(e)}`.length-8e3;if(a>0)for(let t=0;t<h.length&&(a=O(a,e,h[t]),!(a<=0));t++);u.push({method:"GET",url:r,data:e})}if(c.length>0){const e=function(e,t){const i=e[0].schain;let r={id:e[0].bidderRequestId,tmax:t.timeout||400,at:1,imp:e.map((e=>function(e){const t=(0,o.A)(e,"ortb2Imp.ext.gpid")||(0,o.A)(e,"ortb2Imp.ext.data.pbadslot"),i=(0,o.A)(e,"ortb2Imp.ext.tagid"),r=(0,o.A)(e,"ortb2Imp.ext.divid"),s=function(e){const t=(0,o.A)(e,"mediaTypes.video.playerSize");if((0,n.isArrayOfNums)(t,2))return t;if((0,n.isArray)(t)&&(0,n.isArrayOfNums)(t[0],2))return t[0];return null}(e),a={id:e.bidId,tagid:e.adUnitCode,bidfloor:k(e,d.G_),ext:{placement_id:e.params.placementId,tid:(0,o.A)(e,"ortb2Imp.ext.tid")},video:{w:s[0],h:s[1],linearity:1}},p=(0,o.A)(e,"mediaTypes.video",{});Object.keys(p).filter((e=>g.includes(e))).forEach((e=>a.video[e]=p[e]));const c=(0,o.A)(e,"params.video",{});Object.keys(c).filter((e=>g.includes(e))).forEach((e=>a.video[e]=c[e])),a.video.skippable&&(a.video.skip=1,delete a.video.skippable);1===a.video.plcmt&&1===a.video.placement||(a.video.startdelay=v,a.video.playbackmethod=[y]);t&&(a.ext.gpid=t);i&&(a.ext.tagid=i);r&&(a.ext.divid=r);return a}(e))),site:T(e[0],t),device:(0,o.A)(t,"ortb2.device"),badv:e[0].params.badv||[],bcat:(0,o.A)(t,"bcat")||e[0].params.bcat||[],ext:{prebid:"9.53.4-pre"},ats_envelope:e[0].params.lr_env};i&&(r.schain=i);const a=S(t);a&&(0,s.J)(r,"regs.ext.gpc",a);e[0].auctionId&&(r.auctionId=e[0].auctionId);return function(e,t){const i=t.gdprConsent,r=(0,o.A)(t,"gppConsent.gppString"),n=(0,o.A)(t,"gppConsent.applicableSections");r?(0,s.J)(e,"regs.ext.gpp",r):((0,s.J)(e,"regs.ext.gdpr",i&&i.gdprApplies?1:0),(0,s.J)(e,"user.ext.consent",i&&i.consentString?i.consentString:""));n&&n.length>0&&(0,s.J)(e,"regs.ext.gpp_sid",n);const d=(0,o.A)(t,"uspConsent");!r&&d&&(0,s.J)(e,"regs.ext.us_privacy",d)}(r,t),r}(c,t);l&&(e.topics=l),m.length&&(0,s.J)(e,"user.ext.eids",m),u.push({method:"POST",url:a,data:e})}return u},interpretResponse:function(e,t){let i=[];const r=e.body;if(r.length>0&&r.forEach((e=>{e.cpm>0&&i.push(function(e){return{dealId:e.publisherDealId,requestId:e.callback_id,cpm:e.cpm,width:e.width,height:e.height,creativeId:e.creative_id,currency:c,netRevenue:m,ttl:300,ad:e.ad,meta:{advertiserDomains:e.adomain||[],mediaType:d.D4}}}(e))})),r.seatbid){r.seatbid.reduce(((e,t)=>e.concat(t.bid)),[]).forEach((e=>i.push(function(e,t){const i=((0,o.A)(t,"data.imp")||[]).find((t=>t.id===e.impid));let r={dealId:e.dealid,requestId:i.id,cpm:e.price,width:i.video.w,height:i.video.h,creativeId:e.crid||e.adid,currency:c,netRevenue:m,mediaType:d.G_,ttl:u,vastXml:e.adm,meta:{advertiserDomains:e.adomain||[],mediaType:d.G_}};if(i.video.plcmt&&1!==i.video.plcmt){const e=p.A4.install({url:l,config:{width:r.width,height:r.height,vastTimeout:15e3,maxAllowedVastTagRedirects:5,allowVpaid:!0,autoPlay:!0,preload:!0,mute:!0},id:i.tagid,loaded:!1});e.setRender((function(e){e.renderer.push((()=>{const{id:t,config:i}=e.renderer;window.YMoutstreamPlayer(e,t,i)}))})),r.renderer=e}return r}(e,t))))}return i},getUserSyncs:function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";const n=[],o="&gdpr="+(i.gdprApplies?1:0),s=`&gdpr_consent=${encodeURIComponent(i.consentString||"")}`,d=`https://ads.yieldmo.com/pbcas?${`us_privacy=${encodeURIComponent(r)}`}${o}${s}`;return e.iframeEnabled?n.push({type:"iframe",url:d+"&type=iframe"}):e.pixelEnabled&&n.push({type:"image",url:d+"&type=image"}),n}};function x(e){return!!(0,o.A)(e,"mediaTypes.banner")}function I(e){return!!(0,o.A)(e,"mediaTypes.video")}function w(){return document.querySelector('meta[name="description"]')&&document.querySelector('meta[name="description"]').getAttribute("content")||""}function _(e,t){return"object"==typeof(0,o.A)(e,"userId")?e.userId[t]:void 0}function S(e){return(0,o.A)(e,"ortb2.regs.ext.gpc")}function k(e,t){let i={};return"function"==typeof e.getFloor&&(i=e.getFloor({currency:c,mediaType:t,size:"*"})),i.floor||e.params.bidfloor||e.params.bidFloor||0}function T(e,t){let i={};const r=(0,n.parseUrl)((0,o.A)(t,"refererInfo.page"));(0,n.isEmpty)(r)||(i.page=`${r.protocol}://${r.hostname}${r.pathname}`),t.refererInfo?.ref&&(i.ref=t.refererInfo.ref);const s=document.getElementsByTagName("meta").keywords;s&&s.content&&(i.keywords=s.content);const d=(0,o.A)(e,"params.site");return d&&Object.keys(d).filter((e=>f.includes(e))).forEach((e=>i[e]=d[e])),i}function O(e,t,i){if(t[i].length>e)return t[i]=t[i].substring(0,t[i].length-e),0;const r=e-t[i].length;return t[i]="",r}function E(e,t){return`${t?"https://ads-stg.yieldmo.com":"https://ads.yieldmo.com"}${e}`}(0,a.a$)(A),(0,r.E)("yieldmoBidAdapter")}},e=>{e.O(0,[60802,37769,12139,51085],(()=>{return t=64668,e(e.s=t);var t}));e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.pbjsChunk=self.pbjsChunk||[]).push([[38743],{98059:(e,t,n)=>{var s=n(7873),i=n(91069),d=n(68044),a=n(88910),o=n(78969),r=n(11445),c=n(97779),g=n(67314);const l={},p={},b={},u={};u[o.qY.BID_ADJUSTMENT]=!0,u[o.qY.BIDDER_DONE]=!0,u[o.qY.AUCTION_END]=!0;let v="",f="https://pool.tsukiji.iponweb.net/hba",I="";function S(e,t){e.adUnitCode&&t[e.adUnitCode]&&(e.adUnitName=t[e.adUnitCode]),(0,i.isArray)(e.adUnits)&&e.adUnits.forEach((e=>{e.code&&t[e.code]&&(e.name=t[e.code])})),(0,i.isArray)(e.adUnitCodes)&&(e.adUnitNames=e.adUnitCodes.map((e=>t[e]))),["bids","bidderRequests","bidsReceived","noBids"].forEach((n=>{!function(e,t){(0,i.isArray)(e)&&e.forEach((e=>{S(e,t)}))}(e[n],t)}))}const y=Object.assign((0,a.Ay)({analyticsType:"endpoint"}),{getUrl:()=>f,track(e){let{eventType:t,args:n={}}=e;if(t===o.qY.BID_REQUESTED){const e=`${n.bidderCode}_${n.auctionId}`;l[e]=(0,i.deepClone)(n),l[e].bids=[],n.bids.forEach((e=>{p[`${e.bidId}_${e.auctionId}`]=e}))}if(t===o.qY.BID_TIMEOUT&&(0,i.isArray)(n)){const e=y.eventsStorage,s={};n.forEach((n=>{const i=`${n.bidId}_${n.auctionId}`,d=`${n.bidder}_${n.auctionId}`;e[n.auctionId]||(e[n.auctionId]={events:[]}),(l[d]||s[n.bidder])&&p[i]&&(s[n.bidder]||(s[n.bidder]=l[d],e[n.auctionId].events.push({eventType:t,params:s[n.bidder]}),delete l[d]),s[n.bidder].bids.push(p[i]),delete p[i])}))}else if(v=n.auctionId||v,v){const e=y.eventsStorage;e[v]||(e[v]={events:[]});const s=n.refererInfo&&n.refererInfo.page;s&&b[v]!==s&&(b[v]=s);const i=Object.assign({},n);if(delete i.ad,i.bidsReceived&&(i.bidsReceived=i.bidsReceived.map((e=>{const t=Object.assign({},e);return delete t.ad,t}))),u[t]||e[v].events.push({eventType:t,params:i}),t===o.qY.AUCTION_END||t===o.qY.BID_WON){if(i.adServerTargeting=c.iS.getAllTargeting(g.n.getAdUnitCodes(),g.n.getBidsReceived()),y.eventsStorage[v]&&y.eventsStorage[v].events.length){y.eventsStorage[v].page={url:b[v]},y.eventsStorage[v].pubId=I,y.eventsStorage[v].wrapper_version="9.53.
|
|
1
|
+
(self.pbjsChunk=self.pbjsChunk||[]).push([[38743],{98059:(e,t,n)=>{var s=n(7873),i=n(91069),d=n(68044),a=n(88910),o=n(78969),r=n(11445),c=n(97779),g=n(67314);const l={},p={},b={},u={};u[o.qY.BID_ADJUSTMENT]=!0,u[o.qY.BIDDER_DONE]=!0,u[o.qY.AUCTION_END]=!0;let v="",f="https://pool.tsukiji.iponweb.net/hba",I="";function S(e,t){e.adUnitCode&&t[e.adUnitCode]&&(e.adUnitName=t[e.adUnitCode]),(0,i.isArray)(e.adUnits)&&e.adUnits.forEach((e=>{e.code&&t[e.code]&&(e.name=t[e.code])})),(0,i.isArray)(e.adUnitCodes)&&(e.adUnitNames=e.adUnitCodes.map((e=>t[e]))),["bids","bidderRequests","bidsReceived","noBids"].forEach((n=>{!function(e,t){(0,i.isArray)(e)&&e.forEach((e=>{S(e,t)}))}(e[n],t)}))}const y=Object.assign((0,a.Ay)({analyticsType:"endpoint"}),{getUrl:()=>f,track(e){let{eventType:t,args:n={}}=e;if(t===o.qY.BID_REQUESTED){const e=`${n.bidderCode}_${n.auctionId}`;l[e]=(0,i.deepClone)(n),l[e].bids=[],n.bids.forEach((e=>{p[`${e.bidId}_${e.auctionId}`]=e}))}if(t===o.qY.BID_TIMEOUT&&(0,i.isArray)(n)){const e=y.eventsStorage,s={};n.forEach((n=>{const i=`${n.bidId}_${n.auctionId}`,d=`${n.bidder}_${n.auctionId}`;e[n.auctionId]||(e[n.auctionId]={events:[]}),(l[d]||s[n.bidder])&&p[i]&&(s[n.bidder]||(s[n.bidder]=l[d],e[n.auctionId].events.push({eventType:t,params:s[n.bidder]}),delete l[d]),s[n.bidder].bids.push(p[i]),delete p[i])}))}else if(v=n.auctionId||v,v){const e=y.eventsStorage;e[v]||(e[v]={events:[]});const s=n.refererInfo&&n.refererInfo.page;s&&b[v]!==s&&(b[v]=s);const i=Object.assign({},n);if(delete i.ad,i.bidsReceived&&(i.bidsReceived=i.bidsReceived.map((e=>{const t=Object.assign({},e);return delete t.ad,t}))),u[t]||e[v].events.push({eventType:t,params:i}),t===o.qY.AUCTION_END||t===o.qY.BID_WON){if(i.adServerTargeting=c.iS.getAllTargeting(g.n.getAdUnitCodes(),g.n.getBidsReceived()),y.eventsStorage[v]&&y.eventsStorage[v].events.length){y.eventsStorage[v].page={url:b[v]},y.eventsStorage[v].pubId=I,y.eventsStorage[v].wrapper_version="9.53.4-pre";const e=function(){if(window.googletag&&window.googletag.pubads){const e=googletag.pubads();if(e&&e.getSlots){const t=e.getSlots();if(t&&t.length){const e={};return t.forEach((t=>{const n=t.getSlotElementId(),s=(t.getAdUnitPath()||"").split("/").pop();e[n]=s})),e}}}}();e&&y.eventsStorage[v].events.forEach((t=>{S(t.params,e)}))}y.sendStat(y.eventsStorage[v],v)}}},sendStat(e,t){e&&e.events&&e.events.length&&(delete y.eventsStorage[t],(0,d.RD)(f,{success:function(){},error:function(){}},JSON.stringify(e),{method:"POST"}))}});y.eventsStorage={},y.originEnableAnalytics=y.enableAnalytics,y.enableAnalytics=function(e){const t=e&&e.options;t&&("string"==typeof t.url&&(f=t.url),t.pubId&&(I=t.pubId.toString())),y.originEnableAnalytics(e)},r.Ay.registerAnalyticsAdapter({adapter:y,code:"yieldone"});(0,s.E)("yieldoneAnalyticsAdapter")}},e=>{e.O(0,[2630,60802,37769,12139,51085],(()=>{return t=98059,e(e.s=t);var t}));e.O()}]);
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<title>PubMatic RTD Provider Example</title>
|
|
4
|
+
<script async src="../../build/dev/prebid.js"></script>
|
|
5
|
+
<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
|
|
6
|
+
<script>
|
|
7
|
+
var FAILSAFE_TIMEOUT = 3300;
|
|
8
|
+
var PREBID_TIMEOUT = 1000;
|
|
9
|
+
|
|
10
|
+
var adUnits = [{
|
|
11
|
+
code: 'div-gpt-ad-1460505748561-0',
|
|
12
|
+
mediaTypes: {
|
|
13
|
+
banner: {
|
|
14
|
+
sizes: [[300, 250], [300,600]],
|
|
15
|
+
pos: 7,
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
bids: [
|
|
19
|
+
{
|
|
20
|
+
bidder: 'appnexus',
|
|
21
|
+
params: {
|
|
22
|
+
placementId: 13144370
|
|
23
|
+
}
|
|
24
|
+
}, {
|
|
25
|
+
bidder: 'pubmatic',
|
|
26
|
+
params: {
|
|
27
|
+
publisherId: '103207',
|
|
28
|
+
adUnit: 'dcomHomeTop-728x90',
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
,
|
|
34
|
+
{
|
|
35
|
+
code: 'div-gpt-ad-1460505748561-1',
|
|
36
|
+
mediaTypes: {
|
|
37
|
+
banner: {
|
|
38
|
+
sizes: [[728, 90]],
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
bids: [
|
|
42
|
+
{
|
|
43
|
+
bidder: 'appnexus',
|
|
44
|
+
params: {
|
|
45
|
+
placementId: 13144370
|
|
46
|
+
}
|
|
47
|
+
}, {
|
|
48
|
+
bidder: 'pubmatic',
|
|
49
|
+
params: {
|
|
50
|
+
publisherId: '103207',
|
|
51
|
+
adUnit: 'dcomHomeTop-728x90',
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
var pbjs = pbjs || {};
|
|
59
|
+
pbjs.que = pbjs.que || [];
|
|
60
|
+
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<script>
|
|
64
|
+
var googletag = googletag || {};
|
|
65
|
+
googletag.cmd = googletag.cmd || [];
|
|
66
|
+
var s1;
|
|
67
|
+
googletag.cmd.push(function () {
|
|
68
|
+
googletag.pubads().disableInitialLoad();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
pbjs.que.push(function () {
|
|
72
|
+
pbjs.setConfig({
|
|
73
|
+
enableSendAllBids : true,
|
|
74
|
+
enableTIDs: true,
|
|
75
|
+
realTimeData: {
|
|
76
|
+
auctionDelay: 500,
|
|
77
|
+
dataProviders: [
|
|
78
|
+
{
|
|
79
|
+
name: 'pubmatic',
|
|
80
|
+
waitForIt: true,
|
|
81
|
+
params:{
|
|
82
|
+
publisherId: '103207', // please contact PubMatic to get a publisherId for yourself
|
|
83
|
+
profileId: '12', // please contact PubMatic to get a profileId for yourself
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
pbjs.addAdUnits(adUnits);
|
|
91
|
+
pbjs.enableAnalytics({
|
|
92
|
+
provider: 'pubmatic',
|
|
93
|
+
options: {
|
|
94
|
+
"publisherId": 5890 // please contact PubMatic to get a publisherId for yourself
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
pbjs.requestBids({
|
|
99
|
+
bidsBackHandler: sendAdserverRequest,
|
|
100
|
+
timeout: PREBID_TIMEOUT
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
function sendAdserverRequest() {
|
|
107
|
+
if (pbjs.adserverRequestSent) return;
|
|
108
|
+
pbjs.adserverRequestSent = true;
|
|
109
|
+
googletag.cmd.push(function () {
|
|
110
|
+
pbjs.que.push(function () {
|
|
111
|
+
pbjs.setTargetingForGPTAsync();
|
|
112
|
+
googletag.pubads().refresh();
|
|
113
|
+
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
</script>
|
|
119
|
+
|
|
120
|
+
<script>
|
|
121
|
+
googletag.cmd.push(function () {
|
|
122
|
+
s1 = googletag.defineSlot('/19968336/header-bid-tag-0', [[300, 250], [300, 600]], 'div-gpt-ad-1460505748561-0').addService(googletag.pubads());
|
|
123
|
+
s2 = googletag.defineSlot('/19968336/header-bid-tag-1', [[728, 90]], 'div-gpt-ad-1460505748561-1').addService(googletag.pubads());
|
|
124
|
+
|
|
125
|
+
googletag.pubads().enableSingleRequest();
|
|
126
|
+
googletag.enableServices();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
function sendAdserverRequest() {
|
|
131
|
+
if (pbjs.adserverRequestSent) return;
|
|
132
|
+
pbjs.adserverRequestSent = true;
|
|
133
|
+
googletag.cmd.push(function () {
|
|
134
|
+
pbjs.que.push(function () {
|
|
135
|
+
pbjs.setTargetingForGPTAsync();
|
|
136
|
+
googletag.pubads().refresh();
|
|
137
|
+
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
</script>
|
|
142
|
+
</head>
|
|
143
|
+
|
|
144
|
+
<body>
|
|
145
|
+
<h2>Prebid.js Test</h2>
|
|
146
|
+
<h5>Div-1111</h5>
|
|
147
|
+
<div id='div-gpt-ad-1460505748561-0'>
|
|
148
|
+
<script type='text/javascript'>
|
|
149
|
+
googletag.cmd.push(function () { googletag.display('div-gpt-ad-1460505748561-0'); });
|
|
150
|
+
</script>
|
|
151
|
+
</div>
|
|
152
|
+
<br>
|
|
153
|
+
|
|
154
|
+
<h5>Div 2</h5>
|
|
155
|
+
<div id='div-gpt-ad-1460505748561-1'>
|
|
156
|
+
<script type='text/javascript'>
|
|
157
|
+
googletag.cmd.push(function () { googletag.display('div-gpt-ad-1460505748561-1'); });
|
|
158
|
+
</script>
|
|
159
|
+
</div>
|
|
160
|
+
</body>
|
|
161
|
+
</html>
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { logInfo } from '../../src/utils.js';
|
|
2
|
+
|
|
3
|
+
// this allows the stubbing of functions during testing
|
|
4
|
+
export const bidderTimeoutFunctions = {
|
|
5
|
+
getDeviceType,
|
|
6
|
+
checkVideo,
|
|
7
|
+
getConnectionSpeed,
|
|
8
|
+
calculateTimeoutModifier
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Returns an array of a given object's own enumerable string-keyed property [key, value] pairs.
|
|
13
|
+
* @param {Object} obj
|
|
14
|
+
* @return {Array}
|
|
15
|
+
*/
|
|
16
|
+
const entries = Object.entries || function (obj) {
|
|
17
|
+
const ownProps = Object.keys(obj);
|
|
18
|
+
let i = ownProps.length;
|
|
19
|
+
let resArray = new Array(i);
|
|
20
|
+
while (i--) { resArray[i] = [ownProps[i], obj[ownProps[i]]]; }
|
|
21
|
+
return resArray;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
function getDeviceType() {
|
|
25
|
+
const userAgent = window.navigator.userAgent.toLowerCase();
|
|
26
|
+
if ((/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(userAgent))) {
|
|
27
|
+
return 5; // tablet
|
|
28
|
+
}
|
|
29
|
+
if ((/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(userAgent))) {
|
|
30
|
+
return 4; // mobile
|
|
31
|
+
}
|
|
32
|
+
return 2; // personal computer
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function checkVideo(adUnits) {
|
|
36
|
+
return adUnits.some((adUnit) => {
|
|
37
|
+
return adUnit.mediaTypes && adUnit.mediaTypes.video;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getConnectionSpeed() {
|
|
42
|
+
const connection = window.navigator.connection || window.navigator.mozConnection || window.navigator.webkitConnection || {}
|
|
43
|
+
const connectionType = connection.type || connection.effectiveType;
|
|
44
|
+
|
|
45
|
+
switch (connectionType) {
|
|
46
|
+
case 'slow-2g':
|
|
47
|
+
case '2g':
|
|
48
|
+
return 'slow';
|
|
49
|
+
|
|
50
|
+
case '3g':
|
|
51
|
+
return 'medium';
|
|
52
|
+
|
|
53
|
+
case 'bluetooth':
|
|
54
|
+
case 'cellular':
|
|
55
|
+
case 'ethernet':
|
|
56
|
+
case 'wifi':
|
|
57
|
+
case 'wimax':
|
|
58
|
+
case '4g':
|
|
59
|
+
return 'fast';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return 'unknown';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Calculate the time to be added to the timeout
|
|
67
|
+
* @param {Array} adUnits
|
|
68
|
+
* @param {Object} rules
|
|
69
|
+
* @return {number}
|
|
70
|
+
*/
|
|
71
|
+
function calculateTimeoutModifier(adUnits, rules) {
|
|
72
|
+
if (!rules) {
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
logInfo('Timeout rules', rules);
|
|
77
|
+
let timeoutModifier = 0;
|
|
78
|
+
let toAdd = 0;
|
|
79
|
+
|
|
80
|
+
if (rules.includesVideo) {
|
|
81
|
+
const hasVideo = bidderTimeoutFunctions.checkVideo(adUnits);
|
|
82
|
+
toAdd = rules.includesVideo[hasVideo] || 0;
|
|
83
|
+
logInfo(`Adding ${toAdd} to timeout for includesVideo ${hasVideo}`)
|
|
84
|
+
timeoutModifier += toAdd;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (rules.numAdUnits) {
|
|
88
|
+
const numAdUnits = adUnits.length;
|
|
89
|
+
if (rules.numAdUnits[numAdUnits]) {
|
|
90
|
+
timeoutModifier += rules.numAdUnits[numAdUnits];
|
|
91
|
+
} else {
|
|
92
|
+
for (const [rangeStr, timeoutVal] of entries(rules.numAdUnits)) {
|
|
93
|
+
const [lowerBound, upperBound] = rangeStr.split('-');
|
|
94
|
+
if (parseInt(lowerBound) <= numAdUnits && numAdUnits <= parseInt(upperBound)) {
|
|
95
|
+
logInfo(`Adding ${timeoutVal} to timeout for numAdUnits ${numAdUnits}`)
|
|
96
|
+
timeoutModifier += timeoutVal;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (rules.deviceType) {
|
|
104
|
+
const deviceType = bidderTimeoutFunctions.getDeviceType();
|
|
105
|
+
toAdd = rules.deviceType[deviceType] || 0;
|
|
106
|
+
logInfo(`Adding ${toAdd} to timeout for deviceType ${deviceType}`)
|
|
107
|
+
timeoutModifier += toAdd;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (rules.connectionSpeed) {
|
|
111
|
+
const connectionSpeed = bidderTimeoutFunctions.getConnectionSpeed();
|
|
112
|
+
toAdd = rules.connectionSpeed[connectionSpeed] || 0;
|
|
113
|
+
logInfo(`Adding ${toAdd} to timeout for connectionSpeed ${connectionSpeed}`)
|
|
114
|
+
timeoutModifier += toAdd;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
logInfo('timeout Modifier calculated', timeoutModifier);
|
|
118
|
+
return timeoutModifier;
|
|
119
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {isData,
|
|
2
|
-
import {
|
|
1
|
+
import {isData, sessionedApplies} from '../../src/activities/redactor.js';
|
|
2
|
+
import {deepEqual, logWarn} from '../../src/utils.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @typedef {import('../src/activities/redactor.js').TransformationRuleDef} TransformationRuleDef
|
|
@@ -12,66 +12,203 @@ import {deepAccess, deepClone, deepEqual, deepSetValue} from '../../src/utils.js
|
|
|
12
12
|
/**
|
|
13
13
|
* Create a factory function for object guards using the given rules.
|
|
14
14
|
*
|
|
15
|
-
* An object guard is a
|
|
16
|
-
*
|
|
17
|
-
* - `verify` is a function that, when called, will check that the guarded object was not modified
|
|
18
|
-
* in a way that violates any "write protect" rules, and rolls back any offending changes.
|
|
15
|
+
* An object guard is a view on the guarded object that applies "redact" rules (the same rules used in activites/redactor.js),
|
|
16
|
+
* and prevents writes (including deltes) that violate "write protect" rules.
|
|
19
17
|
*
|
|
20
18
|
* This is meant to provide sandboxed version of a privacy-sensitive object, where reads
|
|
21
19
|
* are filtered through redaction rules and writes are checked against write protect rules.
|
|
22
20
|
*
|
|
23
|
-
* @param {Array[TransformationRule]} rules
|
|
24
|
-
* @return {function(*, ...[*]): ObjectGuard}
|
|
25
21
|
*/
|
|
26
22
|
export function objectGuard(rules) {
|
|
27
23
|
const root = {};
|
|
28
|
-
|
|
24
|
+
|
|
25
|
+
// rules are associated with specific portions of the object, e.g. "user.eids"
|
|
26
|
+
// build a tree representation of them, where the root is the object itself,
|
|
27
|
+
// and each node's children are properties of the corresponding (nested) object.
|
|
28
|
+
|
|
29
|
+
function invalid() {
|
|
30
|
+
return new Error('incompatible redaction rules');
|
|
31
|
+
}
|
|
29
32
|
|
|
30
33
|
rules.forEach(rule => {
|
|
31
|
-
if (rule.wp) writeRules.push(rule);
|
|
32
|
-
if (!rule.get) return;
|
|
33
34
|
rule.paths.forEach(path => {
|
|
34
35
|
let node = root;
|
|
35
36
|
path.split('.').forEach(el => {
|
|
36
|
-
node.children = node.children
|
|
37
|
-
node.children[el] = node.children[el]
|
|
37
|
+
node.children = node.children ?? {};
|
|
38
|
+
node.children[el] = node.children[el] ?? { parent: node, path: node.path ? `${node.path}.${el}` : el };
|
|
38
39
|
node = node.children[el];
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
node.wpRules = node.wpRules ?? [];
|
|
41
|
+
node.redactRules = node.redactRules ?? [];
|
|
42
|
+
});
|
|
43
|
+
const tag = rule.wp ? 'hasWP' : 'hasRedact';
|
|
44
|
+
const ruleset = rule.wp ? 'wpRules' : 'redactRules';
|
|
45
|
+
// sanity check: do not allow rules of the same type on related paths,
|
|
46
|
+
// e.g. redact both 'user' and 'user.eids'; we don't need and this logic
|
|
47
|
+
// does not handle it
|
|
48
|
+
if (node[tag] && !node[ruleset]?.length) {
|
|
49
|
+
throw invalid();
|
|
50
|
+
}
|
|
51
|
+
node[ruleset].push(rule);
|
|
52
|
+
let parent = node;
|
|
53
|
+
while (parent) {
|
|
54
|
+
parent[tag] = true;
|
|
55
|
+
if (parent !== node && parent[ruleset]?.length) {
|
|
56
|
+
throw invalid();
|
|
57
|
+
}
|
|
58
|
+
parent = parent.parent;
|
|
59
|
+
}
|
|
41
60
|
});
|
|
42
61
|
});
|
|
43
62
|
|
|
44
|
-
|
|
63
|
+
function getRedactRule(node) {
|
|
64
|
+
if (node.redactRule == null) {
|
|
65
|
+
node.redactRule = node.redactRules.length === 0 ? false : {
|
|
66
|
+
check: (applies) => node.redactRules.some(applies),
|
|
67
|
+
get(val) {
|
|
68
|
+
for (const rule of node.redactRules) {
|
|
69
|
+
val = rule.get(val);
|
|
70
|
+
if (!isData(val)) break;
|
|
71
|
+
}
|
|
72
|
+
return val;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return node.redactRule;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function getWPRule(node) {
|
|
80
|
+
if (node.wpRule == null) {
|
|
81
|
+
node.wpRule = node.wpRules.length === 0 ? false : {
|
|
82
|
+
check: (applies) => node.wpRules.some(applies),
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return node.wpRule;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* clean up `newValue` so that it doesn't violate any write protect rules
|
|
90
|
+
* when set onto the property represented by 'node'.
|
|
91
|
+
*
|
|
92
|
+
* This is done substituting (portions of) `curValue` when some rule is violated.
|
|
93
|
+
*/
|
|
94
|
+
function cleanup(node, curValue, newValue, applies) {
|
|
95
|
+
if (
|
|
96
|
+
!node.hasWP ||
|
|
97
|
+
(!isData(curValue) && !isData(newValue)) ||
|
|
98
|
+
deepEqual(curValue, newValue)
|
|
99
|
+
) {
|
|
100
|
+
return newValue;
|
|
101
|
+
}
|
|
102
|
+
const rule = getWPRule(node);
|
|
103
|
+
if (rule && rule.check(applies)) {
|
|
104
|
+
return curValue;
|
|
105
|
+
}
|
|
106
|
+
if (node.children) {
|
|
107
|
+
for (const [prop, child] of Object.entries(node.children)) {
|
|
108
|
+
const propValue = cleanup(child, curValue?.[prop], newValue?.[prop], applies);
|
|
109
|
+
if (newValue != null && typeof newValue === 'object') {
|
|
110
|
+
if (!isData(propValue) && !curValue?.hasOwnProperty(prop)) {
|
|
111
|
+
delete newValue[prop];
|
|
112
|
+
} else {
|
|
113
|
+
newValue[prop] = propValue;
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
logWarn(`Invalid value set for '${node.path}', expected an object`, newValue);
|
|
117
|
+
return curValue;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return newValue;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function isDeleteAllowed(node, curValue, applies) {
|
|
125
|
+
if (!node.hasWP || !isData(curValue)) {
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
const rule = getWPRule(node);
|
|
129
|
+
if (rule && rule.check(applies)) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (node.children) {
|
|
133
|
+
for (const [prop, child] of Object.entries(node.children)) {
|
|
134
|
+
if (!isDeleteAllowed(child, curValue?.[prop], applies)) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
45
141
|
|
|
46
|
-
function mkGuard(obj, tree, applies) {
|
|
47
|
-
|
|
142
|
+
function mkGuard(obj, tree, final, applies, cache = new WeakMap()) {
|
|
143
|
+
// If this object is already proxied, return the cached proxy
|
|
144
|
+
if (cache.has(obj)) {
|
|
145
|
+
return cache.get(obj);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const proxy = new Proxy(obj, {
|
|
48
149
|
get(target, prop, receiver) {
|
|
49
150
|
const val = Reflect.get(target, prop, receiver);
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
151
|
+
if (final && val != null && typeof val === 'object') {
|
|
152
|
+
// a parent property has write protect rules, keep guarding
|
|
153
|
+
return mkGuard(val, tree, final, applies, cache)
|
|
154
|
+
} else if (tree.children?.hasOwnProperty(prop)) {
|
|
155
|
+
const {children, hasWP} = tree.children[prop];
|
|
156
|
+
if (isData(val)) {
|
|
157
|
+
// if this property has redact rules, apply them
|
|
158
|
+
const rule = getRedactRule(tree.children[prop]);
|
|
159
|
+
if (rule && rule.check(applies)) {
|
|
160
|
+
return rule.get(val);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if ((children || hasWP) && val != null && typeof val === 'object') {
|
|
164
|
+
// some nested properties have rules, return a guard for the branch
|
|
165
|
+
return mkGuard(val, tree.children?.[prop] || tree, final || children == null, applies, cache);
|
|
56
166
|
}
|
|
57
167
|
}
|
|
58
168
|
return val;
|
|
59
169
|
},
|
|
170
|
+
set(target, prop, newValue, receiver) {
|
|
171
|
+
if (final) {
|
|
172
|
+
// a parent property has rules, apply them
|
|
173
|
+
const rule = getWPRule(tree);
|
|
174
|
+
if (rule && rule.check(applies)) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (tree.children?.hasOwnProperty(prop)) {
|
|
179
|
+
// apply all (possibly nested) write protect rules
|
|
180
|
+
const curValue = Reflect.get(target, prop, receiver);
|
|
181
|
+
newValue = cleanup(tree.children[prop], curValue, newValue, applies);
|
|
182
|
+
if (!isData(newValue) && !target.hasOwnProperty(prop)) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return Reflect.set(target, prop, newValue, receiver);
|
|
187
|
+
},
|
|
188
|
+
deleteProperty(target, prop) {
|
|
189
|
+
if (final) {
|
|
190
|
+
// a parent property has rules, apply them
|
|
191
|
+
const rule = getWPRule(tree);
|
|
192
|
+
if (rule && rule.check(applies)) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (tree.children?.hasOwnProperty(prop) && !isDeleteAllowed(tree.children[prop], target[prop], applies)) {
|
|
197
|
+
// some nested properties should not be deleted
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
return Reflect.deleteProperty(target, prop);
|
|
201
|
+
}
|
|
60
202
|
});
|
|
61
|
-
}
|
|
62
203
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
204
|
+
// Cache the proxy before returning
|
|
205
|
+
cache.set(obj, proxy);
|
|
206
|
+
return proxy;
|
|
67
207
|
}
|
|
68
208
|
|
|
69
209
|
return function guard(obj, ...args) {
|
|
70
210
|
const session = {};
|
|
71
|
-
return
|
|
72
|
-
obj: mkGuard(obj, root.children || {}, sessionedApplies(session, ...args)),
|
|
73
|
-
verify: mkVerify(wpTransformer(session, obj, ...args))
|
|
74
|
-
}
|
|
211
|
+
return mkGuard(obj, root, false, sessionedApplies(session, ...args))
|
|
75
212
|
};
|
|
76
213
|
}
|
|
77
214
|
|
|
@@ -82,20 +219,5 @@ export function objectGuard(rules) {
|
|
|
82
219
|
export function writeProtectRule(ruleDef) {
|
|
83
220
|
return Object.assign({
|
|
84
221
|
wp: true,
|
|
85
|
-
run(root, path, object, property, applies) {
|
|
86
|
-
const origHasProp = object && object.hasOwnProperty(property);
|
|
87
|
-
const original = origHasProp ? object[property] : undefined;
|
|
88
|
-
const origCopy = origHasProp && original != null && typeof original === 'object' ? deepClone(original) : original;
|
|
89
|
-
return function () {
|
|
90
|
-
const object = path == null ? root : deepAccess(root, path);
|
|
91
|
-
const finalHasProp = object && isData(object[property]);
|
|
92
|
-
const finalValue = finalHasProp ? object[property] : undefined;
|
|
93
|
-
if (!origHasProp && finalHasProp && applies()) {
|
|
94
|
-
delete object[property];
|
|
95
|
-
} else if ((origHasProp !== finalHasProp || finalValue !== original || !deepEqual(finalValue, origCopy)) && applies()) {
|
|
96
|
-
deepSetValue(root, (path == null ? [] : [path]).concat(property).join('.'), origCopy);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
222
|
}, ruleDef)
|
|
101
223
|
}
|