@temple-wallet/extension-ads 8.1.1 → 9.0.0-dev.1
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/index.d.ts +8 -3
- package/dist/index.js +8 -8
- package/package.json +1 -1
- package/src/ads-actions/process-permanent-rule.ts +3 -0
- package/src/ads-actions/process-providers-ads.ts +2 -1
- package/src/ads-actions/process-rule.ts +4 -0
- package/src/ads-configuration.ts +17 -2
- package/src/execute-ads-actions/process-insert-ad-action.ts +3 -2
- package/src/render-ads-stack.ts +210 -104
- package/src/temple-wallet-api.ts +9 -2
- package/src/transform-raw-rules.ts +6 -2
- package/src/types/ads-actions.ts +1 -0
- package/src/types/ads-rules.ts +1 -0
- package/src/types/temple-wallet-api.ts +1 -0
- package/src/execute-ads-actions/utils.ts +0 -24
package/dist/index.d.ts
CHANGED
|
@@ -96,6 +96,7 @@ interface RawAllAdsRules {
|
|
|
96
96
|
permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
|
|
97
97
|
adsReplaceUrlsBlacklist: string[];
|
|
98
98
|
elementsToHideOrRemoveRules: Record<string, RawElementsToHideOrRemoveEntry[]>;
|
|
99
|
+
blacklistedHypelabCampaignsSlugs: string[];
|
|
99
100
|
timestamp: number;
|
|
100
101
|
}
|
|
101
102
|
|
|
@@ -119,6 +120,7 @@ interface InsertAdActionProps extends Pick<RawPermanentAdPlacesRule, 'wrapperSty
|
|
|
119
120
|
originalWidth: number;
|
|
120
121
|
originalHeight: number;
|
|
121
122
|
shouldUseBlurredBackground?: boolean;
|
|
123
|
+
adCategories: string[];
|
|
122
124
|
}
|
|
123
125
|
interface ReplaceAllChildrenWithAdAction extends AdActionBase, InsertAdActionProps {
|
|
124
126
|
type: AdActionType.ReplaceAllChildren;
|
|
@@ -177,6 +179,7 @@ interface AdsRules {
|
|
|
177
179
|
parentDepth: number;
|
|
178
180
|
}>;
|
|
179
181
|
elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
|
|
182
|
+
blacklistedHypelabCampaignsSlugs: string[];
|
|
180
183
|
timestamp: number;
|
|
181
184
|
}
|
|
182
185
|
|
|
@@ -189,12 +192,13 @@ interface IAdsConfiguration {
|
|
|
189
192
|
swapTkeyUrl: string;
|
|
190
193
|
externalAdsActivityMessageType: string;
|
|
191
194
|
personaIframePath: string;
|
|
192
|
-
getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
|
|
195
|
+
getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string, adCategories: string[]) => string;
|
|
193
196
|
buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
|
|
194
197
|
bannerAdsMeta: AdMetadata[];
|
|
195
198
|
extVersion: string;
|
|
196
199
|
templePassphrase: string;
|
|
197
200
|
isMisesBrowser: boolean;
|
|
201
|
+
pickNextAdMetadata: (allAdsMetadata: AdMetadata[], currentAdMetadata: AdMetadata | undefined, validAdsCounter: number, pageHasPlacesRules: boolean, adCategories: string[]) => AdMetadata | undefined;
|
|
198
202
|
}
|
|
199
203
|
declare const configureAds: (config: IAdsConfiguration) => void;
|
|
200
204
|
|
|
@@ -205,9 +209,9 @@ declare const executeAdsActions: (adsActions: AdAction[]) => Promise<PromiseSett
|
|
|
205
209
|
* in a dedicated iframe. Sends messages to the parent window on an attempt to render an ad, on successful rendering,
|
|
206
210
|
* on ad resize, and on error.
|
|
207
211
|
*/
|
|
208
|
-
declare const renderAdsStack: (adId: string, adsMetadata: (number | AdMetadata)[], origin: string) =>
|
|
212
|
+
declare const renderAdsStack: (adId: string, adsMetadata: (number | AdMetadata)[], origin: string, pageHasPlacesRules: boolean | undefined, adCategories: string[], hypelabBlacklistedCampaignsSlugs: string[]) => void;
|
|
209
213
|
|
|
210
|
-
declare const transformRawRules: (
|
|
214
|
+
declare const transformRawRules: (locationOrHref: Location | string, rules: RawAllAdsRules) => AdsRules;
|
|
211
215
|
|
|
212
216
|
declare class TempleWalletApi {
|
|
213
217
|
private api;
|
|
@@ -229,6 +233,7 @@ declare class TempleWalletApi {
|
|
|
229
233
|
getPermanentNativeAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
|
|
230
234
|
getAdsReplaceUrlsBlacklist: () => Promise<string[]>;
|
|
231
235
|
getElementsToHideOrRemoveRules: () => Promise<Record<string, RawElementsToHideOrRemoveEntry[]>>;
|
|
236
|
+
getBlacklistedHypelabCampaignsSlugs: () => Promise<string[]>;
|
|
232
237
|
getAllRules: () => Promise<RawAllAdsRules>;
|
|
233
238
|
}
|
|
234
239
|
|
package/dist/index.js
CHANGED
|
@@ -3,20 +3,20 @@
|
|
|
3
3
|
var semver = require('semver');
|
|
4
4
|
var lodash = require('lodash');
|
|
5
5
|
var nanoid = require('nanoid');
|
|
6
|
-
var
|
|
6
|
+
var ct = require('webextension-polyfill');
|
|
7
7
|
var cryptoJs = require('crypto-js');
|
|
8
|
-
var
|
|
8
|
+
var Mt = require('axios');
|
|
9
9
|
|
|
10
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
|
|
12
|
-
var
|
|
13
|
-
var
|
|
12
|
+
var ct__default = /*#__PURE__*/_interopDefault(ct);
|
|
13
|
+
var Mt__default = /*#__PURE__*/_interopDefault(Mt);
|
|
14
14
|
|
|
15
|
-
var je=Object.defineProperty,Je=Object.defineProperties;var Ze=Object.getOwnPropertyDescriptors;var oe=Object.getOwnPropertySymbols;var Me=Object.prototype.hasOwnProperty,_e=Object.prototype.propertyIsEnumerable;var xe=(e,t,r)=>t in e?je(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,x=(e,t)=>{for(var r in t||(t={}))Me.call(t,r)&&xe(e,r,t[r]);if(oe)for(var r of oe(t))_e.call(t,r)&&xe(e,r,t[r]);return e},L=(e,t)=>Je(e,Ze(t));var _=(e,t)=>{var r={};for(var s in e)Me.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&oe)for(var s of oe(e))t.indexOf(s)<0&&_e.call(e,s)&&(r[s]=e[s]);return r};var T=(e,t,r)=>new Promise((s,l)=>{var o=i=>{try{n(r.next(i));}catch(d){l(d);}},a=i=>{try{n(r.throw(i));}catch(d){l(d);}},n=i=>i.done?s(i.value):Promise.resolve(i.value).then(o,a);n((r=r.apply(e,t)).next());});process&&process.env&&process.env.NODE_ENV==="development";navigator.userAgent.includes("Macintosh");var be=e=>!!e,et=300,N=(e=et)=>new Promise(t=>setTimeout(t,e));var g=class{};g.IS_MISES_BROWSER=!1,g.ADS_TW_WINDOW_URL="",g.TKEY_INPAGE_AD_URL="",g.SMALL_TKEY_INPAGE_AD_URL="",g.SWAP_TKEY_URL="",g.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",g.personaIframePath="",g.getAdsStackIframeURL=()=>"",g.buildNativeAdsMeta=()=>[],g.bannerAdsMeta=[];var tt=e=>{let{adsTwWindowUrl:t,tkeyInpageAdUrl:r,smallTkeyInpageAdUrl:s,swapTkeyUrl:l,externalAdsActivityMessageType:o,personaIframePath:a,getAdsStackIframeURL:n,buildNativeAdsMeta:i,bannerAdsMeta:d,extVersion:m,templePassphrase:A,isMisesBrowser:p}=e;s&&(g.SMALL_TKEY_INPAGE_AD_URL=s),g.ADS_TW_WINDOW_URL=t,g.TKEY_INPAGE_AD_URL=r,g.SWAP_TKEY_URL=l,g.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=o,g.personaIframePath=a,g.getAdsStackIframeURL=n,g.buildNativeAdsMeta=i,g.bannerAdsMeta=d,g.EXTENSION_VERSION=m,g.TEMPLE_PASSPHRASE=A,g.IS_MISES_BROWSER=p;};var Y="twa",z="twa-native",G="twa-sibling-replacement";var le="adRenderStart",ae="resize",K="ready",re="error",de="accelerometer; gyroscope",k="crypto",me="background";var q=/[\d.]+(px)?$/,X=`[${Y}]`,Le=`[${Y}]:not([${z}])`,De=`[${z}]`,Ae=(e,t)=>{let r=parseInt(e,10);return isNaN(r)||!q.test(e)?t:r},U=(e,t,r)=>{e.style[t]=`${Math.max(Ae(e.style[t],0),r)}px`;},Q=e=>e.reduce((t,r)=>t+Ae(r,0),0),j=e=>!!e.closest(X),ce=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(G))},ne=e=>{let t=getComputedStyle(e),{x:r,right:s,width:l,height:o}=e.getBoundingClientRect(),a={width:l,height:o},n=["width","height"];for(let i of n){let d=t[i],m=e.getAttribute(i),A=Math.max(...[d,m].map(p=>Ae(p!=null?p:"",-1)));A!==-1&&(a[i]=A),i==="width"&&r<0?a.width+=r:i==="width"&&s>window.innerWidth&&(a.width=window.innerWidth-r);}return a},D=(e,t,r=document)=>e?t?[...r.querySelectorAll(e)]:[r.querySelector(e)].filter(s=>!!s):[],O=(e,t)=>{let r=e;for(let s=0;s<t;s++){let l=r.parentElement;if(!l)return null;r=l;}return r},He=(e,t,r,s,l)=>{if(e<2&&t<2)return [];if(s)return g.buildNativeAdsMeta(e,t);let o=r==="permanent"||r==="slot-replacement"?g.bannerAdsMeta.filter(({source:i})=>i.shouldNotUseStrictContainerLimits):[],a=Math.max(e,...o.map(({dimensions:i})=>i.width)),n=Math.max(t,...o.map(({dimensions:i})=>i.height));return g.bannerAdsMeta.reduce((i,{dimensions:d,source:m},A)=>{let{shouldNotUseStrictContainerLimits:p=!1,categories:c=[k]}=m;if(c.every(v=>!l.includes(v)))return i;let{minContainerWidth:u,minContainerHeight:E,width:f,maxContainerWidth:h,maxContainerHeight:S}=d,R=!1;switch(r){case"permanent":R=p||a>=f&&(n>=E||n<2);break;case"slot-replacement":R=p||a>=u&&(n>=E||n<2);break;default:R=e>=u&&t>=E&&e<=h&&t<=S;}return R&&i.push(A),i},[])},rt=e=>{let{x:t,y:r,width:s,height:l}=e.getBoundingClientRect();return t!==0||r!==0||s!==0||l!==0},ue=e=>{let{display:t}=window.getComputedStyle(e);switch(t){case"none":return !0;case"contents":return Array.from(e.children).every(r=>ue(r));default:return !rt(e)}};var Ne=(e,t)=>{let{shouldHide:r,cssString:s,parentDepth:l,isMultiple:o}=e;D(s,o).forEach(a=>{let n=O(a,l);if(!n)return;let i=window.getComputedStyle(n);i.display!=="none"&&i.visibility!=="hidden"&&t.push({type:r?"hide-element":"remove-element",element:n});});};var Oe=(e,t,r)=>T(void 0,null,function*(){let{parentSelector:s,displayWidth:l}=e,{isMultiple:o,cssString:a,parentDepth:n}=s;if(l&&!semver.satisfies(semver.coerce(window.innerWidth),l))return [];let i=D(a,o).map(d=>O(d,n)).filter(d=>!!d);return yield Promise.all(i.map(d=>T(void 0,null,function*(){yield N(0),it(d,e,t,r);}))),i}),he=(e,t)=>{var r,s;return e?{width:(r=document.querySelector(e.width))!=null?r:t,height:(s=document.querySelector(e.height))!=null?s:t}:{width:t,height:t}},it=(e,t,r,s)=>{var ve;let Te=t,{shouldUseDivWrapper:l,divWrapperStyle:o,wrapperStyle:a,elementStyle:n,adSelector:i,insertionIndex:d,insertBeforeSelector:m,insertAfterSelector:A,insertionsCount:p=1,elementsToMeasureSelectors:c,stylesOverrides:u,shouldHideOriginal:E=!1,isNative:f,urlRegexes:h,parentSelector:S}=Te,R=_(Te,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),v=R.wrapperType?a:l?o:{display:"contents"},{isMultiple:I,cssString:P,parentDepth:w}=i,M=D(f?De:Le,!0,e).reduce((y,B)=>y.some($=>$.contains(B))?y:[...y.filter($=>!B.contains($)),B],[]),b=M.filter(ue),F=M.length-b.length,W=p-F;if(D(P,I,e).map(y=>O(y,w)).filter(y=>be(y)&&!j(y)).forEach(y=>{var $;let B=window.getComputedStyle(y).display==="none";if(W<=0)(!E||!B)&&s.push({type:E?"hide-element":"remove-element",element:y});else {let qe=he(c,(($=y.parentElement)==null?void 0:$.children.length)===1?y.parentElement:y),Xe=x({type:"replace-element",element:y,wrapperStyle:v,elementStyle:n,stylesOverrides:u},R),Pe={type:"hide-element",element:y},Qe=x({type:"simple-insert-ad",wrapperStyle:v,elementStyle:n,parent:y.parentElement,insertionIndex:Array.from(y.parentElement.children).indexOf(y),isSiblingReplacement:!0,stylesOverrides:u},R),te=[],Ie=ce(y);E&&Ie&&!B?te=[Pe]:E&&!Ie?te=[Pe,Qe]:E||(te=[Xe]),te.length>0&&r(qe,"permanent",f,[k],...te)&&W--;}}),W<=0)return;let H=-1,V=e,ee={width:e,height:e},we=m||A;if(we){let y=e.querySelector(we),B=y==null?void 0:y.parentElement;y&&B&&(V=B,H=Array.from(e.children).indexOf(y)+(m?0:1),ee=he(c,y));}else {let y=d!=null?d:0;H=y<0?Math.max(e.children.length+y,0):Math.min(y,e.children.length),ee=he(c,(ve=e.children[H])!=null?ve:e);}if(H!==-1){let y=x({type:"simple-insert-ad",wrapperStyle:v,elementStyle:n,parent:V,insertionIndex:H,isSiblingReplacement:!1,stylesOverrides:u},R);r(ee,"permanent",f,[k],...Array(W).fill(y));}};var lt=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],at=lodash.memoize(e=>e.reduce((t,{dimensions:r})=>{let s=t.filter(({width:l,height:o})=>l<r.width||o<r.height);return (s.length===0||s.some(({width:l,height:o})=>l>r.width||o>r.height))&&s.push(r),s},[])),Ce=(e,t,r,s)=>T(void 0,null,function*(){let l=at(g.bannerAdsMeta),o=e.map(({selector:n,parentDepth:i,categories:d})=>D(n,!0).reduce((m,A)=>{var P;let p=(P=O(A,i))!=null?P:A,c=m.findIndex(({element:w})=>w.contains(p)),u=p.parentElement&&window.getComputedStyle(p.parentElement),{width:E,height:f}=ne(p),h=s.some(w=>{var M;return w.type==="replace-all-children"||w.type==="simple-insert-ad"?w.parent.contains(p)||p.contains(w.parent):((M=w.element.parentElement)==null?void 0:M.contains(p))||p.contains(w.element)}),S=(u==null?void 0:u.display)==="none"||(u==null?void 0:u.visibility)==="hidden",R=c>=0&&m[c]instanceof HTMLAnchorElement,v=l.some(({width:w,height:M})=>E>=w&&f>=M);if(h||!v||S||R)return m;let I={element:p,categories:d};return c>=0?m.splice(c,1,I):m.some(({element:w})=>w.contains(p))||m.push(I),m},[])).flat(),a=t.map(({selector:n,parentDepth:i})=>D(n,!0).map(d=>O(d,i)).filter(d=>!!d)).flat();o=o.filter(({element:n})=>!a.includes(n)),yield Promise.all(o.map(d=>T(void 0,[d],function*({element:n,categories:i}){var u,E,f,h,S,R,v,I;yield N(0);let m=n.parentElement,{width:A,height:p}=window.getComputedStyle(n),c=q.test(A)&&q.test(p)?n:(E=(u=m==null?void 0:m.closest("div, article, aside, footer, header"))!=null?u:(m==null?void 0:m.tagName.toLowerCase())==="body"?void 0:m)!=null?E:n;if(!j(n)&&!n.querySelector(X)&&!s.some(P=>P.type==="simple-insert-ad"?!1:P.type==="replace-all-children"?P.parent.contains(n):P.element===n)){let P=(f=n.getAttribute("style"))!=null?f:"",w=Object.fromEntries(P.split(";").filter(Boolean).map(V=>V.split(":").map(ee=>ee.trim())));if((h=w.width)!=null&&h.match(/^0[a-z]/)||(S=w.height)!=null&&S.match(/^0[a-z]/))return;let M=window.getComputedStyle(n),b=x(x({},Object.fromEntries(lt.map(V=>[V,M.getPropertyValue(V)]))),w),F={type:"hide-element",element:n},W={type:"simple-insert-ad",wrapperStyle:b,parent:(R=n.parentElement)!=null?R:document.body,insertionIndex:Array.from((I=(v=n.parentElement)==null?void 0:v.children)!=null?I:[]).indexOf(n),isSiblingReplacement:!0,shouldUseBlurredBackground:!0},Z,H=n.closest(`[${G}] + *`);H&&H!==n?Z=[{type:"remove-element",element:H.previousElementSibling},F,W]:H?Z=window.getComputedStyle(n).display==="none"?[]:[F]:Z=[F,W],r({width:c,height:c},"provider-replacement",!1,i,...Z);}})));});var We=(e,t,r)=>T(void 0,null,function*(){let{cssString:s,isMultiple:l}=e.selector,o=D(s,l);yield Promise.all(o.map(a=>T(void 0,null,function*(){yield N(0),dt(a,e,t,r);})));}),dt=(e,t,r,s)=>{let{selector:{shouldUseDivWrapper:l,parentDepth:o,divWrapperStyle:a},stylesOverrides:n,shouldHideOriginal:i,isNative:d=!1}=t,m=O(e,o);if(!m||r.some(c=>c.contains(m))||j(m)||m.querySelector(X))return;let A={shouldUseDivWrapper:l,wrapperStyle:a},p;if(l&&i){let c=m.parentElement,u=window.getComputedStyle(m).display==="none",E=x({type:"simple-insert-ad",parent:c,insertionIndex:Array.from(c.children).indexOf(m),stylesOverrides:n==null?void 0:n.map(S=>{var R=S,{parentDepth:f}=R,h=_(R,["parentDepth"]);return L(x({},h),{parentDepth:f-1})}),isSiblingReplacement:!0},A);p=[],u||p.push({type:"hide-element",element:m}),ce(m)||p.push(E);}else if(l)p=[x({type:"replace-element",element:m,stylesOverrides:n==null?void 0:n.map(f=>{var h=f,{parentDepth:u}=h,E=_(h,["parentDepth"]);return L(x({},E),{parentDepth:u-1})})},A)];else if(i){let c={type:"simple-insert-ad",parent:m,insertionIndex:0,stylesOverrides:n,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};p=Array.from(m.children).filter(u=>window.getComputedStyle(u).display!=="none").map(u=>({type:"hide-element",element:u})),m.querySelector(X)||p.push(c);}else p=[{type:"replace-all-children",parent:m,stylesOverrides:n,wrapperStyle:{display:"contents"}}];p.length>0&&s({width:m,height:m},"slot-replacement",d,[k],...p);};var ct=o=>T(void 0,[o],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:r,permanentAdPlacesRules:s,elementsToHideOrRemoveRules:l}){let a=[],n=(d,m,A,p,...c)=>{if(c.length>0&&c.every(b=>b.type==="hide-element"||b.type==="remove-element"))return a.push(...c),!0;let{width:u}=ne(d.width),{height:E}=ne(d.height),{paddingLeft:f,paddingRight:h}=window.getComputedStyle(d.width),{paddingTop:S,paddingBottom:R}=window.getComputedStyle(d.height),v=Q([f,h]),I=v===u?u:u-v,P=Q([S,R]),w=P===E?E:E-P,M=He(I,w,m,A,p);return M.length?(a.push(...c.map(b=>b.type==="hide-element"||b.type==="remove-element"?b:L(x({},b),{adsMetadata:M,originalWidth:I,originalHeight:w}))),!0):!1},i=[];return yield Promise.all(l.map(d=>T(void 0,null,function*(){yield N(0),Ne(d,a);}))),yield Promise.all(s.map(d=>T(void 0,null,function*(){yield N(0),i=i.concat(yield Oe(d,n,a));}))),yield Promise.all(r.map(d=>T(void 0,null,function*(){yield N(0),yield We(d,i,n);}))),yield Ce(e,t,n,a),a});var Ee=(o=>(o.Optimal="Optimal",o.SmartyAds="SmartyAds",o.HypeLab="HypeLab",o.Persona="Persona",o.Temple="Temple Wallet",o))(Ee||{});var ge=new Set,Be=new Set,ke=new Set,Fe=e=>T(void 0,null,function*(){let t=e.id;if(!ge.has(t))return ge.add(t),new Promise((r,s)=>{let l=!1,o=a=>{var n,i;if(a.source===e.contentWindow)try{let d=typeof a.data=="string"?JSON.parse(a.data):a.data;if(d.id!==t)return;let m=e.offsetWidth-e.clientWidth,A=e.offsetHeight-e.clientHeight;switch(d.type){case K:r(d.adMetadata.source.providerName);break;case re:window.removeEventListener("message",o),e.style.display="none",s(new Error((n=d.reason)!=null?n:"Unknown error"));break;case le:let{dimensions:p,source:c}=d.adMetadata;l=(i=c.native)!=null?i:!1;let{width:u,height:E}=p;u>0&&E>0&&(c.native?e.style.height=`${E}px`:(U(e,"width",u),U(e,"height",E)));break;case ae:let{width:f,height:h}=d;l?e.style.height=`${h+A}px`:(U(e,"width",f+m),U(e,"height",h+A));}}catch(d){console.error("Observing error:",d);}};window.addEventListener("message",o);}).then(r=>{if(Be.has(t))return;Be.add(t),At(e)?Ve(t,r):pt(e,r);}).catch(r=>{throw console.error(r),r}).finally(()=>void ge.delete(t))}),pt=(e,t)=>{let r=new IntersectionObserver(s=>{s.some(l=>l.isIntersecting)&&(Ve(e.id,t),r.disconnect());},{threshold:.5});r.observe(e);},Ve=(e,t)=>{if(ke.has(e))return;ke.add(e);let r=window.parent.location.href;mt__default.default.runtime.sendMessage({type:g.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:r,provider:Ee[t]}).catch(s=>void console.error(s));},At=e=>{let t=e.getBoundingClientRect(),r=window.visualViewport;if(!r)return !1;let s=Math.min(Math.max(0,t.x),r.width),l=Math.min(Math.max(0,t.x+t.width),r.width),o=Math.min(Math.max(0,t.y),r.height),a=Math.min(Math.max(0,t.y+t.height),r.height),n=t.width*t.height;return (l-s)*(a-o)/n>=.5};var se=(e,t)=>{for(let r in t)e.style.setProperty(r,t[r]);};var ht=(e,t)=>{["width","height"].forEach(s=>{var o;let l=(o=e.style[s])!=null?o:"";q.test(l)&&parseInt(l,10)<t[s]&&e.style.removeProperty(s);});},Et=(e,t,r,s)=>T(void 0,null,function*(){let{elementStyle:l={},stylesOverrides:o=[],adsMetadata:a,wrapperType:n,originalHeight:i,originalWidth:d,shouldUseBlurredBackground:m}=e;o.sort((S,R)=>S.parentDepth-R.parentDepth);let A,p=nanoid.nanoid(),c=document.createElement("iframe");c.loading="lazy",c.src=g.getAdsStackIframeURL(p,a,window.location.href),c.id=p,c.allow=de;let u=a[0],{dimensions:E}=typeof u=="number"?g.bannerAdsMeta[u]:u,f={width:m?Math.max(d,E.width):E.width,height:m?Math.max(i,E.height):E.height};c.style.width=n==="tbody"?"100%":`${f.width}px`,c.style.height=`${f.height}px`,c.style.border="none";for(let S in l)c.style.setProperty(S,l[S]);switch(c.setAttribute(Y,"true"),ht(t,f),r.appendChild(c),e.type){case"replace-all-children":A=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":A=e.element.parentElement,e.element.replaceWith(t);break;default:let S=e.parent.children[e.insertionIndex];if(e.isSiblingReplacement){t.setAttribute(G,"true");let R=new MutationObserver(v=>{v.some(P=>Array.from(P.removedNodes).includes(S))&&(t.remove(),R.disconnect());});R.observe(e.parent,{childList:!0});}A=e.parent,e.parent.insertBefore(t,S);break}if(n!=="tbody"){let{borderLeftWidth:S,borderRightWidth:R,borderTopWidth:v,borderBottomWidth:I}=window.getComputedStyle(c),{borderLeftWidth:P,borderRightWidth:w,borderTopWidth:M,borderBottomWidth:b}=window.getComputedStyle(t),F=Q([S,R,P,w]),W=Q([v,I,M,b]);c.style.width=`${f.width-F}px`,c.style.height=`${f.height-W}px`;}Fe(c).catch(s);let h=0;o.forEach(({parentDepth:S,style:R})=>{for(;S>h&&A;)A=A.parentElement,h++;A&&se(A,R);});}),Ye=e=>T(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:r,wrapperType:s="div",colsAfter:l=0,colsBefore:o=0,colspan:a=1}=e,n=r.every(A=>typeof A=="object"),i,d;if(s==="div")i=document.createElement("div"),d=i;else {i=document.createElement("tbody");let A=document.createElement("tr");i.appendChild(A);for(let c=0;c<o;c++)A.appendChild(document.createElement("td"));let p=document.createElement("td");p.colSpan=a,A.appendChild(p),d=p;for(let c=0;c<l;c++)A.appendChild(document.createElement("td"));}i.setAttribute(Y,"true"),n&&i.setAttribute(z,"true"),se(i,t);let m=()=>{let A=document.createElement("div");A.setAttribute(Y,"true"),n&&A.setAttribute(z,"true"),e.type==="simple-insert-ad"&&e.isSiblingReplacement&&A.setAttribute(G,"true"),A.style.display="none",i.replaceWith(A);};yield Et(e,i,d,A=>{console.error("Failed to render ads",A),m();}).catch(A=>{throw console.error("Inserting an ad attempt error:",A),m(),A});});var gt=e=>Promise.allSettled(e.map(t=>T(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Ye(t);})));var fe=(e,t,r=!1)=>{let s=document.createElement("div");s.style.width=`${e}px`,s.style.height=`${t}px`;let l=document.createElement("div");if(l.style.width=`${e}px`,l.style.height=`${t}px`,s.appendChild(l),r){let n=document.createElement("a");return n.href=g.SWAP_TKEY_URL,n.target="_blank",n.rel="noopener noreferrer",n.style.width=`${e}px`,n.style.height=`${t}px`,n.style.overflow="hidden",n.style.textOverflow="ellipsis",n.appendChild(document.createTextNode("TODO: Native TKEY ad")),l.appendChild(n),{element:s}}let o=document.createElement("a");o.href=g.SWAP_TKEY_URL,o.target="_blank",o.rel="noopener noreferrer",o.style.width="100%",o.style.height="100%",l.appendChild(o);let a=document.createElement("img");return a.src=e<=320?g.SMALL_TKEY_INPAGE_AD_URL:g.TKEY_INPAGE_AD_URL,a.style.width="100%",a.style.height="100%",o.appendChild(a),{element:s,creativeSet:{image:{url:a.src}}}};var Re=(e,t,{width:r,height:s},l)=>{let o=document.createElement("iframe");return o.id=e,o.src=Rt(t,l,r,s,o.id),o.style.width=t.native?"100%":`${r}px`,o.style.height=`${s}px`,o.style.border="none",o.allow=de,{element:o}},Rt=(e,t,r,s,l)=>{let{providerName:o,slug:a,native:n}=e,i=new URL(g.ADS_TW_WINDOW_URL);return i.searchParams.set("ap",o.toLowerCase()),n?i.searchParams.set("vh",String(s)):i.searchParams.set("w",String(r)),i.searchParams.set("h",String(s)),i.searchParams.set("p",a),i.searchParams.set("o",yt(t)),l&&i.searchParams.set("id",l),i.toString()},yt=e=>cryptoJs.AES.encrypt(e,g.TEMPLE_PASSPHRASE).toString();var ye=(e,t,{width:r,height:s})=>{let l=document.createElement("iframe"),o="";switch(t.providerName){case"Persona":o=g.personaIframePath;break;default:throw new Error(`Ads from ${t.providerName} are unavailable via extension iframe`)}let a=new URL(o);return a.searchParams.set("id",e),a.searchParams.set("slug",t.slug),l.src=a.toString(),l.id=e,l.style.width=`${r}px`,l.style.height=`${s}px`,l.style.border="none",{element:l}};var ie=e=>window.parent.postMessage(JSON.stringify(e),"*"),Ge=(e,t,r)=>T(void 0,null,function*(){if(t.length===0){ie({id:e,type:re,reason:"No more ads to render"});return}let[s,...l]=t,o=typeof s=="number"?g.bannerAdsMeta[s]:s;ie({id:e,type:le,adMetadata:o}),document.body.style.backgroundColor=o.source.native?"transparent":"#F2F2F2";let{source:a,dimensions:n}=o,i;switch(a.providerName){case"Temple":i=fe(n.width,n.height,a.native);break;case"HypeLab":case"SmartyAds":i=Re(e,a,n,r);break;default:i=ye(e,a,n);}let{element:d}=i,m=document.getElementById("root"),A=document.getElementById("temple-label");m.replaceChildren(d),a.native?A.removeAttribute("active"):A.setAttribute("active","");let p=(c={})=>{let u=document.getElementById(me);if(a.native&&u&&m.removeChild(u),!a.native)try{let{image:E,video:f}=c,h;if(E?(h=document.createElement("img"),h.src=E.url,h.alt=""):f&&(h=document.createElement("video"),h.src=f.url,h.autoplay=!0,h.preload="auto",h.playsInline=!0,h.muted=!0,h.loop=!0),!h&&u&&m.removeChild(u),!h)return;h.id=me,h.style.zIndex="-1",se(h,{position:"absolute",top:"0px",left:"0px",right:"0px",bottom:"0px",width:"100%",height:"100%","object-fit":"cover",filter:"blur(12px)"}),u?m.replaceChild(h,u):m.prepend(h);}catch(E){console.error(E);}};if(d instanceof HTMLIFrameElement)return new Promise((c,u)=>{let E=setTimeout(()=>{window.removeEventListener("message",h),u(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(a)}`));},(l.length===0?2e4:1e4)*(g.IS_MISES_BROWSER?2:1)),f=!1,h=S=>{var R,v;if(S.source===d.contentWindow)try{let I=typeof S.data=="string"?JSON.parse(S.data):S.data;switch(I.type){case K:f||(f=!0,ie({id:e,type:K,adMetadata:o}),clearTimeout(E),c()),p((R=I.ad)==null?void 0:R.creative_set);break;case re:f||(window.removeEventListener("message",h),clearTimeout(E),u(new Error((v=I.reason)!=null?v:"Unknown error")));break;case ae:let{width:P,height:w}=I;P>0&&w>0&&(o.source.native?d.style.height=`${w}px`:(U(d,"width",P),U(d,"height",w)),ie(L(x({},I),{id:e})));}}catch(I){console.error("Observing error:",I);}};window.addEventListener("message",h);}).catch(c=>(console.error(c),Ge(e,l,r)));p(i.creativeSet),ie({id:e,type:K,adMetadata:o});});var St=(e,t)=>{let{adPlacesRulesForAllDomains:r,providersRulesForAllDomains:s,providersSelectors:l,providersNegativeSelectors:o={},providersToReplaceAtAllSites:a,permanentAdPlacesRulesForAllDomains:n,permanentNativeAdPlacesRulesForAllDomains:i={},adsReplaceUrlsBlacklist:d=[],elementsToHideOrRemoveRules:m={},providersCategories:A={},timestamp:p}=t,{hostname:c,href:u}=e;if(d.some(h=>new RegExp(h).test(u)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],timestamp:p};let E=u.replace(/#.*$/,""),f=h=>{let S=h.source.includes("#")?u:E;return h.test(S)};return {adPlacesRules:Tt(c,f,r),permanentAdPlacesRules:vt(c,f,n,i),providersSelectors:Ke(c,f,s,l,a,A),providersNegativeSelectors:Ke(c,f,s,o,a,A),elementsToHideOrRemoveRules:wt(c,f,m),timestamp:p}},wt=(e,t,r)=>{var s;return ((s=r[e])!=null?s:[]).map(a=>{var n=a,{urlRegexes:l}=n,o=_(n,["urlRegexes"]);return L(x({},o),{urlRegexes:l.map(i=>new RegExp(i))})}).filter(({urlRegexes:l})=>l.some(t))},Tt=(e,t,r)=>{var o;return ((o=r[e])!=null?o:[]).map(i=>{var d=i,{urlRegexes:a}=d,n=_(d,["urlRegexes"]);return L(x({},n),{urlRegexes:a.map(m=>new RegExp(m))})}).reduce((a,m)=>{var A=m,{urlRegexes:n,selector:i}=A,d=_(A,["urlRegexes","selector"]);if(!n.some(t))return a;let E=i,{cssString:p}=E,c=_(E,["cssString"]),u=a.findIndex(S=>{var R=S,{selector:f}=R,h=_(R,["selector"]);let P=f,I=_(P,["cssString"]);return lodash.isEqual(c,I)&&lodash.isEqual(d,h)});return u===-1?a.push(x({selector:i},d)):a[u].selector.cssString+=", ".concat(p),a},[])},ze=e=>o=>{var a=o,{urlRegexes:t,elementToMeasureSelector:r,elementsToMeasureSelectors:s}=a,l=_(a,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return L(x({},l),{urlRegexes:t.map(n=>new RegExp(n)),isNative:e,elementsToMeasureSelectors:s!=null?s:r?{width:r,height:r}:void 0})},vt=(e,t,r,s={})=>{var n,i;let l=(n=r[e])!=null?n:[],o=(i=s[e])!=null?i:[];return l.map(ze(!1)).concat(o.map(ze(!0))).filter(({urlRegexes:d})=>d.some(t))};function Pt(e){let t="";return e.forEach(r=>{t+=r+", ";}),t&&(t=t.slice(0,-2)),t}var Ke=(e,t,r,s,l,o)=>{var A;let n=((A=r[e])!=null?A:[]).map(u=>{var E=u,{urlRegexes:p}=E,c=_(E,["urlRegexes"]);return L(x({},c),{urlRegexes:p.map(f=>new RegExp(f))})}).filter(({urlRegexes:p})=>p.some(t)),i=new Set,d={},m=p=>{var E,f;if(i.has(p))return;let c=((E=o[p])!=null?E:[k]).join("|");((f=s[p])!=null?f:[]).forEach(h=>{let{selector:S,parentDepth:R}=typeof h=="string"?{selector:h,parentDepth:0}:h;d[c]||(d[c]={});let v=d[c];v[R]||(v[R]=new Set),v[R].add(S);}),i.add(p);};return l.forEach(m),n.forEach(({providers:p})=>p.forEach(m)),Object.entries(d).map(([p,c])=>Object.entries(c).map(([u,E])=>({parentDepth:Number(u),selector:Pt(E),categories:p.split("|")}))).flat()};var C=e=>(...t)=>T(void 0,null,function*(){let{data:r}=yield e(...t);return r}),Se=class{constructor(t){this.getAdPlacesRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=C(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersCategories=C(()=>this.api.get("/slise-ad-rules/providers/categories"));this.getProvidersRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=C(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=C(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=C(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=C(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getAllRules=()=>T(this,null,function*(){let[t,r,s,l,o,a,n,i,d,m]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules(),this.getProvidersCategories()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:r,providersSelectors:s,providersToReplaceAtAllSites:l,permanentAdPlacesRulesForAllDomains:o,permanentNativeAdPlacesRulesForAllDomains:a,adsReplaceUrlsBlacklist:n,providersNegativeSelectors:i,elementsToHideOrRemoveRules:d,providersCategories:m,timestamp:Date.now()}});this.api=It__default.default.create({baseURL:new URL("/api",t).href,adapter:"fetch"});}getAdVersionRequestConfig(){return {params:{extVersion:g.EXTENSION_VERSION,isMisesBrowser:g.IS_MISES_BROWSER}}}};
|
|
15
|
+
var Qe=Object.defineProperty,je=Object.defineProperties;var Je=Object.getOwnPropertyDescriptors;var ie=Object.getOwnPropertySymbols;var xe=Object.prototype.hasOwnProperty,be=Object.prototype.propertyIsEnumerable;var Ie=(e,t,r)=>t in e?Qe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,w=(e,t)=>{for(var r in t||(t={}))xe.call(t,r)&&Ie(e,r,t[r]);if(ie)for(var r of ie(t))be.call(t,r)&&Ie(e,r,t[r]);return e},C=(e,t)=>je(e,Je(t));var _=(e,t)=>{var r={};for(var s in e)xe.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&ie)for(var s of ie(e))t.indexOf(s)<0&&be.call(e,s)&&(r[s]=e[s]);return r};var T=(e,t,r)=>new Promise((s,o)=>{var a=l=>{try{i(r.next(l));}catch(d){o(d);}},n=l=>{try{i(r.throw(l));}catch(d){o(d);}},i=l=>l.done?s(l.value):Promise.resolve(l.value).then(a,n);i((r=r.apply(e,t)).next());});process&&process.env&&process.env.NODE_ENV==="development";navigator.userAgent.includes("Macintosh");var _e=e=>!!e,Ze=300,O=(e=Ze)=>new Promise(t=>setTimeout(t,e));var A=class{};A.IS_MISES_BROWSER=!1,A.ADS_TW_WINDOW_URL="",A.TKEY_INPAGE_AD_URL="",A.SMALL_TKEY_INPAGE_AD_URL="",A.SWAP_TKEY_URL="",A.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",A.personaIframePath="",A.getAdsStackIframeURL=()=>"",A.buildNativeAdsMeta=()=>[],A.pickNextAdMetadata=()=>{},A.bannerAdsMeta=[];var et=e=>{let{adsTwWindowUrl:t,tkeyInpageAdUrl:r,smallTkeyInpageAdUrl:s,swapTkeyUrl:o,externalAdsActivityMessageType:a,personaIframePath:n,getAdsStackIframeURL:i,buildNativeAdsMeta:l,bannerAdsMeta:d,extVersion:m,templePassphrase:h,isMisesBrowser:c,pickNextAdMetadata:u}=e;s&&(A.SMALL_TKEY_INPAGE_AD_URL=s),A.ADS_TW_WINDOW_URL=t,A.TKEY_INPAGE_AD_URL=r,A.SWAP_TKEY_URL=o,A.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=a,A.personaIframePath=n,A.getAdsStackIframeURL=i,A.buildNativeAdsMeta=l,A.pickNextAdMetadata=u,A.bannerAdsMeta=d,A.EXTENSION_VERSION=m,A.TEMPLE_PASSPHRASE=h,A.IS_MISES_BROWSER=c;};var G="twa",K="twa-native",$="twa-sibling-replacement";var oe="adRenderStart",ae="resize",te="ready",re="error",le="accelerometer; gyroscope",x="crypto",ce="background";var q=/[\d.]+(px)?$/,X=`[${G}]`,Le=`[${G}]:not([${K}])`,Ce=`[${K}]`,pe=(e,t)=>{let r=parseInt(e,10);return isNaN(r)||!q.test(e)?t:r},U=(e,t,r)=>{e.style[t]=`${Math.max(pe(e.style[t],0),r)}px`;},Q=e=>e.reduce((t,r)=>t+pe(r,0),0),j=e=>!!e.closest(X),de=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute($))},se=e=>{let t=getComputedStyle(e),{x:r,right:s,width:o,height:a}=e.getBoundingClientRect(),n={width:o,height:a},i=["width","height"];for(let l of i){let d=t[l],m=e.getAttribute(l),h=Math.max(...[d,m].map(c=>pe(c!=null?c:"",-1)));h!==-1&&(n[l]=h),l==="width"&&r<0?n.width+=r:l==="width"&&s>window.innerWidth&&(n.width=window.innerWidth-r);}return n},H=(e,t,r=document)=>e?t?[...r.querySelectorAll(e)]:[r.querySelector(e)].filter(s=>!!s):[],B=(e,t)=>{let r=e;for(let s=0;s<t;s++){let o=r.parentElement;if(!o)return null;r=o;}return r},He=(e,t,r,s,o)=>{if(e<2&&t<2)return [];if(s)return A.buildNativeAdsMeta(e,t);let a=r==="permanent"||r==="slot-replacement"?A.bannerAdsMeta.filter(({source:l})=>l.shouldNotUseStrictContainerLimits):[],n=Math.max(e,...a.map(({dimensions:l})=>l.width)),i=Math.max(t,...a.map(({dimensions:l})=>l.height));return A.bannerAdsMeta.reduce((l,{dimensions:d,source:m},h)=>{let{shouldNotUseStrictContainerLimits:c=!1,categories:u=[x]}=m;if(u.every(S=>!o.includes(S)))return l;let{minContainerWidth:p,minContainerHeight:g,width:y,maxContainerWidth:f,maxContainerHeight:P}=d,E=!1;switch(r){case"permanent":E=c||n>=y&&(i>=g||i<2);break;case"slot-replacement":E=c||n>=p&&(i>=g||i<2);break;default:E=e>=p&&t>=g&&e<=f&&t<=P;}return E&&l.push(h),l},[])},tt=e=>{let{x:t,y:r,width:s,height:o}=e.getBoundingClientRect();return t!==0||r!==0||s!==0||o!==0},Ae=e=>{let{display:t}=window.getComputedStyle(e);switch(t){case"none":return !0;case"contents":return Array.from(e.children).every(r=>Ae(r));default:return !tt(e)}};var Ne=(e,t)=>{let{shouldHide:r,cssString:s,parentDepth:o,isMultiple:a}=e;H(s,a).forEach(n=>{let i=B(n,o);if(!i)return;let l=window.getComputedStyle(i);l.display!=="none"&&l.visibility!=="hidden"&&t.push({type:r?"hide-element":"remove-element",element:i});});};var De=(e,t,r)=>T(void 0,null,function*(){let{parentSelector:s,displayWidth:o}=e,{isMultiple:a,cssString:n,parentDepth:i}=s;if(o&&!semver.satisfies(semver.coerce(window.innerWidth),o))return [];let l=H(n,a).map(d=>B(d,i)).filter(d=>!!d);return yield Promise.all(l.map(d=>T(void 0,null,function*(){yield O(0),nt(d,e,t,r);}))),l}),ue=(e,t)=>{var r,s;return e?{width:(r=document.querySelector(e.width))!=null?r:t,height:(s=document.querySelector(e.height))!=null?s:t}:{width:t,height:t}},nt=(e,t,r,s)=>{var we;let Te=t,{shouldUseDivWrapper:o,divWrapperStyle:a,wrapperStyle:n,elementStyle:i,adSelector:l,insertionIndex:d,insertBeforeSelector:m,insertAfterSelector:h,insertionsCount:c=1,elementsToMeasureSelectors:u,stylesOverrides:p,shouldHideOriginal:g=!1,isNative:y,urlRegexes:f,parentSelector:P}=Te,E=_(Te,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),S=E.wrapperType?n:o?a:{display:"contents"},{isMultiple:I,cssString:M,parentDepth:v}=l,b=H(y?Ce:Le,!0,e).reduce((R,k)=>R.some(z=>z.contains(k))?R:[...R.filter(z=>!k.contains(z)),k],[]),L=b.filter(Ae),F=b.length-L.length,W=c-F;if(H(M,I,e).map(R=>B(R,v)).filter(R=>_e(R)&&!j(R)).forEach(R=>{var z;let k=window.getComputedStyle(R).display==="none";if(W<=0)(!g||!k)&&s.push({type:g?"hide-element":"remove-element",element:R});else {let Ke=ue(u,((z=R.parentElement)==null?void 0:z.children.length)===1?R.parentElement:R),qe=w({type:"replace-element",element:R,wrapperStyle:S,elementStyle:i,stylesOverrides:p,adCategories:[x]},E),Pe={type:"hide-element",element:R},Xe=w({type:"simple-insert-ad",wrapperStyle:S,elementStyle:i,parent:R.parentElement,insertionIndex:Array.from(R.parentElement.children).indexOf(R),isSiblingReplacement:!0,stylesOverrides:p,adCategories:[x]},E),ee=[],Me=de(R);g&&Me&&!k?ee=[Pe]:g&&!Me?ee=[Pe,Xe]:g||(ee=[qe]),ee.length>0&&r(Ke,"permanent",y,[x],...ee)&&W--;}}),W<=0)return;let D=-1,Y=e,Z={width:e,height:e},ve=m||h;if(ve){let R=e.querySelector(ve),k=R==null?void 0:R.parentElement;R&&k&&(Y=k,D=Array.from(e.children).indexOf(R)+(m?0:1),Z=ue(u,R));}else {let R=d!=null?d:0;D=R<0?Math.max(e.children.length+R,0):Math.min(R,e.children.length),Z=ue(u,(we=e.children[D])!=null?we:e);}if(D!==-1){let R=w({type:"simple-insert-ad",wrapperStyle:S,elementStyle:i,parent:Y,insertionIndex:D,isSiblingReplacement:!1,stylesOverrides:p,adCategories:[x]},E);r(Z,"permanent",y,[x],...Array(W).fill(R));}};var ot=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],at=lodash.memoize(e=>e.reduce((t,{dimensions:r})=>{let s=t.filter(({width:o,height:a})=>o<r.width||a<r.height);return (s.length===0||s.some(({width:o,height:a})=>o>r.width||a>r.height))&&s.push(r),s},[])),Oe=(e,t,r,s)=>T(void 0,null,function*(){let o=at(A.bannerAdsMeta),a=e.map(({selector:i,parentDepth:l,categories:d})=>H(i,!0).reduce((m,h)=>{var M;let c=(M=B(h,l))!=null?M:h,u=m.findIndex(({element:v})=>v.contains(c)),p=c.parentElement&&window.getComputedStyle(c.parentElement),{width:g,height:y}=se(c),f=s.some(v=>{var b;return v.type==="replace-all-children"||v.type==="simple-insert-ad"?v.parent.contains(c)||c.contains(v.parent):((b=v.element.parentElement)==null?void 0:b.contains(c))||c.contains(v.element)}),P=(p==null?void 0:p.display)==="none"||(p==null?void 0:p.visibility)==="hidden",E=u>=0&&m[u]instanceof HTMLAnchorElement,S=o.some(({width:v,height:b})=>g>=v&&y>=b);if(f||!S||P||E)return m;let I={element:c,categories:d};return u>=0?m.splice(u,1,I):m.some(({element:v})=>v.contains(c))||m.push(I),m},[])).flat(),n=t.map(({selector:i,parentDepth:l})=>H(i,!0).map(d=>B(d,l)).filter(d=>!!d)).flat();a=a.filter(({element:i})=>!n.includes(i)),yield Promise.all(a.map(d=>T(void 0,[d],function*({element:i,categories:l}){var p,g,y,f,P,E,S,I;yield O(0);let m=i.parentElement,{width:h,height:c}=window.getComputedStyle(i),u=q.test(h)&&q.test(c)?i:(g=(p=m==null?void 0:m.closest("div, article, aside, footer, header"))!=null?p:(m==null?void 0:m.tagName.toLowerCase())==="body"?void 0:m)!=null?g:i;if(!j(i)&&!i.querySelector(X)&&!s.some(M=>M.type==="simple-insert-ad"?!1:M.type==="replace-all-children"?M.parent.contains(i):M.element===i)){let M=(y=i.getAttribute("style"))!=null?y:"",v=Object.fromEntries(M.split(";").filter(Boolean).map(Y=>Y.split(":").map(Z=>Z.trim())));if((f=v.width)!=null&&f.match(/^0[a-z]/)||(P=v.height)!=null&&P.match(/^0[a-z]/))return;let b=window.getComputedStyle(i),L=w(w({},Object.fromEntries(ot.map(Y=>[Y,b.getPropertyValue(Y)]))),v),F={type:"hide-element",element:i},W={type:"simple-insert-ad",wrapperStyle:L,parent:(E=i.parentElement)!=null?E:document.body,insertionIndex:Array.from((I=(S=i.parentElement)==null?void 0:S.children)!=null?I:[]).indexOf(i),isSiblingReplacement:!0,shouldUseBlurredBackground:!0,adCategories:l},V,D=i.closest(`[${$}] + *`);D&&D!==i?V=[{type:"remove-element",element:D.previousElementSibling},F,W]:D?V=window.getComputedStyle(i).display==="none"?[]:[F]:V=[F,W],r({width:u,height:u},"provider-replacement",!1,l,...V);}})));});var Be=(e,t,r)=>T(void 0,null,function*(){let{cssString:s,isMultiple:o}=e.selector,a=H(s,o);yield Promise.all(a.map(n=>T(void 0,null,function*(){yield O(0),lt(n,e,t,r);})));}),lt=(e,t,r,s)=>{let{selector:{shouldUseDivWrapper:o,parentDepth:a,divWrapperStyle:n},stylesOverrides:i,shouldHideOriginal:l,isNative:d=!1}=t,m=B(e,a);if(!m||r.some(u=>u.contains(m))||j(m)||m.querySelector(X))return;let h={shouldUseDivWrapper:o,wrapperStyle:n},c;if(o&&l){let u=m.parentElement,p=window.getComputedStyle(m).display==="none",g=w({type:"simple-insert-ad",parent:u,insertionIndex:Array.from(u.children).indexOf(m),stylesOverrides:i==null?void 0:i.map(P=>{var E=P,{parentDepth:y}=E,f=_(E,["parentDepth"]);return C(w({},f),{parentDepth:y-1})}),isSiblingReplacement:!0,adCategories:[x]},h);c=[],p||c.push({type:"hide-element",element:m}),de(m)||c.push(g);}else if(o)c=[w({type:"replace-element",element:m,stylesOverrides:i==null?void 0:i.map(y=>{var f=y,{parentDepth:p}=f,g=_(f,["parentDepth"]);return C(w({},g),{parentDepth:p-1})}),adCategories:[x]},h)];else if(l){let u={type:"simple-insert-ad",parent:m,insertionIndex:0,stylesOverrides:i,isSiblingReplacement:!0,adCategories:[x],wrapperStyle:{display:"contents"}};c=Array.from(m.children).filter(p=>window.getComputedStyle(p).display!=="none").map(p=>({type:"hide-element",element:p})),m.querySelector(X)||c.push(u);}else c=[{type:"replace-all-children",parent:m,stylesOverrides:i,adCategories:[x],wrapperStyle:{display:"contents"}}];c.length>0&&s({width:m,height:m},"slot-replacement",d,[x],...c);};var dt=a=>T(void 0,[a],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:r,permanentAdPlacesRules:s,elementsToHideOrRemoveRules:o}){let n=[],i=(d,m,h,c,...u)=>{if(u.length>0&&u.every(L=>L.type==="hide-element"||L.type==="remove-element"))return n.push(...u),!0;let{width:p}=se(d.width),{height:g}=se(d.height),{paddingLeft:y,paddingRight:f}=window.getComputedStyle(d.width),{paddingTop:P,paddingBottom:E}=window.getComputedStyle(d.height),S=Q([y,f]),I=S===p?p:p-S,M=Q([P,E]),v=M===g?g:g-M,b=He(I,v,m,h,c);return b.length?(n.push(...u.map(L=>L.type==="hide-element"||L.type==="remove-element"?L:C(w({},L),{adsMetadata:b,originalWidth:I,originalHeight:v}))),!0):!1},l=[];return yield Promise.all(o.map(d=>T(void 0,null,function*(){yield O(0),Ne(d,n);}))),yield Promise.all(s.map(d=>T(void 0,null,function*(){yield O(0),l=l.concat(yield De(d,i,n));}))),yield Promise.all(r.map(d=>T(void 0,null,function*(){yield O(0),yield Be(d,l,i);}))),yield Oe(e,t,i,n),n});var he=(a=>(a.Optimal="Optimal",a.SmartyAds="SmartyAds",a.HypeLab="HypeLab",a.Persona="Persona",a.Temple="Temple Wallet",a))(he||{});var ge=new Set,We=new Set,ke=new Set,Fe=e=>T(void 0,null,function*(){let t=e.id;if(!ge.has(t))return ge.add(t),new Promise((r,s)=>{let o=!1,a=n=>{var i,l;if(n.source===e.contentWindow)try{let d=typeof n.data=="string"?JSON.parse(n.data):n.data;if(d.id!==t)return;let m=e.offsetWidth-e.clientWidth,h=e.offsetHeight-e.clientHeight;switch(d.type){case te:r(d.adMetadata.source.providerName);break;case re:window.removeEventListener("message",a),e.style.display="none",s(new Error((i=d.reason)!=null?i:"Unknown error"));break;case oe:let{dimensions:c,source:u}=d.adMetadata;o=(l=u.native)!=null?l:!1;let{width:p,height:g}=c;p>0&&g>0&&(u.native?e.style.height=`${g}px`:(U(e,"width",p),U(e,"height",g)));break;case ae:let{width:y,height:f}=d;o?e.style.height=`${f+h}px`:(U(e,"width",y+m),U(e,"height",f+h));}}catch(d){console.error("Observing error:",d);}};window.addEventListener("message",a);}).then(r=>{if(We.has(t))return;We.add(t),pt(e)?Ve(t,r):mt(e,r);}).catch(r=>{throw console.error(r),r}).finally(()=>void ge.delete(t))}),mt=(e,t)=>{let r=new IntersectionObserver(s=>{s.some(o=>o.isIntersecting)&&(Ve(e.id,t),r.disconnect());},{threshold:.5});r.observe(e);},Ve=(e,t)=>{if(ke.has(e))return;ke.add(e);let r=window.parent.location.href;ct__default.default.runtime.sendMessage({type:A.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:r,provider:he[t]}).catch(s=>void console.error(s));},pt=e=>{let t=e.getBoundingClientRect(),r=window.visualViewport;if(!r)return !1;let s=Math.min(Math.max(0,t.x),r.width),o=Math.min(Math.max(0,t.x+t.width),r.width),a=Math.min(Math.max(0,t.y),r.height),n=Math.min(Math.max(0,t.y+t.height),r.height),i=t.width*t.height;return (o-s)*(n-a)/i>=.5};var ne=(e,t)=>{for(let r in t)e.style.setProperty(r,t[r]);};var ut=(e,t)=>{["width","height"].forEach(s=>{var a;let o=(a=e.style[s])!=null?a:"";q.test(o)&&parseInt(o,10)<t[s]&&e.style.removeProperty(s);});},ht=(e,t,r,s)=>T(void 0,null,function*(){let{elementStyle:o={},stylesOverrides:a=[],adsMetadata:n,wrapperType:i,originalHeight:l,originalWidth:d,shouldUseBlurredBackground:m,adCategories:h}=e;a.sort((E,S)=>E.parentDepth-S.parentDepth);let c,u=nanoid.nanoid(),p=document.createElement("iframe");p.loading="lazy",p.src=A.getAdsStackIframeURL(u,n,window.location.href,h),p.id=u,p.allow=le;let g=n[0],{dimensions:y}=typeof g=="number"?A.bannerAdsMeta[g]:g,f={width:m?Math.max(d,y.width):y.width,height:m?Math.max(l,y.height):y.height};p.style.width=i==="tbody"?"100%":`${f.width}px`,p.style.height=`${f.height}px`,p.style.border="none";for(let E in o)p.style.setProperty(E,o[E]);switch(p.setAttribute(G,"true"),ut(t,f),r.appendChild(p),e.type){case"replace-all-children":c=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":c=e.element.parentElement,e.element.replaceWith(t);break;default:let E=e.parent.children[e.insertionIndex];if(e.isSiblingReplacement){t.setAttribute($,"true");let S=new MutationObserver(I=>{I.some(v=>Array.from(v.removedNodes).includes(E))&&(t.remove(),S.disconnect());});S.observe(e.parent,{childList:!0});}c=e.parent,e.parent.insertBefore(t,E);break}if(i!=="tbody"){let{borderLeftWidth:E,borderRightWidth:S,borderTopWidth:I,borderBottomWidth:M}=window.getComputedStyle(p),{borderLeftWidth:v,borderRightWidth:b,borderTopWidth:L,borderBottomWidth:F}=window.getComputedStyle(t),W=Q([E,S,v,b]),V=Q([I,M,L,F]);p.style.width=`${f.width-W}px`,p.style.height=`${f.height-V}px`;}Fe(p).catch(s);let P=0;a.forEach(({parentDepth:E,style:S})=>{for(;E>P&&c;)c=c.parentElement,P++;c&&ne(c,S);});}),Ye=e=>T(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:r,wrapperType:s="div",colsAfter:o=0,colsBefore:a=0,colspan:n=1}=e,i=r.every(h=>typeof h=="object"),l,d;if(s==="div")l=document.createElement("div"),d=l;else {l=document.createElement("tbody");let h=document.createElement("tr");l.appendChild(h);for(let u=0;u<a;u++)h.appendChild(document.createElement("td"));let c=document.createElement("td");c.colSpan=n,h.appendChild(c),d=c;for(let u=0;u<o;u++)h.appendChild(document.createElement("td"));}l.setAttribute(G,"true"),i&&l.setAttribute(K,"true"),ne(l,t);let m=()=>{let h=document.createElement("div");h.setAttribute(G,"true"),i&&h.setAttribute(K,"true"),e.type==="simple-insert-ad"&&e.isSiblingReplacement&&h.setAttribute($,"true"),h.style.display="none",l.replaceWith(h);};yield ht(e,l,d,h=>{console.error("Failed to render ads",h),m();}).catch(h=>{throw console.error("Inserting an ad attempt error:",h),m(),h});});var gt=e=>Promise.allSettled(e.map(t=>T(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Ye(t);})));var Ee=(e,t,r=!1)=>{let s=document.createElement("div");s.style.width=`${e}px`,s.style.height=`${t}px`;let o=document.createElement("div");if(o.style.width=`${e}px`,o.style.height=`${t}px`,s.appendChild(o),r){let i=document.createElement("a");return i.href=A.SWAP_TKEY_URL,i.target="_blank",i.rel="noopener noreferrer",i.style.width=`${e}px`,i.style.height=`${t}px`,i.style.overflow="hidden",i.style.textOverflow="ellipsis",i.appendChild(document.createTextNode("TODO: Native TKEY ad")),o.appendChild(i),{element:s}}let a=document.createElement("a");a.href=A.SWAP_TKEY_URL,a.target="_blank",a.rel="noopener noreferrer",a.style.width="100%",a.style.height="100%",o.appendChild(a);let n=document.createElement("img");return n.src=e<=320?A.SMALL_TKEY_INPAGE_AD_URL:A.TKEY_INPAGE_AD_URL,n.style.width="100%",n.style.height="100%",a.appendChild(n),{element:s,creativeSet:{image:{url:n.src}}}};var fe=(e,t,{width:r,height:s},o)=>{let a=document.createElement("iframe");return a.id=e,a.src=ft(t,o,r,s,a.id),a.style.width=t.native?"100%":`${r}px`,a.style.height=`${s}px`,a.style.border="none",a.allow=le,{element:a}},ft=(e,t,r,s,o)=>{let{providerName:a,slug:n,native:i}=e,l=new URL(A.ADS_TW_WINDOW_URL);return l.searchParams.set("ap",a.toLowerCase()),i?l.searchParams.set("vh",String(s)):l.searchParams.set("w",String(r)),l.searchParams.set("h",String(s)),l.searchParams.set("p",n),l.searchParams.set("o",Rt(t)),o&&l.searchParams.set("id",o),l.toString()},Rt=e=>cryptoJs.AES.encrypt(e,A.TEMPLE_PASSPHRASE).toString();var Re=(e,t,{width:r,height:s})=>{let o=document.createElement("iframe"),a="";switch(t.providerName){case"Persona":a=A.personaIframePath;break;default:throw new Error(`Ads from ${t.providerName} are unavailable via extension iframe`)}let n=new URL(a);return n.searchParams.set("id",e),n.searchParams.set("slug",t.slug),o.src=n.toString(),o.id=e,o.style.width=`${r}px`,o.style.height=`${s}px`,o.style.border="none",{element:o}};var ye=class{constructor(t,r,s,o,a,n){this.id=t;this.origin=s;this.pageHasPlacesRules=o;this.adCategories=a;this.hypelabBlacklistedCampaignsSlugs=n;this.wasReady=!1;this.rootElement=document.getElementById("root");this.validAdsCounter=0;this.adsMetadata=r.map(i=>typeof i=="number"?A.bannerAdsMeta[i]:i);}startRendering(){if(this.adsMetadata.length===0){this.broadcastNoMoreAds();return}this.currentAdMetadata=A.pickNextAdMetadata(this.adsMetadata,this.currentAdMetadata,this.validAdsCounter,this.pageHasPlacesRules,this.adCategories);let t=this.currentAdMetadata;if(!t){this.broadcastNoMoreAds();return}this.broadcastMessage({id:this.id,type:oe,adMetadata:this.currentAdMetadata});let{element:r,creativeSet:s}=this.placeNewAd(t);r instanceof HTMLIFrameElement?this.listenToIframeMessages(r,t):this.handleValidAd({ad:{creative_set:s}});}listenToIframeMessages(t,r){let s=A.pickNextAdMetadata(this.adsMetadata,r,this.validAdsCounter,this.pageHasPlacesRules,this.adCategories);this.responseTimeout=setTimeout(()=>{console.error(`Timeout exceeded for ${this.id}, ad source: ${JSON.stringify(r.source)}`),this.handleInvalidAd();},(s?1e4:2e4)*(A.IS_MISES_BROWSER?2:1)),this.messageListener=o=>{var a;if(o.source===t.contentWindow)try{let n=typeof o.data=="string"?JSON.parse(o.data):o.data;switch(n.type){case te:if(r.source.providerName==="HypeLab"&&this.hypelabBlacklistedCampaignsSlugs.includes((a=n.ad)==null?void 0:a.campaign_slug)&&s){this.handleInvalidAd();break}this.handleValidAd(n);break;case re:this.wasReady||this.handleInvalidAd();break;case ae:let{width:i,height:l}=n;i>0&&l>0&&(r.source.native?t.style.height=`${l}px`:(U(t,"width",i),U(t,"height",l)),this.broadcastMessage(C(w({},n),{id:this.id})));}}catch(n){console.error("Message handling error:",n);}},window.addEventListener("message",this.messageListener);}handleInvalidAd(){this.removeMessageListener(),this.clearResponseTimeout(),this.startRendering(),this.validAdsCounter=0;}removeMessageListener(){this.messageListener&&(window.removeEventListener("message",this.messageListener),this.messageListener=void 0);}placeNewAd(t){document.body.style.backgroundColor=t.source.native?"transparent":"#F2F2F2";let{source:r,dimensions:s}=t,o;switch(r.providerName){case"Temple":o=Ee(s.width,s.height,r.native);break;case"HypeLab":case"SmartyAds":o=fe(this.id,r,s,this.origin);break;default:o=Re(this.id,r,s);}let{element:a}=o,n=document.getElementById("temple-label");return this.rootElement.replaceChildren(a),r.native?n.removeAttribute("active"):n.setAttribute("active",""),o}updateBackground(t,r={}){let s=document.getElementById(ce);if(t.native&&s&&this.rootElement.removeChild(s),!t.native)try{let{image:o,video:a}=r,n;if(o?(n=document.createElement("img"),n.src=o.url,n.alt=""):a&&(n=document.createElement("video"),n.src=a.url,n.autoplay=!0,n.preload="auto",n.playsInline=!0,n.muted=!0,n.loop=!0),!n&&s&&this.rootElement.removeChild(s),!n)return;n.id=ce,n.style.zIndex="-1",ne(n,{position:"absolute",top:"0px",left:"0px",right:"0px",bottom:"0px",width:"100%",height:"100%","object-fit":"cover",filter:"blur(12px)"}),s?this.rootElement.replaceChild(n,s):this.rootElement.prepend(n);}catch(o){console.error(o);}}broadcastMessage(t){window.parent.postMessage(JSON.stringify(t),"*");}broadcastNoMoreAds(){this.broadcastMessage({id:this.id,type:re,reason:"No more ads to render"});}clearResponseTimeout(){this.responseTimeout!==void 0&&(clearTimeout(this.responseTimeout),this.responseTimeout=void 0);}handleValidAd(t){var s;let r=this.currentAdMetadata;r&&(this.wasReady||(this.wasReady=!0,this.broadcastMessage({id:this.id,type:te,adMetadata:r})),this.validAdsCounter++,this.clearResponseTimeout(),this.updateBackground(r.source,(s=t.ad)==null?void 0:s.creative_set));}},yt=(e,t,r,s=!1,o,a)=>{try{new ye(e,t,r,s,o,a).startRendering();}catch(n){console.error("Error while rendering ads stack:",n);}};var St=(e,t)=>{let{adPlacesRulesForAllDomains:r,providersRulesForAllDomains:s,providersSelectors:o,providersNegativeSelectors:a={},providersToReplaceAtAllSites:n,permanentAdPlacesRulesForAllDomains:i,permanentNativeAdPlacesRulesForAllDomains:l={},adsReplaceUrlsBlacklist:d=[],elementsToHideOrRemoveRules:m={},providersCategories:h={},blacklistedHypelabCampaignsSlugs:c=[],timestamp:u}=t,p=typeof e=="string"?e:e.href,{hostname:g}=new URL(p);if(d.some(P=>new RegExp(P).test(p)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],blacklistedHypelabCampaignsSlugs:c,timestamp:u};let y=p.replace(/#.*$/,""),f=P=>{let E=P.source.includes("#")?p:y;return P.test(E)};return {adPlacesRules:Tt(g,f,r),permanentAdPlacesRules:wt(g,f,i,l),providersSelectors:ze(g,f,s,o,n,h),providersNegativeSelectors:ze(g,f,s,a,n,h),elementsToHideOrRemoveRules:vt(g,f,m),blacklistedHypelabCampaignsSlugs:c,timestamp:u}},vt=(e,t,r)=>{var s;return ((s=r[e])!=null?s:[]).map(n=>{var i=n,{urlRegexes:o}=i,a=_(i,["urlRegexes"]);return C(w({},a),{urlRegexes:o.map(l=>new RegExp(l))})}).filter(({urlRegexes:o})=>o.some(t))},Tt=(e,t,r)=>{var a;return ((a=r[e])!=null?a:[]).map(l=>{var d=l,{urlRegexes:n}=d,i=_(d,["urlRegexes"]);return C(w({},i),{urlRegexes:n.map(m=>new RegExp(m))})}).reduce((n,m)=>{var h=m,{urlRegexes:i,selector:l}=h,d=_(h,["urlRegexes","selector"]);if(!i.some(t))return n;let g=l,{cssString:c}=g,u=_(g,["cssString"]),p=n.findIndex(P=>{var E=P,{selector:y}=E,f=_(E,["selector"]);let M=y,I=_(M,["cssString"]);return lodash.isEqual(u,I)&&lodash.isEqual(d,f)});return p===-1?n.push(w({selector:l},d)):n[p].selector.cssString+=", ".concat(c),n},[])},$e=e=>a=>{var n=a,{urlRegexes:t,elementToMeasureSelector:r,elementsToMeasureSelectors:s}=n,o=_(n,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return C(w({},o),{urlRegexes:t.map(i=>new RegExp(i)),isNative:e,elementsToMeasureSelectors:s!=null?s:r?{width:r,height:r}:void 0})},wt=(e,t,r,s={})=>{var i,l;let o=(i=r[e])!=null?i:[],a=(l=s[e])!=null?l:[];return o.map($e(!1)).concat(a.map($e(!0))).filter(({urlRegexes:d})=>d.some(t))};function Pt(e){let t="";return e.forEach(r=>{t+=r+", ";}),t&&(t=t.slice(0,-2)),t}var ze=(e,t,r,s,o,a)=>{var h;let i=((h=r[e])!=null?h:[]).map(p=>{var g=p,{urlRegexes:c}=g,u=_(g,["urlRegexes"]);return C(w({},u),{urlRegexes:c.map(y=>new RegExp(y))})}).filter(({urlRegexes:c})=>c.some(t)),l=new Set,d={},m=c=>{var g,y;if(l.has(c))return;let u=((g=a[c])!=null?g:[x]).join("|");((y=s[c])!=null?y:[]).forEach(f=>{let{selector:P,parentDepth:E}=typeof f=="string"?{selector:f,parentDepth:0}:f;d[u]||(d[u]={});let S=d[u];S[E]||(S[E]=new Set),S[E].add(P);}),l.add(c);};return o.forEach(m),i.forEach(({providers:c})=>c.forEach(m)),Object.entries(d).map(([c,u])=>Object.entries(u).map(([p,g])=>({parentDepth:Number(p),selector:Pt(g),categories:c.split("|")}))).flat()};var N=e=>(...t)=>T(void 0,null,function*(){let{data:r}=yield e(...t);return r}),Se=class{constructor(t){this.getAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=N(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersCategories=N(()=>this.api.get("/slise-ad-rules/providers/categories"));this.getProvidersRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=N(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=N(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=N(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=N(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getBlacklistedHypelabCampaignsSlugs=N(()=>this.api.get("/temple-wallet-ads/hypelab-campaigns-blacklist"));this.getAllRules=()=>T(this,null,function*(){let[t,r,s,o,a,n,i,l,d,m,h]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules(),this.getProvidersCategories(),this.getBlacklistedHypelabCampaignsSlugs()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:r,providersSelectors:s,providersToReplaceAtAllSites:o,permanentAdPlacesRulesForAllDomains:a,permanentNativeAdPlacesRulesForAllDomains:n,adsReplaceUrlsBlacklist:i,providersNegativeSelectors:l,elementsToHideOrRemoveRules:d,providersCategories:m,blacklistedHypelabCampaignsSlugs:h,timestamp:Date.now()}});this.api=Mt__default.default.create({baseURL:new URL("/api",t).href,adapter:"fetch"});}getAdVersionRequestConfig(){return {params:{extVersion:A.EXTENSION_VERSION,isMisesBrowser:A.IS_MISES_BROWSER}}}};
|
|
16
16
|
|
|
17
17
|
exports.TempleWalletApi = Se;
|
|
18
|
-
exports.configureAds =
|
|
18
|
+
exports.configureAds = et;
|
|
19
19
|
exports.executeAdsActions = gt;
|
|
20
|
-
exports.getAdsActions =
|
|
21
|
-
exports.renderAdsStack =
|
|
20
|
+
exports.getAdsActions = dt;
|
|
21
|
+
exports.renderAdsStack = yt;
|
|
22
22
|
exports.transformRawRules = St;
|
package/package.json
CHANGED
|
@@ -147,6 +147,7 @@ const processPermanentAdsParent = (
|
|
|
147
147
|
wrapperStyle,
|
|
148
148
|
elementStyle,
|
|
149
149
|
stylesOverrides,
|
|
150
|
+
adCategories: [CRYPTO_CATEGORY_NAME],
|
|
150
151
|
...restProps
|
|
151
152
|
};
|
|
152
153
|
const hideActionBase: HideElementAction = {
|
|
@@ -161,6 +162,7 @@ const processPermanentAdsParent = (
|
|
|
161
162
|
insertionIndex: Array.from(banner.parentElement!.children).indexOf(banner),
|
|
162
163
|
isSiblingReplacement: true,
|
|
163
164
|
stylesOverrides,
|
|
165
|
+
adCategories: [CRYPTO_CATEGORY_NAME],
|
|
164
166
|
...restProps
|
|
165
167
|
};
|
|
166
168
|
|
|
@@ -229,6 +231,7 @@ const processPermanentAdsParent = (
|
|
|
229
231
|
insertionIndex: normalizedInsertionIndex,
|
|
230
232
|
isSiblingReplacement: false,
|
|
231
233
|
stylesOverrides,
|
|
234
|
+
adCategories: [CRYPTO_CATEGORY_NAME],
|
|
232
235
|
...restProps
|
|
233
236
|
};
|
|
234
237
|
|
|
@@ -181,7 +181,8 @@ export const processProvidersAds = async (
|
|
|
181
181
|
parent: banner.parentElement ?? document.body,
|
|
182
182
|
insertionIndex: Array.from(banner.parentElement?.children ?? []).indexOf(banner),
|
|
183
183
|
isSiblingReplacement: true,
|
|
184
|
-
shouldUseBlurredBackground: true
|
|
184
|
+
shouldUseBlurredBackground: true,
|
|
185
|
+
adCategories: categories
|
|
185
186
|
};
|
|
186
187
|
|
|
187
188
|
let actions: (InsertAdActionWithoutMeta | HideElementAction | RemoveElementAction)[];
|
|
@@ -82,6 +82,7 @@ const processSelectedElement = (
|
|
|
82
82
|
parentDepth: parentDepth - 1
|
|
83
83
|
})),
|
|
84
84
|
isSiblingReplacement: true,
|
|
85
|
+
adCategories: [CRYPTO_CATEGORY_NAME],
|
|
85
86
|
...actionBaseCommonProps
|
|
86
87
|
};
|
|
87
88
|
|
|
@@ -100,6 +101,7 @@ const processSelectedElement = (
|
|
|
100
101
|
...restProps,
|
|
101
102
|
parentDepth: parentDepth - 1
|
|
102
103
|
})),
|
|
104
|
+
adCategories: [CRYPTO_CATEGORY_NAME],
|
|
103
105
|
...actionBaseCommonProps
|
|
104
106
|
};
|
|
105
107
|
actionsBases = [replaceElementActionBase];
|
|
@@ -110,6 +112,7 @@ const processSelectedElement = (
|
|
|
110
112
|
insertionIndex: 0,
|
|
111
113
|
stylesOverrides,
|
|
112
114
|
isSiblingReplacement: true,
|
|
115
|
+
adCategories: [CRYPTO_CATEGORY_NAME],
|
|
113
116
|
wrapperStyle: { display: 'contents' }
|
|
114
117
|
};
|
|
115
118
|
|
|
@@ -124,6 +127,7 @@ const processSelectedElement = (
|
|
|
124
127
|
type: AdActionType.ReplaceAllChildren,
|
|
125
128
|
parent: banner,
|
|
126
129
|
stylesOverrides,
|
|
130
|
+
adCategories: [CRYPTO_CATEGORY_NAME],
|
|
127
131
|
wrapperStyle: { display: 'contents' }
|
|
128
132
|
};
|
|
129
133
|
actionsBases = [replaceAllChildrenActionBase];
|
package/src/ads-configuration.ts
CHANGED
|
@@ -7,12 +7,24 @@ interface IAdsConfiguration {
|
|
|
7
7
|
swapTkeyUrl: string;
|
|
8
8
|
externalAdsActivityMessageType: string;
|
|
9
9
|
personaIframePath: string;
|
|
10
|
-
getAdsStackIframeURL: (
|
|
10
|
+
getAdsStackIframeURL: (
|
|
11
|
+
id: string,
|
|
12
|
+
adsMetadataIds: (number | AdMetadata)[],
|
|
13
|
+
origin: string,
|
|
14
|
+
adCategories: string[]
|
|
15
|
+
) => string;
|
|
11
16
|
buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
|
|
12
17
|
bannerAdsMeta: AdMetadata[];
|
|
13
18
|
extVersion: string;
|
|
14
19
|
templePassphrase: string;
|
|
15
20
|
isMisesBrowser: boolean;
|
|
21
|
+
pickNextAdMetadata: (
|
|
22
|
+
allAdsMetadata: AdMetadata[],
|
|
23
|
+
currentAdMetadata: AdMetadata | undefined,
|
|
24
|
+
validAdsCounter: number,
|
|
25
|
+
pageHasPlacesRules: boolean,
|
|
26
|
+
adCategories: string[]
|
|
27
|
+
) => AdMetadata | undefined;
|
|
16
28
|
}
|
|
17
29
|
|
|
18
30
|
export class AdsConfiguration {
|
|
@@ -25,6 +37,7 @@ export class AdsConfiguration {
|
|
|
25
37
|
static personaIframePath: IAdsConfiguration['personaIframePath'] = '';
|
|
26
38
|
static getAdsStackIframeURL: IAdsConfiguration['getAdsStackIframeURL'] = () => '';
|
|
27
39
|
static buildNativeAdsMeta: IAdsConfiguration['buildNativeAdsMeta'] = () => [];
|
|
40
|
+
static pickNextAdMetadata: IAdsConfiguration['pickNextAdMetadata'] = () => undefined;
|
|
28
41
|
static bannerAdsMeta: AdMetadata[] = [];
|
|
29
42
|
static EXTENSION_VERSION: string | undefined;
|
|
30
43
|
static TEMPLE_PASSPHRASE: string;
|
|
@@ -43,7 +56,8 @@ export const configureAds = (config: IAdsConfiguration) => {
|
|
|
43
56
|
bannerAdsMeta,
|
|
44
57
|
extVersion,
|
|
45
58
|
templePassphrase,
|
|
46
|
-
isMisesBrowser
|
|
59
|
+
isMisesBrowser,
|
|
60
|
+
pickNextAdMetadata
|
|
47
61
|
} = config;
|
|
48
62
|
|
|
49
63
|
if (smallTkeyInpageAdUrl) {
|
|
@@ -57,6 +71,7 @@ export const configureAds = (config: IAdsConfiguration) => {
|
|
|
57
71
|
AdsConfiguration.personaIframePath = personaIframePath;
|
|
58
72
|
AdsConfiguration.getAdsStackIframeURL = getAdsStackIframeURL;
|
|
59
73
|
AdsConfiguration.buildNativeAdsMeta = buildNativeAdsMeta;
|
|
74
|
+
AdsConfiguration.pickNextAdMetadata = pickNextAdMetadata;
|
|
60
75
|
AdsConfiguration.bannerAdsMeta = bannerAdsMeta;
|
|
61
76
|
AdsConfiguration.EXTENSION_VERSION = extVersion;
|
|
62
77
|
AdsConfiguration.TEMPLE_PASSPHRASE = templePassphrase;
|
|
@@ -40,7 +40,8 @@ const processInsertAdActionOnce = async (
|
|
|
40
40
|
wrapperType,
|
|
41
41
|
originalHeight,
|
|
42
42
|
originalWidth,
|
|
43
|
-
shouldUseBlurredBackground
|
|
43
|
+
shouldUseBlurredBackground,
|
|
44
|
+
adCategories
|
|
44
45
|
} = action;
|
|
45
46
|
|
|
46
47
|
stylesOverrides.sort((a, b) => a.parentDepth - b.parentDepth);
|
|
@@ -50,7 +51,7 @@ const processInsertAdActionOnce = async (
|
|
|
50
51
|
const adId = nanoid();
|
|
51
52
|
const adElement = document.createElement('iframe');
|
|
52
53
|
adElement.loading = 'lazy';
|
|
53
|
-
adElement.src = AdsConfiguration.getAdsStackIframeURL(adId, adsMetadata, window.location.href);
|
|
54
|
+
adElement.src = AdsConfiguration.getAdsStackIframeURL(adId, adsMetadata, window.location.href, adCategories);
|
|
54
55
|
adElement.id = adId;
|
|
55
56
|
adElement.allow = IFRAME_ALLOWANCE;
|
|
56
57
|
const firstAdMetadataOrId = adsMetadata[0];
|
package/src/render-ads-stack.ts
CHANGED
|
@@ -10,59 +10,170 @@ import {
|
|
|
10
10
|
import { makeAdsTwView, makeExtensionIframeView, makeTKeyAdView } from './execute-ads-actions/ads-views';
|
|
11
11
|
import { overrideElementStyles } from './execute-ads-actions/override-element-styles';
|
|
12
12
|
import { AdView, CreativeSet } from './types/ad-view';
|
|
13
|
-
import { AdMetadata } from './types/ads-meta';
|
|
13
|
+
import { AdMetadata, AdSource } from './types/ads-meta';
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
class AdsStack {
|
|
16
|
+
private wasReady = false;
|
|
17
|
+
private messageListener: ((event: MessageEvent<any>) => void) | undefined;
|
|
18
|
+
private responseTimeout: NodeJS.Timeout | undefined;
|
|
19
|
+
private rootElement: HTMLElement = document.getElementById('root')!;
|
|
20
|
+
private validAdsCounter = 0;
|
|
21
|
+
private readonly adsMetadata: AdMetadata[];
|
|
22
|
+
private currentAdMetadata: AdMetadata | undefined;
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
constructor(
|
|
25
|
+
private readonly id: string,
|
|
26
|
+
initialAdsMetadata: (number | AdMetadata)[],
|
|
27
|
+
private readonly origin: string,
|
|
28
|
+
private readonly pageHasPlacesRules: boolean,
|
|
29
|
+
private readonly adCategories: string[],
|
|
30
|
+
private readonly hypelabBlacklistedCampaignsSlugs: string[]
|
|
31
|
+
) {
|
|
32
|
+
this.adsMetadata = initialAdsMetadata.map(adMetadataOrId =>
|
|
33
|
+
typeof adMetadataOrId === 'number' ? AdsConfiguration.bannerAdsMeta[adMetadataOrId] : adMetadataOrId
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
startRendering() {
|
|
38
|
+
if (this.adsMetadata.length === 0) {
|
|
39
|
+
this.broadcastNoMoreAds();
|
|
40
|
+
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
this.currentAdMetadata = AdsConfiguration.pickNextAdMetadata(
|
|
45
|
+
this.adsMetadata,
|
|
46
|
+
this.currentAdMetadata,
|
|
47
|
+
this.validAdsCounter,
|
|
48
|
+
this.pageHasPlacesRules,
|
|
49
|
+
this.adCategories
|
|
50
|
+
);
|
|
51
|
+
const adMetadata = this.currentAdMetadata;
|
|
52
|
+
|
|
53
|
+
if (!adMetadata) {
|
|
54
|
+
this.broadcastNoMoreAds();
|
|
55
|
+
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.broadcastMessage({ id: this.id, type: AD_RENDER_START_MESSAGE_TYPE, adMetadata: this.currentAdMetadata });
|
|
60
|
+
|
|
61
|
+
const { element, creativeSet: initialCreativeSet } = this.placeNewAd(adMetadata);
|
|
62
|
+
|
|
63
|
+
if (element instanceof HTMLIFrameElement) {
|
|
64
|
+
this.listenToIframeMessages(element, adMetadata);
|
|
65
|
+
} else {
|
|
66
|
+
this.handleValidAd({ ad: { creative_set: initialCreativeSet } });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private listenToIframeMessages(element: HTMLIFrameElement, adMetadata: AdMetadata) {
|
|
71
|
+
const nextAdMetadata = AdsConfiguration.pickNextAdMetadata(
|
|
72
|
+
this.adsMetadata,
|
|
73
|
+
adMetadata,
|
|
74
|
+
this.validAdsCounter,
|
|
75
|
+
this.pageHasPlacesRules,
|
|
76
|
+
this.adCategories
|
|
77
|
+
);
|
|
78
|
+
this.responseTimeout = setTimeout(
|
|
79
|
+
() => {
|
|
80
|
+
console.error(`Timeout exceeded for ${this.id}, ad source: ${JSON.stringify(adMetadata.source)}`);
|
|
81
|
+
this.handleInvalidAd();
|
|
82
|
+
},
|
|
83
|
+
(nextAdMetadata ? 10_000 : 20_000) * (AdsConfiguration.IS_MISES_BROWSER ? 2 : 1)
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
this.messageListener = (event: MessageEvent<any>) => {
|
|
87
|
+
if (event.source !== element.contentWindow) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
|
|
93
|
+
|
|
94
|
+
switch (data.type) {
|
|
95
|
+
case AD_READY_MESSAGE_TYPE:
|
|
96
|
+
if (
|
|
97
|
+
adMetadata.source.providerName === 'HypeLab' &&
|
|
98
|
+
this.hypelabBlacklistedCampaignsSlugs.includes(data.ad?.campaign_slug) &&
|
|
99
|
+
nextAdMetadata
|
|
100
|
+
) {
|
|
101
|
+
this.handleInvalidAd();
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.handleValidAd(data);
|
|
106
|
+
break;
|
|
107
|
+
case AD_ERROR_MESSAGE_TYPE:
|
|
108
|
+
if (!this.wasReady) {
|
|
109
|
+
this.handleInvalidAd();
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case AD_RESIZE_MESSAGE_TYPE:
|
|
113
|
+
const { width, height } = data;
|
|
114
|
+
if (width > 0 && height > 0) {
|
|
115
|
+
if (adMetadata.source.native) {
|
|
116
|
+
element.style.height = `${height}px`;
|
|
117
|
+
} else {
|
|
118
|
+
extendOrKeepDimension(element, 'width', width);
|
|
119
|
+
extendOrKeepDimension(element, 'height', height);
|
|
120
|
+
}
|
|
121
|
+
this.broadcastMessage({ ...data, id: this.id });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} catch (error) {
|
|
125
|
+
console.error('Message handling error:', error);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
window.addEventListener('message', this.messageListener);
|
|
130
|
+
}
|
|
29
131
|
|
|
30
|
-
|
|
132
|
+
private handleInvalidAd() {
|
|
133
|
+
this.removeMessageListener();
|
|
134
|
+
this.clearResponseTimeout();
|
|
135
|
+
this.startRendering();
|
|
136
|
+
this.validAdsCounter = 0;
|
|
31
137
|
}
|
|
32
138
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
document.body.style.backgroundColor = adMetadata.source.native ? 'transparent' : '#F2F2F2';
|
|
39
|
-
|
|
40
|
-
const { source, dimensions } = adMetadata;
|
|
41
|
-
let adView: AdView;
|
|
42
|
-
switch (source.providerName) {
|
|
43
|
-
case 'Temple':
|
|
44
|
-
adView = makeTKeyAdView(dimensions.width, dimensions.height, source.native);
|
|
45
|
-
break;
|
|
46
|
-
case 'HypeLab':
|
|
47
|
-
case 'SmartyAds':
|
|
48
|
-
adView = makeAdsTwView(adId, source, dimensions, origin);
|
|
49
|
-
break;
|
|
50
|
-
default:
|
|
51
|
-
adView = makeExtensionIframeView(adId, source, dimensions);
|
|
139
|
+
private removeMessageListener() {
|
|
140
|
+
if (!this.messageListener) return;
|
|
141
|
+
|
|
142
|
+
window.removeEventListener('message', this.messageListener);
|
|
143
|
+
this.messageListener = undefined;
|
|
52
144
|
}
|
|
53
145
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
146
|
+
private placeNewAd(adMetadata: AdMetadata) {
|
|
147
|
+
document.body.style.backgroundColor = adMetadata.source.native ? 'transparent' : '#F2F2F2';
|
|
148
|
+
|
|
149
|
+
const { source, dimensions } = adMetadata;
|
|
150
|
+
let adView: AdView;
|
|
151
|
+
switch (source.providerName) {
|
|
152
|
+
case 'Temple':
|
|
153
|
+
adView = makeTKeyAdView(dimensions.width, dimensions.height, source.native);
|
|
154
|
+
break;
|
|
155
|
+
case 'HypeLab':
|
|
156
|
+
case 'SmartyAds':
|
|
157
|
+
adView = makeAdsTwView(this.id, source, dimensions, this.origin);
|
|
158
|
+
break;
|
|
159
|
+
default:
|
|
160
|
+
adView = makeExtensionIframeView(this.id, source, dimensions);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const { element } = adView;
|
|
164
|
+
const templeLabelElement = document.getElementById('temple-label')!;
|
|
165
|
+
this.rootElement.replaceChildren(element);
|
|
58
166
|
|
|
59
|
-
|
|
60
|
-
|
|
167
|
+
if (!source.native) templeLabelElement.setAttribute('active', '');
|
|
168
|
+
else templeLabelElement.removeAttribute('active');
|
|
61
169
|
|
|
62
|
-
|
|
170
|
+
return adView;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private updateBackground(source: AdSource, creativeSet: CreativeSet = {}) {
|
|
63
174
|
const prevBackgroundElement = document.getElementById(BACKGROUND_ELEMENT_ID);
|
|
64
175
|
if (source.native && prevBackgroundElement) {
|
|
65
|
-
rootElement.removeChild(prevBackgroundElement);
|
|
176
|
+
this.rootElement.removeChild(prevBackgroundElement);
|
|
66
177
|
}
|
|
67
178
|
|
|
68
179
|
if (source.native) {
|
|
@@ -87,7 +198,7 @@ export const renderAdsStack = async (
|
|
|
87
198
|
}
|
|
88
199
|
|
|
89
200
|
if (!backgroundElement && prevBackgroundElement) {
|
|
90
|
-
rootElement.removeChild(prevBackgroundElement);
|
|
201
|
+
this.rootElement.removeChild(prevBackgroundElement);
|
|
91
202
|
}
|
|
92
203
|
|
|
93
204
|
if (!backgroundElement) return;
|
|
@@ -106,76 +217,71 @@ export const renderAdsStack = async (
|
|
|
106
217
|
filter: 'blur(12px)'
|
|
107
218
|
});
|
|
108
219
|
if (prevBackgroundElement) {
|
|
109
|
-
rootElement.replaceChild(backgroundElement, prevBackgroundElement);
|
|
220
|
+
this.rootElement.replaceChild(backgroundElement, prevBackgroundElement);
|
|
110
221
|
} else {
|
|
111
|
-
rootElement.prepend(backgroundElement);
|
|
222
|
+
this.rootElement.prepend(backgroundElement);
|
|
112
223
|
}
|
|
113
224
|
} catch (e) {
|
|
114
225
|
console.error(e);
|
|
115
226
|
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (element instanceof HTMLIFrameElement) {
|
|
119
|
-
return new Promise<void>((resolve, reject) => {
|
|
120
|
-
const responseTimeout = setTimeout(
|
|
121
|
-
() => {
|
|
122
|
-
window.removeEventListener('message', messageListener);
|
|
123
|
-
reject(new Error(`Timeout exceeded for ${adId}, ad source: ${JSON.stringify(source)}`));
|
|
124
|
-
},
|
|
125
|
-
(rest.length === 0 ? 20_000 : 10_000) * (AdsConfiguration.IS_MISES_BROWSER ? 2 : 1)
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
let wasReady = false;
|
|
129
|
-
const messageListener = (event: MessageEvent<any>) => {
|
|
130
|
-
if (event.source !== element.contentWindow) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
227
|
+
}
|
|
133
228
|
|
|
134
|
-
|
|
135
|
-
|
|
229
|
+
private broadcastMessage(content: unknown) {
|
|
230
|
+
window.parent.postMessage(JSON.stringify(content), '*');
|
|
231
|
+
}
|
|
136
232
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
wasReady = true;
|
|
141
|
-
broadcastMessage({ id: adId, type: AD_READY_MESSAGE_TYPE, adMetadata });
|
|
142
|
-
clearTimeout(responseTimeout);
|
|
143
|
-
resolve();
|
|
144
|
-
}
|
|
145
|
-
updateBackground(data.ad?.creative_set);
|
|
146
|
-
break;
|
|
147
|
-
case AD_ERROR_MESSAGE_TYPE:
|
|
148
|
-
if (!wasReady) {
|
|
149
|
-
window.removeEventListener('message', messageListener);
|
|
150
|
-
clearTimeout(responseTimeout);
|
|
151
|
-
reject(new Error(data.reason ?? 'Unknown error'));
|
|
152
|
-
}
|
|
153
|
-
break;
|
|
154
|
-
case AD_RESIZE_MESSAGE_TYPE:
|
|
155
|
-
const { width, height } = data;
|
|
156
|
-
if (width > 0 && height > 0) {
|
|
157
|
-
if (adMetadata.source.native) {
|
|
158
|
-
element.style.height = `${height}px`;
|
|
159
|
-
} else {
|
|
160
|
-
extendOrKeepDimension(element, 'width', width);
|
|
161
|
-
extendOrKeepDimension(element, 'height', height);
|
|
162
|
-
}
|
|
163
|
-
broadcastMessage({ ...data, id: adId });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
} catch (error) {
|
|
167
|
-
console.error('Observing error:', error);
|
|
168
|
-
}
|
|
169
|
-
};
|
|
233
|
+
private broadcastNoMoreAds() {
|
|
234
|
+
this.broadcastMessage({ id: this.id, type: AD_ERROR_MESSAGE_TYPE, reason: 'No more ads to render' });
|
|
235
|
+
}
|
|
170
236
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
237
|
+
private clearResponseTimeout() {
|
|
238
|
+
if (this.responseTimeout !== undefined) {
|
|
239
|
+
clearTimeout(this.responseTimeout);
|
|
240
|
+
this.responseTimeout = undefined;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
private handleValidAd(data: any) {
|
|
245
|
+
const adMetadata = this.currentAdMetadata;
|
|
174
246
|
|
|
175
|
-
|
|
176
|
-
|
|
247
|
+
if (!adMetadata) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (!this.wasReady) {
|
|
252
|
+
this.wasReady = true;
|
|
253
|
+
this.broadcastMessage({ id: this.id, type: AD_READY_MESSAGE_TYPE, adMetadata });
|
|
254
|
+
}
|
|
255
|
+
this.validAdsCounter++;
|
|
256
|
+
this.clearResponseTimeout();
|
|
257
|
+
this.updateBackground(adMetadata.source, data.ad?.creative_set);
|
|
177
258
|
}
|
|
259
|
+
}
|
|
178
260
|
|
|
179
|
-
|
|
180
|
-
|
|
261
|
+
/**
|
|
262
|
+
* Tries to render specified ads one-by-one until one of them is loaded or loading of all of them failed. Use it
|
|
263
|
+
* in a dedicated iframe. Sends messages to the parent window on an attempt to render an ad, on successful rendering,
|
|
264
|
+
* on ad resize, and on error.
|
|
265
|
+
*/
|
|
266
|
+
export const renderAdsStack = (
|
|
267
|
+
adId: string,
|
|
268
|
+
adsMetadata: (number | AdMetadata)[],
|
|
269
|
+
origin: string,
|
|
270
|
+
pageHasPlacesRules = false,
|
|
271
|
+
adCategories: string[],
|
|
272
|
+
hypelabBlacklistedCampaignsSlugs: string[]
|
|
273
|
+
) => {
|
|
274
|
+
try {
|
|
275
|
+
const adsStack = new AdsStack(
|
|
276
|
+
adId,
|
|
277
|
+
adsMetadata,
|
|
278
|
+
origin,
|
|
279
|
+
pageHasPlacesRules,
|
|
280
|
+
adCategories,
|
|
281
|
+
hypelabBlacklistedCampaignsSlugs
|
|
282
|
+
);
|
|
283
|
+
adsStack.startRendering();
|
|
284
|
+
} catch (error) {
|
|
285
|
+
console.error('Error while rendering ads stack:', error);
|
|
286
|
+
}
|
|
181
287
|
};
|
package/src/temple-wallet-api.ts
CHANGED
|
@@ -86,6 +86,10 @@ export class TempleWalletApi {
|
|
|
86
86
|
)
|
|
87
87
|
);
|
|
88
88
|
|
|
89
|
+
getBlacklistedHypelabCampaignsSlugs = withFetchDataExtraction(() =>
|
|
90
|
+
this.api.get<string[]>('/temple-wallet-ads/hypelab-campaigns-blacklist')
|
|
91
|
+
);
|
|
92
|
+
|
|
89
93
|
getAllRules = async (): Promise<RawAllAdsRules> => {
|
|
90
94
|
const [
|
|
91
95
|
adPlacesRulesForAllDomains,
|
|
@@ -97,7 +101,8 @@ export class TempleWalletApi {
|
|
|
97
101
|
adsReplaceUrlsBlacklist,
|
|
98
102
|
providersNegativeSelectors,
|
|
99
103
|
elementsToHideOrRemoveRules,
|
|
100
|
-
providersCategories
|
|
104
|
+
providersCategories,
|
|
105
|
+
blacklistedHypelabCampaignsSlugs
|
|
101
106
|
] = await Promise.all([
|
|
102
107
|
this.getAdPlacesRulesForAllDomains(),
|
|
103
108
|
this.getProvidersRulesForAllDomains(),
|
|
@@ -108,7 +113,8 @@ export class TempleWalletApi {
|
|
|
108
113
|
this.getAdsReplaceUrlsBlacklist(),
|
|
109
114
|
this.getNegativeSelectorsForAllProviders(),
|
|
110
115
|
this.getElementsToHideOrRemoveRules(),
|
|
111
|
-
this.getProvidersCategories()
|
|
116
|
+
this.getProvidersCategories(),
|
|
117
|
+
this.getBlacklistedHypelabCampaignsSlugs()
|
|
112
118
|
]);
|
|
113
119
|
|
|
114
120
|
return {
|
|
@@ -122,6 +128,7 @@ export class TempleWalletApi {
|
|
|
122
128
|
providersNegativeSelectors,
|
|
123
129
|
elementsToHideOrRemoveRules,
|
|
124
130
|
providersCategories,
|
|
131
|
+
blacklistedHypelabCampaignsSlugs,
|
|
125
132
|
timestamp: Date.now()
|
|
126
133
|
};
|
|
127
134
|
};
|
|
@@ -5,7 +5,7 @@ import { RawAllAdsRules, RawPermanentAdPlacesRule } from 'src/types/temple-walle
|
|
|
5
5
|
|
|
6
6
|
import { CRYPTO_CATEGORY_NAME } from './constants';
|
|
7
7
|
|
|
8
|
-
export const transformRawRules = (
|
|
8
|
+
export const transformRawRules = (locationOrHref: Location | string, rules: RawAllAdsRules): AdsRules => {
|
|
9
9
|
const {
|
|
10
10
|
adPlacesRulesForAllDomains,
|
|
11
11
|
providersRulesForAllDomains,
|
|
@@ -17,9 +17,11 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
|
|
|
17
17
|
adsReplaceUrlsBlacklist = [],
|
|
18
18
|
elementsToHideOrRemoveRules = {},
|
|
19
19
|
providersCategories = {},
|
|
20
|
+
blacklistedHypelabCampaignsSlugs = [],
|
|
20
21
|
timestamp
|
|
21
22
|
} = rules;
|
|
22
|
-
const
|
|
23
|
+
const href = typeof locationOrHref === 'string' ? locationOrHref : locationOrHref.href;
|
|
24
|
+
const { hostname } = new URL(href);
|
|
23
25
|
|
|
24
26
|
if (adsReplaceUrlsBlacklist.some(regex => new RegExp(regex).test(href))) {
|
|
25
27
|
return {
|
|
@@ -28,6 +30,7 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
|
|
|
28
30
|
providersSelectors: [],
|
|
29
31
|
providersNegativeSelectors: [],
|
|
30
32
|
elementsToHideOrRemoveRules: [],
|
|
33
|
+
blacklistedHypelabCampaignsSlugs,
|
|
31
34
|
timestamp
|
|
32
35
|
};
|
|
33
36
|
}
|
|
@@ -69,6 +72,7 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
|
|
|
69
72
|
hrefMatchPredicate,
|
|
70
73
|
elementsToHideOrRemoveRules
|
|
71
74
|
),
|
|
75
|
+
blacklistedHypelabCampaignsSlugs,
|
|
72
76
|
timestamp
|
|
73
77
|
};
|
|
74
78
|
};
|
package/src/types/ads-actions.ts
CHANGED
package/src/types/ads-rules.ts
CHANGED
|
@@ -20,5 +20,6 @@ export interface AdsRules {
|
|
|
20
20
|
providersSelectors: Array<{ selector: string; parentDepth: number; categories: string[] }>;
|
|
21
21
|
providersNegativeSelectors: Array<{ selector: string; parentDepth: number }>;
|
|
22
22
|
elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
|
|
23
|
+
blacklistedHypelabCampaignsSlugs: string[];
|
|
23
24
|
timestamp: number;
|
|
24
25
|
}
|
|
@@ -74,5 +74,6 @@ export interface RawAllAdsRules {
|
|
|
74
74
|
permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
|
|
75
75
|
adsReplaceUrlsBlacklist: string[];
|
|
76
76
|
elementsToHideOrRemoveRules: Record<string, RawElementsToHideOrRemoveEntry[]>;
|
|
77
|
+
blacklistedHypelabCampaignsSlugs: string[];
|
|
77
78
|
timestamp: number;
|
|
78
79
|
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export const stripDimentionsLimits = (wrapperElement: HTMLDivElement, width: number, height: number) => {
|
|
2
|
-
const predefinedStyles = wrapperElement.style;
|
|
3
|
-
// If needed in future, try `getComputedStyle(wrapperElement)` - though would have to not remove but override
|
|
4
|
-
|
|
5
|
-
stripOneDimensionLimit(predefinedStyles, width, ['width']);
|
|
6
|
-
stripOneDimensionLimit(predefinedStyles, height, ['height', 'maxHeight']);
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const stripOneDimensionLimit = (
|
|
10
|
-
predefinedStyles: CSSStyleDeclaration,
|
|
11
|
-
value: number,
|
|
12
|
-
dimensionNames: ('width' | 'height' | 'maxWidth' | 'maxHeight')[]
|
|
13
|
-
) => {
|
|
14
|
-
for (const dimensionName of dimensionNames) {
|
|
15
|
-
const predefinedStyleValue = predefinedStyles[dimensionName] ?? '';
|
|
16
|
-
|
|
17
|
-
if (/^\d+(px)?$/.test(predefinedStyleValue)) {
|
|
18
|
-
const predefinedSize = parseInt(predefinedStyleValue, 10);
|
|
19
|
-
if (predefinedSize < value) {
|
|
20
|
-
predefinedStyles.removeProperty(dimensionName);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
};
|