@magield/collectors 0.6.1 → 0.8.2
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/behavior/recorder.d.ts +33 -0
- package/dist/behavior/recorder.js +303 -1
- package/dist/hash.d.ts +15 -0
- package/dist/hash.js +27 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -1
- package/dist/native.d.ts +39 -0
- package/dist/native.js +142 -1
- package/dist/registry.d.ts +57 -0
- package/dist/registry.js +108 -1
- package/dist/run.d.ts +10 -0
- package/dist/run.js +128 -1
- package/dist/signals/adblock.d.ts +2 -0
- package/dist/signals/adblock.js +135 -1
- package/dist/signals/apps.d.ts +2 -0
- package/dist/signals/apps.js +191 -1
- package/dist/signals/audio.d.ts +16 -0
- package/dist/signals/audio.js +63 -1
- package/dist/signals/automation.d.ts +2 -0
- package/dist/signals/automation.js +346 -1
- package/dist/signals/behavior.d.ts +17 -0
- package/dist/signals/behavior.js +31 -1
- package/dist/signals/capabilities.d.ts +2 -0
- package/dist/signals/capabilities.js +235 -1
- package/dist/signals/devices.d.ts +2 -0
- package/dist/signals/devices.js +119 -1
- package/dist/signals/display.d.ts +2 -0
- package/dist/signals/display.js +101 -1
- package/dist/signals/errors.d.ts +2 -0
- package/dist/signals/errors.js +84 -1
- package/dist/signals/features.d.ts +2 -0
- package/dist/signals/features.js +951 -1
- package/dist/signals/fonts.d.ts +2 -0
- package/dist/signals/fonts.js +128 -1
- package/dist/signals/integrity.d.ts +2 -0
- package/dist/signals/integrity.js +216 -1
- package/dist/signals/math.d.ts +2 -0
- package/dist/signals/math.js +43 -1
- package/dist/signals/navigator.d.ts +10 -0
- package/dist/signals/navigator.js +81 -1
- package/dist/signals/pointer.d.ts +2 -0
- package/dist/signals/pointer.js +93 -1
- package/dist/signals/render.d.ts +12 -0
- package/dist/signals/render.js +214 -1
- package/dist/signals/screen.d.ts +9 -0
- package/dist/signals/screen.js +80 -1
- package/dist/signals/storage.d.ts +33 -0
- package/dist/signals/storage.js +100 -1
- package/dist/signals/timezone.d.ts +9 -0
- package/dist/signals/timezone.js +63 -1
- package/dist/signals/webrtc.d.ts +2 -0
- package/dist/signals/webrtc.js +168 -1
- package/dist/stable-core.d.ts +128 -0
- package/dist/stable-core.js +187 -1
- package/dist/types.d.ts +54 -0
- package/dist/types.js +15 -1
- package/package.json +2 -1
package/dist/native.js
CHANGED
|
@@ -1 +1,142 @@
|
|
|
1
|
-
(function(T,U){const S={T:0x116,U:0x111,h:'79Tb',u:0x123,I:0x111,i:0x29f,R:'cFqG',Z:0x27e,c:0x280,w:0x292,P:0x195,N:0x157,a:'$md9',C0:0x196,C1:0x16f,C2:0xa4,C3:0xb7,C4:0xb6,C5:'@x!%',C6:0xbf,C7:0xc6,C8:0x10b,C9:0xe2,CC:'c[T8',CD:0xdc,CF:0x23f,Cb:'6rAj',CT:0x268,CU:0x250,Ch:0x28f,Cu:0xc5,CI:0xac,Ci:0xc7,CR:0xc2,CZ:'JLD4',CO:0xce,CE:0xb5,Cz:0xcf,Cp:0x141,Cv:0x177,CK:'oocf',CY:0x145,CA:0x160,CX:0x289,CG:'vDsc',Cr:0x2ae,Cn:0x2d8,Cg:0x2c4,Cq:0xc9,Ck:'*#nK',Ce:0xcd,Cy:0xd8,Cs:0xc9},L={T:0x321},H={T:0x391},J={T:0x169},l={T:0x2dd},W={T:0x85},h=T();function E(T,U,h,u,I){return b(h-W.T,U);}function p(T,U,h,u,I){return b(h- -l.T,u);}function v(T,U,h,u,I){return b(h- -J.T,U);}function z(T,U,h,u,I){return b(I- -H.T,h);}function O(T,U,h,u,I){return b(u- -L.T,h);}while(!![]){try{const u=parseInt(O(-S.T,-S.U,S.h,-S.u,-S.I))/(0x831*0x3+0x10d9*-0x2+0x4*0x248)+-parseInt(E(S.i,S.R,S.Z,S.c,S.w))/(0x2*-0x1169+-0x119*-0x1+-0x37*-0x9d)*(parseInt(z(-S.P,-S.N,S.a,-S.C0,-S.C1))/(0x21fa+-0x85+0xb26*-0x3))+-parseInt(p(-S.C2,-S.C3,-S.C4,S.C5,-S.C6))/(0xb1d*-0x3+-0x1*-0x673+0x1ae8)*(parseInt(p(-S.C7,-S.C8,-S.C9,S.CC,-S.CD))/(-0x1559+-0x101e+0x12be*0x2))+parseInt(E(S.CF,S.Cb,S.CT,S.CU,S.Ch))/(0x2175+0x904+0x1*-0x2a73)+parseInt(p(-S.Cu,-S.CI,-S.Ci,S.a,-S.CR))/(0x4b8+0xb64+-0x17*0xb3)+-parseInt(v(S.C2,S.CZ,S.CO,S.CE,S.Cz))/(-0x1d90+-0x3d*0x2+-0xa06*-0x3)*(parseInt(z(-S.Cp,-S.Cv,S.CK,-S.CY,-S.CA))/(-0x5*-0x112+-0x4d*-0x22+-0xf8b*0x1))+-parseInt(E(S.CX,S.CG,S.Cr,S.Cn,S.Cg))/(0x1f01+0xa*0x2cb+-0x3ae5)*(-parseInt(v(S.Cq,S.Ck,S.Ce,S.Cy,S.Cs))/(-0xfb*0x3+0x2462*0x1+-0x2166));if(u===U)break;else h['push'](h['shift']());}catch(I){h['push'](h['shift']());}}}(F,0x128235+-0x1186d5*0x1+0x2ea5f*0x3));const D=(function(){let T=!![];return function(U,h){const w={T:0x202,U:0x20a,h:0x1fd,u:'c]AF',I:0x22b},u=T?function(){const c={T:0x9};function K(T,U,h,u,I){return b(U- -c.T,u);}if(h){const I=h[K(w.T,w.U,w.h,w.u,w.I)](U,arguments);return h=null,I;}}:function(){};return T=![],u;};}()),C=D(this,function(){const C6={T:'GT*R',U:0x2c1,h:0x296,u:0x2cc,I:0x2b1,i:'%vw(',R:0x2d6,Z:0x2f5,C7:0x2e4,C8:0x2ec,C9:'9(ux',CC:0x2b4,CD:0x2b7,CF:0x2cf,Cb:0x2cc,CT:0x615,CU:0x5d8,Ch:'mJoY',Cu:0x5f7,CI:0x606,Ci:0x5f1,CR:0x5fd,CZ:']C[D',CO:0x5ed,CE:0x5cd,Cz:0x5ed,Cp:0x623,Cv:'9[wx',CK:0x604,CY:0x5fe,CA:0x5fe,CX:0x5af,CG:'*#nK',Cr:0x5d4,Cn:0x5e2,Cg:']eS(',Cq:0x2ce,Ck:0x2cb,Ce:0x2bf,Cy:'3s(1',Cs:0x2fe,CM:0x2d3,Cm:0x324,CB:0x324,Cj:0x35,Cx:0x24,Cd:0x4c,CQ:'x3AD',Co:0x1a,Cf:0x33d,Ct:0x33a,CV:0x366,CW:0x312,Cl:']C[D',CJ:0x331,CH:0x34d,CL:0x342,CS:0x31c,Cc:'%vw(',Cw:0x5f1,CP:0x622,CN:'SwHE',Ca:0x60b,D0:0x61a,D1:'oocf',D2:0x2ec,D3:'oocf',D4:0x2e7,D5:0x2bd,D6:0x2ce,D7:0x313,D8:0x5d7,D9:0x604,DC:'%nf]',DD:0x5f5,DF:0x5e8,Db:0x1ae,DT:0x1c1,DU:0x1cd,Dh:0x1ad,Du:0x1b9,DI:0x1d7,Di:'5(ae',DR:0x1b8,DZ:0x19d,DO:0x5d3,DE:0x5fb,Dz:'B@X]',Dp:0x5e9,Dv:0x5f9},C5={T:0xcb},C4={T:0x3dc},C3={T:0x11a},C2={T:0x3bd},C0={T:0x21c},U={};function X(T,U,h,u,I){return b(T- -C0.T,u);}U[Y(C6.T,C6.U,C6.h,C6.u,C6.I)]=function(u,I){return u!==I;};function G(T,U,h,u,I){return b(T- -C2.T,h);}U[Y(C6.i,C6.R,C6.Z,C6.C7,C6.C8)]=Y(C6.C9,C6.CC,C6.CD,C6.CF,C6.Cb)+A(C6.CT,C6.CU,C6.Ch,C6.Cu,C6.CI)+'+$';const h=U;function r(T,U,h,u,I){return b(T-C3.T,I);}function A(T,U,h,u,I){return b(u-C4.T,h);}function Y(T,U,h,u,I){return b(U-C5.T,T);}if(h[A(C6.Ci,C6.CR,C6.CZ,C6.CO,C6.CE)](C[A(C6.Cz,C6.Cp,C6.Cv,C6.CK,C6.CY)]()[A(C6.CA,C6.CX,C6.CG,C6.Cr,C6.Cn)+Y(C6.Cg,C6.Cq,C6.Ck,C6.U,C6.Ce)]()[Y(C6.Cy,C6.Cs,C6.CM,C6.Cm,C6.CB)+'Of']('\x0a'),-(0x2301+-0x3*0x881+-0x97d)))return;return C[X(-C6.Cj,-C6.Cx,-C6.Cd,C6.CQ,-C6.Co)+r(C6.Cf,C6.Ct,C6.CV,C6.CW,C6.Cl)]()[r(C6.CJ,C6.CH,C6.CL,C6.CS,C6.Cc)+'h'](h[A(C6.Cw,C6.CP,C6.CN,C6.Ca,C6.D0)])[Y(C6.D1,C6.C8,C6.Z,C6.Cq,C6.D2)+Y(C6.D3,C6.D4,C6.D5,C6.D6,C6.D7)]()[A(C6.D8,C6.D9,C6.DC,C6.DD,C6.DF)+G(-C6.Db,-C6.DT,C6.Cg,-C6.DU,-C6.Dh)+'r'](C)[G(-C6.Du,-C6.DI,C6.Di,-C6.DR,-C6.DZ)+'h'](h[A(C6.DO,C6.DE,C6.Dz,C6.Dp,C6.Dv)]);});C();const NATIVE_SOURCE=/^\s*function[\s\w$]*\([^)]*\)\s*\{\s*\[native code\]\s*\}\s*$/;export function isNativeSource(T){const C8={T:0x116,U:'x3AD',h:0x11d,u:0xfe,I:0xed},C7={T:0x134};function n(T,U,h,u,I){return b(u- -C7.T,U);}return NATIVE_SOURCE[n(C8.T,C8.U,C8.h,C8.u,C8.I)](T);}function F(){const Cs=['WPZdOhZdJmo6','hrPiW4RcRYfn','DXJdV8oVra','lf7cJCkZaKXrsCkdWOtdTd8','re7dJmoXqG','i8kvu8kQW4u','W6ngBfmTxfLhW6Xcxmon','E2BcOSoijSoQoq','W7NcM1FdPMW1W7CPsmkowszD','W7tdHaC1W7a','k1BcI8kWaKKGtmkEWPBdQtGb','WRhcJqu','Ah/cLCoqga','W4hcIColWP3dIG','tu7cNCoQmq','C08G','Bmkzwmkx','W6b7xuy','nN7cOq','W4xcR2/dQ8ke','BqDVW5xcHG','lmkcECkkW7m','D8ksD8kquq','WQRcLGerW74','WOecfY5d','kSkqWQyVvW','AgRcMmoldW','z8k7eSoaBG','AhBcNCobhG','WRZdKmo/kwi','W4pdRgxdGLXYWR3dOd0GqCkJWRG','W7RcRMNdG8kD','BNtcL8oweG','WQlcNe/dSmoM','W5fsWR3dP8oL','dbxcLCk2eG','W4xcVHy','hCkSjHfu','WQavlra','lmkTAmkwW4S','wdVdIhRcMbZdMv0cW5mDWRxcMa','W5JcVYlcICok','W4pdO2ddH196WRFdOWKfyCk9WQ4','mmkTWRi','e8kDvqeR','W5ldSmo6dCowmYnFW6nOfSkx','WQOTu28tWRtdVCoM','hmo9WO52W5BdVh0E','ESkvrCkh','ESkktCkSWPyLhCkfuSkBW5JdKCkS','omoApSo5W64','tSkUWQDj','mCoCf8opW4G','WRhdTKtdQ8o9','WQtdVSozl0W','v8oXWRFdTNy','W5RdVNPWra','WP7dO0BdI8kbxmoCAvnehW','nSkdW6VdGa','wr7dMmkpW6u','W6BcImoHWRFdSW','kSkEfmoSW7q','W5hcTKZdTmofomo8la','WPecW7xcV8oLWO0LlYtcGq','WOpdLwJdJmos','qGtcVCklWQa','W6SjWQOqESklbmkWAZ4lmmom','sLBdIL7dUq','W7KQWOyaWRi','pXdcVG3cL2HGiK5rEq','nSkjW4VdGmom','auhcJCoEWQZcLKuSiSkCsCkGWQS','WRWLu0rE','ArRdJSoTwa','amkkW7hdVCo/','fCoNd8kYW4e','wW51W6G','W68VWQZcNbHhWPVcO8oaWP7dQmof','mSkmW7vdna','i8kWEsmy','WOFdPXNcMry','aHrPxrG','EYldLmkQl8oikIfiaq','WR9xW75DjW','dmkypmofW4y','oKtcN8o8dW','WPifWOJdMmooWOuNmW'];F=function(){return Cs;};return F();}export function nameMatchesSource(T,U){const Ch={T:0x36e,U:0x374,h:0x38d,u:'j6#J',I:0x37a,i:0x3eb,R:0x3a4,Z:0x3c7,Cu:'vDsc',CI:0x3de,Ci:0x20a,CR:0x208,CZ:0x224,CO:0x21d,CE:'w#fg',Cz:0x4e,Cp:0x68,Cv:'yG4T',CK:0x4f,CY:0x215,CA:0x229,CX:0x200,CG:0x20e,Cr:'5(ae',Cn:0x372,Cg:0x36c,Cq:0x389,Ck:0x383,Ce:0x411,Cy:0x435,Cs:'5(ae',CM:0x3fb,Cm:0x416,CB:'9[wx',Cj:0x6,Cx:0x31,Cd:0x32,CQ:0xd,Co:0x415,Cf:0x40b,Ct:'c[T8',CV:0x3f8,CW:0x220,Cl:0x24b,CJ:0x23f,CH:0x225,CL:'j6#J',CS:'cFqG',Cc:0x33,Cw:0x2,CP:0x21,CN:0x14},Cb={T:0x8},CF={T:0x201},CD={T:0x19d},CC={T:0x272},C9={T:0x1fe};function q(T,U,h,u,I){return b(I-C9.T,h);}function e(T,U,h,u,I){return b(T- -CC.T,h);}function g(T,U,h,u,I){return b(h-CD.T,u);}function y(T,U,h,u,I){return b(I- -CF.T,T);}function k(T,U,h,u,I){return b(u-Cb.T,I);}const h={'saBaI':function(u,I){return u===I;},'VTiHJ':g(Ch.T,Ch.U,Ch.h,Ch.u,Ch.I)+'\x20','mvCkr':function(u,I){return u(I);}};if(h[g(Ch.i,Ch.R,Ch.Z,Ch.Cu,Ch.CI)](T,'')||T[k(Ch.Ci,Ch.CR,Ch.CZ,Ch.CO,Ch.CE)+e(-Ch.Cz,-Ch.Cp,Ch.Cv,-Ch.Cz,-Ch.CK)](h[k(Ch.CY,Ch.CA,Ch.CX,Ch.CG,Ch.Cr)]))return!![];return new RegExp(g(Ch.Cn,Ch.Cg,Ch.Cq,Ch.Cu,Ch.Ck)+q(Ch.Ce,Ch.Cy,Ch.Cs,Ch.CM,Ch.Cm)+y(Ch.CB,-Ch.Cj,Ch.Cx,Ch.Cd,Ch.CQ)+h[q(Ch.Co,Ch.Cf,Ch.Ct,Ch.CI,Ch.CV)](escapeName,T)+k(Ch.CW,Ch.Cl,Ch.CJ,Ch.CH,Ch.CL))[y(Ch.CS,-Ch.Cc,-Ch.Cw,-Ch.CP,-Ch.CN)](U);}function escapeName(U){const CZ={T:0x335,U:0x337,h:0x30f,u:0x336,I:'9Nx@',i:0x339,R:0x318,Z:0x31d,CO:0x33c,CE:'cFqG',Cz:0x34,Cp:0x3c,Cv:'JLD4',CK:0x34,CY:0x48,CA:0x1da,CX:0x200,CG:0x1fb,Cr:'38oW',Cn:0x1ee},CR={T:0xe},Ci={T:0x1c9},CI={T:0x135},Cu={T:0x1de};function M(T,U,h,u,I){return b(U- -Cu.T,h);}const h={};h[s(CZ.T,CZ.U,CZ.h,CZ.u,CZ.I)]=s(CZ.i,CZ.R,CZ.Z,CZ.CO,CZ.CE);const u=h;function s(T,U,h,u,I){return b(u-CI.T,I);}function m(T,U,h,u,I){return b(U- -Ci.T,h);}function B(T,U,h,u,I){return b(U-CR.T,u);}return U[M(CZ.Cz,CZ.Cp,CZ.Cv,CZ.CK,CZ.CY)+'ce'](/[.*+?^${}()|[\]\\]/g,u[B(CZ.CA,CZ.CX,CZ.CG,CZ.Cr,CZ.Cn)]);}function b(C,D){C=C-(-0x1*-0x1a57+-0x1*-0x25fd+-0x2b7*0x17);const T=F();let U=T[C];if(b['sLzGqA']===undefined){var h=function(R){const Z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let O='',E='',z=O+h,p=(''+function(){return 0xa82+-0x21d4+-0xf*-0x18e;})['indexOf']('\x0a')!==-(0x2*-0xcfa+-0x21d3*0x1+0x3bc8);for(let v=0x106b+-0x32+-0x1039,K,Y,A=-0x1b4*0x2+0xb13+0x97*-0xd;Y=R['charAt'](A++);~Y&&(K=v%(0x1972*0x1+-0x2575+-0xc07*-0x1)?K*(-0x3*-0x9a9+-0xb*-0x1b6+-0x2f8d)+Y:Y,v++%(0x4c+-0xb*-0x185+-0x1*0x10ff))?O+=p||z['charCodeAt'](A+(0x376*0xa+-0x17ab+-0xae7))-(0x10b9+-0x1*0x215e+0x10af)!==0x83f*0x1+0xb34+-0xd*0x17f?String['fromCharCode'](0x26a5+0x514+-0x2aba&K>>(-(0x11a4+0x4c*-0x4+-0x1072*0x1)*v&-0x21fc+-0xb41*0x1+0x1*0x2d43)):v:0x317*-0x1+-0x455*-0x3+0x8*-0x13d){Y=Z['indexOf'](Y);}for(let X=0xebb*-0x1+-0x233a+0x31f5,G=O['length'];X<G;X++){E+='%'+('00'+O['charCodeAt'](X)['toString'](0x3ad+-0x1715+-0x1*-0x1378))['slice'](-(-0x21e9*-0x1+-0x14c3+-0x349*0x4));}return decodeURIComponent(E);};const i=function(R,Z){let O=[],E=0xbe9*-0x1+-0xacf+-0x8*-0x2d7,z,p='';R=h(R);let v;for(v=0x10a1+0xb*-0x2b6+-0xb*-0x133;v<0x277*0x1+-0x17d6+0x165f;v++){O[v]=v;}for(v=0x1bfd*0x1+-0x8af+0x7*-0x2c2;v<-0xa34*0x1+0x267b+0x1*-0x1b47;v++){E=(E+O[v]+Z['charCodeAt'](v%Z['length']))%(0x1*-0x1674+0x5*-0x51f+0x1*0x310f),z=O[v],O[v]=O[E],O[E]=z;}v=0x17*-0x6b+0x1*0x4ac+0x17*0x37,E=0x61*-0x13+0x177*0x6+-0x197;for(let K=0x1*0xced+0xdc9+0x1a*-0x107;K<R['length'];K++){v=(v+(0x1c*-0x13e+-0x25*-0x52+-0x1*-0x16ef))%(0x10b8+-0x1bb2+0xbfa),E=(E+O[v])%(0x220+-0x1*0x509+0x3e9),z=O[v],O[v]=O[E],O[E]=z,p+=String['fromCharCode'](R['charCodeAt'](K)^O[(O[v]+O[E])%(-0x4bb+0x1338+-0xd7d)]);}return p;};b['piiSLU']=i,b['TYKoWm']={},b['sLzGqA']=!![];}const u=T[-0x176f+0x3*0xb1e+-0x1*0x9eb];b['XSzFqE']!==u&&(b['TYKoWm']={},b['XSzFqE']=u);const I=b['TYKoWm'][C];if(I===undefined){if(b['cGSPBs']===undefined){const R=function(Z){this['zJdpzw']=Z,this['cMJTat']=[0x179*0x3+0x2051*-0x1+0x1be7,-0x2549+0x500+0x2049,0x990+0x177a+-0x210a],this['OzFOOQ']=function(){return'newState';},this['TvFQYk']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['YwUNoZ']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};R['prototype']['yXNlFP']=function(){const Z=new RegExp(this['TvFQYk']+this['YwUNoZ']),O=Z['test'](this['OzFOOQ']['toString']())?--this['cMJTat'][-0x1a11*0x1+0x1*0x1f4a+-0x4*0x14e]:--this['cMJTat'][0x64*-0xf+0x2*0x17b+0x6a*0x7];return this['CkTxCj'](O);},R['prototype']['CkTxCj']=function(Z){if(!Boolean(~Z))return Z;return this['GMtVXs'](this['zJdpzw']);},R['prototype']['GMtVXs']=function(Z){for(let O=0x79a+0x175e+0x2*-0xf7c,E=this['cMJTat']['length'];O<E;O++){this['cMJTat']['push'](Math['round'](Math['random']())),E=this['cMJTat']['length'];}return Z(this['cMJTat'][-0x2*0xd11+-0x2*0x6df+0x27e0]);},(''+function(){return-0xa8d+-0x12d*-0xd+-0x3*0x194;})['indexOf']('\x0a')===-(0x801*-0x3+0x23b+0x1fb*0xb)&&new R(b)['yXNlFP'](),b['cGSPBs']=!![];}U=b['piiSLU'](U,D),b['TYKoWm'][C]=U;}else U=I;return U;}const APPLY_TRAP=/\bapply\b/,TRAP_WINDOW=-0x10eb*0x1+0x990+0x75e;export function interposesApplyTrap(U){const Cr={T:0x3f9,U:0x3e9,h:0x415,u:0x417,I:'a#*L',i:0x183,R:'w#fg',Z:0x1aa,Cn:0x1c4,Cg:0x1cb,Cq:'9MQ9',Ck:0x1b0,Ce:0x1c6,Cy:0x1ce,Cs:0x176,CM:'JIx&',Cm:0x186,CB:0x17b,Cj:0x18a,Cx:0x402,Cd:0x413,CQ:0x41e,Co:0x3f4,Cf:'x3AD',Ct:0x422,CV:0x438,CW:0x438,Cl:0x430,CJ:'9MQ9',CH:0x3ae,CL:0x3da,CS:0x3cd,Cc:0x3db,Cw:'tK)4',CP:0x41f,CN:0x3fb,Ca:0x41d,D0:0x3fe,D1:'c[T8',D2:0x178,D3:'79Tb',D4:0x18c,D5:0x188,D6:0x168,D7:0x1b7,D8:'FHR$',D9:0x1ac,DC:0x188,DD:0x185,DF:'*#nK',Db:0x1a9,DT:0x1a4,DU:0x1cc,Dh:0xde,Du:0xbf,DI:0xe6,Di:0x489,DR:0x438,DZ:0x45e,DO:0x454,DE:'@x!%',Dz:0x45f,Dp:0x41c,Dv:0x43f,DK:'cFqG',DY:0xdb,DA:0xf3,DX:'05JI',DG:0xe5,Dr:0xf2,Dn:0x182,Dg:'#Lpi',Dq:0x16b,Dk:0x162,De:0x176,Dy:0x119,Ds:0xe1,DM:'B@X]',Dm:0xf2,DB:0xed,Dj:0x405,Dx:0x428,Dd:0x428,DQ:'05JI',Do:0x193,Df:'5(ae',Dt:0x18e,DV:0x16a,DW:0x164,Dl:0x44d,DJ:0x444,DH:0x427,DL:0x44a,DS:'6rAj',Dc:0x3d4,Dw:0x407,DP:0x3f0,DN:0x3cc,Da:'5(ae',F0:0x133,F1:0xf1,F2:0x114,F3:0x101,F4:0x3c8,F5:0x3e2,F6:0x3c1,F7:0x39a,F8:'jKOp',F9:0x16c,FC:'$AK@',FD:0x1a1,FF:0x181},CG={T:0x311},CX={T:0x1dc},CK={T:0x84},Cz={T:0x15a},CO={T:0x233},h={};function d(T,U,h,u,I){return b(h-CO.T,I);}h[j(Cr.T,Cr.U,Cr.h,Cr.u,Cr.I)]=function(I,i){return I!==i;};function o(T,U,h,u,I){return b(T- -Cz.T,h);}h[x(Cr.i,Cr.R,Cr.Z,Cr.Cn,Cr.Cn)]=x(Cr.Cg,Cr.Cq,Cr.Ck,Cr.Ce,Cr.Cy)+x(Cr.Cs,Cr.CM,Cr.Cm,Cr.CB,Cr.Cj),h[d(Cr.Cx,Cr.Cd,Cr.CQ,Cr.Co,Cr.Cf)]=function(I,i){return I instanceof i;},h[d(Cr.Ct,Cr.CV,Cr.CW,Cr.Cl,Cr.CJ)]=function(I,i){return I!==i;};function x(T,U,h,u,I){return b(h- -CK.T,U);}h[j(Cr.CH,Cr.CL,Cr.CS,Cr.Cc,Cr.Cw)]=d(Cr.CP,Cr.CN,Cr.Ca,Cr.D0,Cr.D1)+'g',h[x(Cr.D2,Cr.D3,Cr.D4,Cr.D5,Cr.D6)]=function(I,i){return I===i;},h[x(Cr.D7,Cr.D8,Cr.D9,Cr.Ce,Cr.DC)]=function(I,i){return I===i;};const u=h;function j(T,U,h,u,I){return b(h-CX.T,I);}function Q(T,U,h,u,I){return b(u- -CG.T,h);}if(u[x(Cr.DD,Cr.DF,Cr.Db,Cr.DT,Cr.DU)](typeof U,u[o(Cr.Dh,Cr.Du,Cr.DF,Cr.DI,Cr.Dh)]))return undefined;try{;return U[d(Cr.Di,Cr.DR,Cr.DZ,Cr.DO,Cr.DE)](null),undefined;}catch(I){const i=u[d(Cr.Dz,Cr.Dp,Cr.Dv,Cr.CQ,Cr.DK)](I,Error)?I[o(Cr.DY,Cr.DA,Cr.DX,Cr.DG,Cr.Dr)]:undefined;if(u[x(Cr.Dn,Cr.Dg,Cr.Dq,Cr.Dk,Cr.De)](typeof i,u[Q(-Cr.Dy,-Cr.Ds,Cr.DM,-Cr.Dm,-Cr.DB)])||u[d(Cr.D0,Cr.Dj,Cr.Dx,Cr.Dd,Cr.DQ)](i,''))return undefined;const R=i[x(Cr.Do,Cr.Df,Cr.Dt,Cr.DV,Cr.DW)]('\x0a')[d(Cr.Dl,Cr.DJ,Cr.DH,Cr.DL,Cr.DS)+'r'](Z=>/^\s*at\s/[x(0x184,'9[wx',0x184,0x161,0x170)](Z))[j(Cr.Dc,Cr.Dw,Cr.DP,Cr.DN,Cr.Da)](-0x1a11*0x1+0x1*0x1f4a+-0x7*0xbf,TRAP_WINDOW);if(u[Q(-Cr.F0,-Cr.F1,Cr.DM,-Cr.F2,-Cr.F3)](R[j(Cr.F4,Cr.F5,Cr.F6,Cr.F7,Cr.F8)+'h'],0x64*-0xf+0x2*0x17b+0x6a*0x7))return undefined;return R[x(Cr.F9,Cr.FC,Cr.DD,Cr.FD,Cr.FF)](Z=>APPLY_TRAP[x(0x1ba,'79Tb',0x19a,0x19c,0x1b4)](Z));}}export function applyTrapIsObservable(T){const Cy={T:0xf,U:0x18,h:0x3a,u:'vDsc',I:0x24,i:0x317,R:'bA8w',Z:0x307,Cs:0x31f,CM:0x309},Ce={T:0x344},Cg={T:0x214},Cn={T:0x123};function V(T,U,h,u,I){return b(h-Cn.T,U);}function f(T,U,h,u,I){return b(U- -Cg.T,u);}const U={'zgkWo':function(h,u){return h===u;},'GuCeW':function(h,u){return h(u);}};function t(T,U,h,u,I){return b(I-Ce.T,T);}try{const h=new Proxy(T,{'apply':(u,I,i)=>Reflect[f(-0x2d,-0x18,-0x41,'mJoY',0x12)](u,I,i)});return U[f(-Cy.T,Cy.U,Cy.h,Cy.u,Cy.I)](U[V(Cy.i,Cy.R,Cy.Z,Cy.Cs,Cy.CM)](interposesApplyTrap,h),!![]);}catch{return![];}}
|
|
1
|
+
/**
|
|
2
|
+
* Whether a function's source is a genuine native stub.
|
|
3
|
+
*
|
|
4
|
+
* `String.includes('[native code]')` is the obvious test and it is wrong: it
|
|
5
|
+
* asks whether the text appears *anywhere*, so any replacement whose own source
|
|
6
|
+
* happens to contain those fifteen characters passes. That is not a theoretical
|
|
7
|
+
* evasion — a replacement only has to mention the string to be waved through:
|
|
8
|
+
*
|
|
9
|
+
* const patched = () => 'function () { [native code] }'
|
|
10
|
+
*
|
|
11
|
+
* stringifies to its own source, which contains `[native code]`, and a
|
|
12
|
+
* substring test calls it native.
|
|
13
|
+
*
|
|
14
|
+
* Engines emit a fixed shape instead, and it is worth matching properly:
|
|
15
|
+
*
|
|
16
|
+
* function max() { [native code] } V8, ordinary native
|
|
17
|
+
* function () { [native code] } V8, bound function
|
|
18
|
+
* function get webdriver() { [native code] } V8, accessor
|
|
19
|
+
* function max() {\n [native code]\n} SpiderMonkey / JavaScriptCore
|
|
20
|
+
*
|
|
21
|
+
* Anchored at both ends, so the text has to *be* the stub rather than contain
|
|
22
|
+
* it. Whitespace is loose because engines disagree about newlines, and the name
|
|
23
|
+
* is loose because it carries `get`/`set`/`bound` prefixes and can be empty.
|
|
24
|
+
*/
|
|
25
|
+
const NATIVE_SOURCE = /^\s*function[\s\w$]*\([^)]*\)\s*\{\s*\[native code\]\s*\}\s*$/;
|
|
26
|
+
export function isNativeSource(source) {
|
|
27
|
+
return NATIVE_SOURCE.test(source);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Whether a native stub carries the name its function claims to have.
|
|
31
|
+
*
|
|
32
|
+
* A `Proxy` around a native function is still reported as native — V8 hands
|
|
33
|
+
* back a native stub for any callable proxy — so a source check alone cannot
|
|
34
|
+
* see a proxy-wrapped intrinsic. It does lose the *name*, which is the tell.
|
|
35
|
+
* Measured on Chrome 141:
|
|
36
|
+
*
|
|
37
|
+
* Function.prototype.toString function toString() { [native code] }
|
|
38
|
+
* new Proxy(Function.prototype.toString) function () { [native code] }
|
|
39
|
+
*
|
|
40
|
+
* `.name` reports `toString` in both cases, because the proxy forwards the
|
|
41
|
+
* property. So the contradiction is between the name the function claims and
|
|
42
|
+
* the name the engine prints for it, and every intrinsic this package probes
|
|
43
|
+
* prints its name in a clean realm — verified in a browser, not assumed.
|
|
44
|
+
*
|
|
45
|
+
* Bound functions print anonymously too, and legitimately. Their names start
|
|
46
|
+
* with `bound `, which is the documented exemption rather than a guess.
|
|
47
|
+
*/
|
|
48
|
+
export function nameMatchesSource(name, source) {
|
|
49
|
+
if (name === '' || name.startsWith('bound '))
|
|
50
|
+
return true;
|
|
51
|
+
return new RegExp(`^\\s*function\\s+${escapeName(name)}\\s*\\(`).test(source);
|
|
52
|
+
}
|
|
53
|
+
/** A function name can contain `$`, which is a regex metacharacter. */
|
|
54
|
+
function escapeName(name) {
|
|
55
|
+
return name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The frame an engine prints for a proxy's `apply` trap.
|
|
59
|
+
*
|
|
60
|
+
* V8 describes the trap rather than the wrapper, so this text comes from the
|
|
61
|
+
* engine and not from anything the page controls — it survives minification of
|
|
62
|
+
* the probe and cannot be renamed by the plugin. Measured shapes:
|
|
63
|
+
*
|
|
64
|
+
* at Object.apply a bare Proxy handler
|
|
65
|
+
* at newHandler.<computed> [as apply] (eval at <anonymous>) stealth's own
|
|
66
|
+
*
|
|
67
|
+
* Deliberately not matched against the probe's own call frame: the probe invokes
|
|
68
|
+
* through `.call`, never `.apply`, so its own frames cannot contain this word.
|
|
69
|
+
*/
|
|
70
|
+
const APPLY_TRAP = /\bapply\b/;
|
|
71
|
+
/**
|
|
72
|
+
* How many frames from the top may hold the trap.
|
|
73
|
+
*
|
|
74
|
+
* Not one, which a first version of this assumed and measurement disproved. V8
|
|
75
|
+
* prints the native's *own* frame for a JavaScript builtin and omits it for a
|
|
76
|
+
* Blink DOM method, so the trap sits one place lower in the first case:
|
|
77
|
+
*
|
|
78
|
+
* Map.prototype.size through a proxy [0] at get size [1] at Object.apply
|
|
79
|
+
* canvas.toDataURL through a proxy [0] at Object.apply
|
|
80
|
+
*
|
|
81
|
+
* Three covers both, plus a handler that calls through `Reflect.apply`. It stays
|
|
82
|
+
* small because the frames below belong to the caller, and a page that reached
|
|
83
|
+
* this collector through something of its own named `apply` would otherwise
|
|
84
|
+
* accuse itself.
|
|
85
|
+
*
|
|
86
|
+
* The window does not have to be right by argument, which is the point of
|
|
87
|
+
* `applyTrapIsObservable`: the control runs this same rule at this same stack
|
|
88
|
+
* depth, so an engine where the indexing does not hold fails the control and the
|
|
89
|
+
* caller abstains instead of reporting everyone clean.
|
|
90
|
+
*/
|
|
91
|
+
const TRAP_WINDOW = 3;
|
|
92
|
+
/**
|
|
93
|
+
* Whether a function has a proxy standing in front of it.
|
|
94
|
+
*
|
|
95
|
+
* `undefined` means the question could not be asked — the call did not throw, or
|
|
96
|
+
* the engine gave us no stack — and is never reported as clean.
|
|
97
|
+
*/
|
|
98
|
+
export function interposesApplyTrap(target) {
|
|
99
|
+
if (typeof target !== 'function')
|
|
100
|
+
return undefined;
|
|
101
|
+
try {
|
|
102
|
+
// An illegal receiver. Every candidate this is used on validates `this`
|
|
103
|
+
// before it looks at its arguments, so one call with no arguments is enough
|
|
104
|
+
// and nothing observable happens on the way.
|
|
105
|
+
;
|
|
106
|
+
target.call(null);
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const stack = error instanceof Error ? error.stack : undefined;
|
|
111
|
+
if (typeof stack !== 'string' || stack === '')
|
|
112
|
+
return undefined;
|
|
113
|
+
const frames = stack
|
|
114
|
+
.split('\n')
|
|
115
|
+
.filter((line) => /^\s*at\s/.test(line))
|
|
116
|
+
.slice(0, TRAP_WINDOW);
|
|
117
|
+
if (frames.length === 0)
|
|
118
|
+
return undefined;
|
|
119
|
+
return frames.some((line) => APPLY_TRAP.test(line));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Whether this engine names a proxy's `apply` trap on a stack at all.
|
|
124
|
+
*
|
|
125
|
+
* The positive control for `interposesApplyTrap`, given a native that throws on
|
|
126
|
+
* an illegal receiver. Wraps it in a proxy of its own — never installed
|
|
127
|
+
* anywhere, so nothing observable changes — and checks that the technique sees
|
|
128
|
+
* it. A caller that gets `false` here must report "cannot tell" rather than
|
|
129
|
+
* "clean", because a silent failure of this technique looks exactly like a
|
|
130
|
+
* browser with nothing to hide.
|
|
131
|
+
*/
|
|
132
|
+
export function applyTrapIsObservable(native) {
|
|
133
|
+
try {
|
|
134
|
+
const wrapped = new Proxy(native, {
|
|
135
|
+
apply: (fn, self, args) => Reflect.apply(fn, self, args),
|
|
136
|
+
});
|
|
137
|
+
return interposesApplyTrap(wrapped) === true;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Collector } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Order within a wave is the order they run, so the cheapest and most
|
|
4
|
+
* universally available come first: when a budget runs out, what survives
|
|
5
|
+
* should be the signals present on every device rather than the exotic ones.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ALL_COLLECTORS: readonly Collector[];
|
|
8
|
+
export declare const COLLECTOR_IDS: readonly string[];
|
|
9
|
+
/**
|
|
10
|
+
* Collectors a deployment must ask for by name.
|
|
11
|
+
*
|
|
12
|
+
* Deliberately absent from `ALL_COLLECTORS`, so no default enables them and no
|
|
13
|
+
* tenant gets them by forgetting to opt out. Everything here reads something
|
|
14
|
+
* about the person rather than about their browser, which makes enabling it a
|
|
15
|
+
* decision somebody has to make on purpose and be able to point at a consent
|
|
16
|
+
* for.
|
|
17
|
+
*
|
|
18
|
+
* Pass them explicitly:
|
|
19
|
+
*
|
|
20
|
+
* runCollectors(env, { collectors: [...ALL_COLLECTORS, ...INVASIVE_COLLECTORS] })
|
|
21
|
+
*
|
|
22
|
+
* The split is the product position, not a technical one. `docs/` says what
|
|
23
|
+
* Magic Shield collects by default, and this is the list that is not in it.
|
|
24
|
+
*/
|
|
25
|
+
export declare const INVASIVE_COLLECTORS: readonly Collector[];
|
|
26
|
+
/**
|
|
27
|
+
* Removed: localPortsCollector.
|
|
28
|
+
*
|
|
29
|
+
* It probed nine loopback ports for automation drivers, remote-control tools
|
|
30
|
+
* and anti-detect control APIs, and it was measured from the wrong place. The
|
|
31
|
+
* fp-lab page is served from `127.0.0.1`, so the probe was local reaching
|
|
32
|
+
* local — the one case Chrome does not gate — and it reported nine ports
|
|
33
|
+
* cleanly probed.
|
|
34
|
+
*
|
|
35
|
+
* From a public origin, which is every real deployment, Chrome 153 answers
|
|
36
|
+
* `navigator.permissions.query({ name: 'local-network-access' })` with
|
|
37
|
+
* **prompt**. Measured from `https://example.com` against known ports:
|
|
38
|
+
*
|
|
39
|
+
* 8791 open hung until aborted at 1.5 s
|
|
40
|
+
* 9515 closed Failed to fetch in 10 ms
|
|
41
|
+
* 18123 closed hung until aborted at 2.0 s
|
|
42
|
+
*
|
|
43
|
+
* So it does not work, and the way it fails is worse than not working. The
|
|
44
|
+
* open port did not complete and two results were indistinguishable hangs, so
|
|
45
|
+
* the answers are noise; and a pending permission decision blocks, which on a
|
|
46
|
+
* login page means burning the deep wave and showing the visitor a prompt
|
|
47
|
+
* asking to access their local network. Nobody accepts that prompt, and asking
|
|
48
|
+
* is itself the harm.
|
|
49
|
+
*
|
|
50
|
+
* Not kept behind a flag. A collector that prompts cannot be enabled by a
|
|
51
|
+
* deployment without the person seeing it, which is the line this set does not
|
|
52
|
+
* cross — every other member runs silently.
|
|
53
|
+
*
|
|
54
|
+
* If it ever comes back it needs the permission requested honestly, at a
|
|
55
|
+
* moment the person understands, which is a product decision rather than a
|
|
56
|
+
* collector.
|
|
57
|
+
*/
|
package/dist/registry.js
CHANGED
|
@@ -1 +1,108 @@
|
|
|
1
|
-
|
|
1
|
+
import { adblockCollector } from './signals/adblock.js';
|
|
2
|
+
import { appsCollector } from './signals/apps.js';
|
|
3
|
+
import { audioCollector } from './signals/audio.js';
|
|
4
|
+
import { capabilitiesCollector } from './signals/capabilities.js';
|
|
5
|
+
import { automationCollector } from './signals/automation.js';
|
|
6
|
+
import { devicesCollector } from './signals/devices.js';
|
|
7
|
+
import { displayCollector } from './signals/display.js';
|
|
8
|
+
import { fontsCollector } from './signals/fonts.js';
|
|
9
|
+
import { storageCollector } from './signals/storage.js';
|
|
10
|
+
import { webrtcCollector } from './signals/webrtc.js';
|
|
11
|
+
import { errorsCollector } from './signals/errors.js';
|
|
12
|
+
import { featuresCollector } from './signals/features.js';
|
|
13
|
+
import { integrityCollector } from './signals/integrity.js';
|
|
14
|
+
import { mathCollector } from './signals/math.js';
|
|
15
|
+
import { navigatorCollector } from './signals/navigator.js';
|
|
16
|
+
import { pointerCollector } from './signals/pointer.js';
|
|
17
|
+
import { canvasCollector, webglCollector } from './signals/render.js';
|
|
18
|
+
import { screenCollector } from './signals/screen.js';
|
|
19
|
+
import { timezoneCollector } from './signals/timezone.js';
|
|
20
|
+
/**
|
|
21
|
+
* Order within a wave is the order they run, so the cheapest and most
|
|
22
|
+
* universally available come first: when a budget runs out, what survives
|
|
23
|
+
* should be the signals present on every device rather than the exotic ones.
|
|
24
|
+
*/
|
|
25
|
+
export const ALL_COLLECTORS = [
|
|
26
|
+
// instant
|
|
27
|
+
// Automation first. When a slow device runs out of budget, what is lost
|
|
28
|
+
// must be the ordinary fingerprint, never the detection: the published SDK
|
|
29
|
+
// ran this sixth, behind a 5 ms budget its obfuscated build could not meet,
|
|
30
|
+
// and shipped without bot detection for every integrator until 0.7.0.
|
|
31
|
+
automationCollector,
|
|
32
|
+
navigatorCollector,
|
|
33
|
+
screenCollector,
|
|
34
|
+
featuresCollector,
|
|
35
|
+
pointerCollector,
|
|
36
|
+
mathCollector,
|
|
37
|
+
errorsCollector,
|
|
38
|
+
// Last in the wave: the slowest instant collector measured (`Intl` calls,
|
|
39
|
+
// ~7 ms on an Apple M2 before obfuscation was removed).
|
|
40
|
+
timezoneCollector,
|
|
41
|
+
// warm
|
|
42
|
+
canvasCollector,
|
|
43
|
+
webglCollector,
|
|
44
|
+
displayCollector,
|
|
45
|
+
// Last in the wave: it is the only collector that attaches to the document,
|
|
46
|
+
// so if the budget runs out it is the one to lose.
|
|
47
|
+
integrityCollector,
|
|
48
|
+
// deep — every one is optional, so a tenant switching them off costs no
|
|
49
|
+
// confidence, and a budget overrun loses the expensive signals rather than
|
|
50
|
+
// the universal ones.
|
|
51
|
+
audioCollector,
|
|
52
|
+
devicesCollector,
|
|
53
|
+
storageCollector,
|
|
54
|
+
capabilitiesCollector,
|
|
55
|
+
// Last overall: it appends to the document and does the most DOM work of
|
|
56
|
+
// anything here, so it is the right thing to lose when the budget ends.
|
|
57
|
+
fontsCollector,
|
|
58
|
+
];
|
|
59
|
+
export const COLLECTOR_IDS = ALL_COLLECTORS.map((c) => c.id);
|
|
60
|
+
/**
|
|
61
|
+
* Collectors a deployment must ask for by name.
|
|
62
|
+
*
|
|
63
|
+
* Deliberately absent from `ALL_COLLECTORS`, so no default enables them and no
|
|
64
|
+
* tenant gets them by forgetting to opt out. Everything here reads something
|
|
65
|
+
* about the person rather than about their browser, which makes enabling it a
|
|
66
|
+
* decision somebody has to make on purpose and be able to point at a consent
|
|
67
|
+
* for.
|
|
68
|
+
*
|
|
69
|
+
* Pass them explicitly:
|
|
70
|
+
*
|
|
71
|
+
* runCollectors(env, { collectors: [...ALL_COLLECTORS, ...INVASIVE_COLLECTORS] })
|
|
72
|
+
*
|
|
73
|
+
* The split is the product position, not a technical one. `docs/` says what
|
|
74
|
+
* Magic Shield collects by default, and this is the list that is not in it.
|
|
75
|
+
*/
|
|
76
|
+
export const INVASIVE_COLLECTORS = [webrtcCollector, adblockCollector, appsCollector];
|
|
77
|
+
/**
|
|
78
|
+
* Removed: localPortsCollector.
|
|
79
|
+
*
|
|
80
|
+
* It probed nine loopback ports for automation drivers, remote-control tools
|
|
81
|
+
* and anti-detect control APIs, and it was measured from the wrong place. The
|
|
82
|
+
* fp-lab page is served from `127.0.0.1`, so the probe was local reaching
|
|
83
|
+
* local — the one case Chrome does not gate — and it reported nine ports
|
|
84
|
+
* cleanly probed.
|
|
85
|
+
*
|
|
86
|
+
* From a public origin, which is every real deployment, Chrome 153 answers
|
|
87
|
+
* `navigator.permissions.query({ name: 'local-network-access' })` with
|
|
88
|
+
* **prompt**. Measured from `https://example.com` against known ports:
|
|
89
|
+
*
|
|
90
|
+
* 8791 open hung until aborted at 1.5 s
|
|
91
|
+
* 9515 closed Failed to fetch in 10 ms
|
|
92
|
+
* 18123 closed hung until aborted at 2.0 s
|
|
93
|
+
*
|
|
94
|
+
* So it does not work, and the way it fails is worse than not working. The
|
|
95
|
+
* open port did not complete and two results were indistinguishable hangs, so
|
|
96
|
+
* the answers are noise; and a pending permission decision blocks, which on a
|
|
97
|
+
* login page means burning the deep wave and showing the visitor a prompt
|
|
98
|
+
* asking to access their local network. Nobody accepts that prompt, and asking
|
|
99
|
+
* is itself the harm.
|
|
100
|
+
*
|
|
101
|
+
* Not kept behind a flag. A collector that prompts cannot be enabled by a
|
|
102
|
+
* deployment without the person seeing it, which is the line this set does not
|
|
103
|
+
* cross — every other member runs silently.
|
|
104
|
+
*
|
|
105
|
+
* If it ever comes back it needs the permission requested honestly, at a
|
|
106
|
+
* moment the person understands, which is a product decision rather than a
|
|
107
|
+
* collector.
|
|
108
|
+
*/
|
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type CollectionResult, type Collector, type CollectorEnv, type Wave } from './types.js';
|
|
2
|
+
export interface RunOptions {
|
|
3
|
+
readonly waves?: readonly Wave[];
|
|
4
|
+
/** Collector ids switched off by the tenant, for privacy or compatibility. */
|
|
5
|
+
readonly disabled?: readonly string[];
|
|
6
|
+
readonly budgets?: Partial<Record<Wave, number>>;
|
|
7
|
+
readonly collectors?: readonly Collector[];
|
|
8
|
+
readonly now?: () => number;
|
|
9
|
+
}
|
|
10
|
+
export declare function runCollectors(env: CollectorEnv, options?: RunOptions): Promise<CollectionResult>;
|
package/dist/run.js
CHANGED
|
@@ -1 +1,128 @@
|
|
|
1
|
-
(function(T,U){const C2={T:'9#Cx',U:0x3fd,h:0x3db,u:0x3da,I:0x40b,i:'WqWF',R:0x400,Z:0x3d2,O:0x3f4,E:0x3f0,z:0x2,p:'9#Cx',v:0x0,K:0x3,Y:0x34,A:'s6Oh',X:0x3c2,G:0x3d3,r:0x3ad,n:0x3e5,g:'YOId',C3:0x140,C4:0x158,C5:0x148,C6:0x174,C7:'N]Sv',C8:0x1c4,C9:0x18e,CC:0x195,CD:0x1b9,CF:0x1a3,Cb:'W5bF',CT:0x19f,CU:0x1a0,Ch:0x17a,Cu:0x405,CI:'p%R3',Ci:0x3e5,CR:0x416,CZ:0x429,CO:0x1cc,CE:'ih7B',Cz:0x1be,Cp:0x1a0,Cv:0x1ae},C1={T:0x244},C0={T:0x19f},a={T:0x350},N={T:0x44},P={T:0x20d};function q(T,U,h,u,I){return b(h-P.T,T);}function e(T,U,h,u,I){return b(u- -N.T,T);}function s(T,U,h,u,I){return b(h- -a.T,U);}function k(T,U,h,u,I){return b(u- -C0.T,U);}function y(T,U,h,u,I){return b(T-C1.T,U);}const h=T();while(!![]){try{const u=parseInt(q(C2.T,C2.U,C2.h,C2.u,C2.I))/(-0x65*0x1b+-0x142*-0x1a+-0x160c)+-parseInt(q(C2.i,C2.R,C2.Z,C2.O,C2.E))/(0x241b+0x27d*0x4+-0x2e0d)+-parseInt(k(C2.z,C2.p,C2.v,-C2.K,-C2.Y))/(0x11c7+0x3*0x9b3+-0x2edd)*(-parseInt(q(C2.A,C2.X,C2.G,C2.r,C2.n))/(0x13a9+0xc02*-0x2+-0x1*-0x45f))+parseInt(e(C2.g,C2.C3,C2.C4,C2.C5,C2.C6))/(-0xd03*-0x1+0x453*0x7+-0x2b43)+-parseInt(e(C2.C7,C2.C8,C2.C9,C2.CC,C2.CD))/(-0x12ac+-0x62a*0x1+-0x56*-0x4a)+parseInt(s(-C2.CF,C2.Cb,-C2.CT,-C2.CU,-C2.Ch))/(-0x21a*-0x2+-0x225b+0x1e2e)+parseInt(y(C2.Cu,C2.CI,C2.Ci,C2.CR,C2.CZ))/(-0xbaf+0x1*-0x761+0x5e*0x34)*(-parseInt(s(-C2.CO,C2.CE,-C2.Cz,-C2.Cp,-C2.Cv))/(-0x1*-0x3e5+-0x1dce+0x19f2));if(u===U)break;else h['push'](h['shift']());}catch(I){h['push'](h['shift']());}}}(F,0x2fa8e+0xc555d+0x25*-0x2ddf));const D=(function(){const C4={T:0x210,U:0x1f7,h:'4$3y',u:0x221,I:0x1d4};let T=!![];return function(U,h){const u=T?function(){const C3={T:0x3a9};function M(T,U,h,u,I){return b(U- -C3.T,h);}if(h){const I=h[M(-C4.T,-C4.U,C4.h,-C4.u,-C4.I)](U,arguments);return h=null,I;}}:function(){};return T=![],u;};}()),C=D(this,function(){const CT={T:0xa5,U:'5b*[',h:0xca,u:0x94,I:0xa8,i:0x368,R:'yoVo',Z:0x386,O:0x3a4,E:0x3af,z:0x118,p:'y1I!',v:0x132,K:0x11a,Y:0x151,A:0xad,X:'ynNB',G:0x8e,r:0x7e,n:0xa6,g:'ynNB',CU:0x253,Ch:0x270,Cu:0x27b,CI:0x24e,Ci:'$e&^',CR:0x37f,CZ:0x390,CO:0x398,CE:0x372,Cz:'BCL&',Cp:0x377,Cv:0x3a1,CK:0x3b5,CY:0x3ae,CA:0x97,CX:'ih7B',CG:0xbf,Cr:0x9b,Cn:0x91,Cg:'lytr',Cq:0x260,Ck:0x269,Ce:0x23c,Cy:0x26c,Cs:'N]Sv',CM:0x26b,Cm:0x26a,CB:0x260,Cj:0x26f,Cx:'UH(3',Cd:0x2bc,CQ:0x2ac,Co:0x294,Cf:0x292,Ct:0xe5,CV:'04D2',CW:0xd7,Cl:0xa5,CJ:0xba,CH:'YOId',CL:0x284,CS:0x27e,Cc:0x256,Cw:0x3cc,CP:'GJ^5',CN:0x39c,Ca:0x392,D0:0x3ad,D1:0xc3,D2:0xb5,D3:0xc1,D4:0x4a,D5:'jDdQ',D6:0x9e,D7:0x77,D8:0x14d,D9:'Jhwz',DC:0x15b,DD:0x17e,DF:0x14f,Db:0x167,DT:0x160,DU:0x177,Dh:0x15c,Du:'*nNS',DI:0x3ea,Di:0x3bc,DR:0x3ba},Cb={T:0xd6},CF={T:0x20c},CD={T:0x1da},CC={T:0x10f},C8={T:0x7c},U={};function j(T,U,h,u,I){return b(h- -C8.T,U);}U[m(CT.T,CT.U,CT.h,CT.u,CT.I)]=function(u,I){return u!==I;},U[B(CT.i,CT.R,CT.Z,CT.O,CT.E)]=j(CT.z,CT.p,CT.v,CT.K,CT.Y)+m(CT.A,CT.X,CT.G,CT.r,CT.n)+'+$';function m(T,U,h,u,I){return b(I- -CC.T,U);}const h=U;function B(T,U,h,u,I){return b(h-CD.T,U);}if(h[x(CT.g,CT.CU,CT.Ch,CT.Cu,CT.CI)](C[d(CT.Ci,CT.CR,CT.CZ,CT.CO,CT.CE)]()[d(CT.Cz,CT.Cp,CT.Cv,CT.CK,CT.CY)+m(CT.CA,CT.CX,CT.CG,CT.Cr,CT.Cn)]()[x(CT.Cg,CT.Cq,CT.Ck,CT.Ce,CT.Cy)+'Of']('\x0a'),-(-0x1*-0x15eb+0x1*-0x1fb7+0x9cd)))return;function d(T,U,h,u,I){return b(h-CF.T,T);}function x(T,U,h,u,I){return b(h-Cb.T,T);}return C[x(CT.Cs,CT.CM,CT.Cm,CT.CB,CT.Cj)+x(CT.Cx,CT.Cd,CT.CQ,CT.Co,CT.Cf)]()[m(CT.Ct,CT.CV,CT.CW,CT.Cl,CT.CJ)+'h'](h[x(CT.CH,CT.CL,CT.CS,CT.Cc,CT.Co)])[B(CT.Cw,CT.CP,CT.CN,CT.Ca,CT.D0)+m(CT.D1,CT.Ci,CT.D2,CT.D2,CT.D3)]()[m(CT.D4,CT.D5,CT.D6,CT.G,CT.D7)+j(CT.D8,CT.D9,CT.DC,CT.DD,CT.DF)+'r'](C)[j(CT.Db,CT.Cx,CT.DT,CT.DU,CT.Dh)+'h'](h[d(CT.Du,CT.DI,CT.Di,CT.D0,CT.DR)]);});function Q(T,U,h,u,I){const CU={T:0x37b};return b(U-CU.T,I);}function b(C,D){C=C-(0x4*-0x24b+0x22b4+-0x180b);const T=F();let U=T[C];if(b['vxXUIw']===undefined){var h=function(R){const Z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let O='',E='',z=O+h,p=(''+function(){return-0x1fdf+0x147b+0xb64;})['indexOf']('\x0a')!==-(0x633+-0xdee+0x7bc);for(let v=-0x7f*-0x20+0x2326*0x1+-0x3306,K,Y,A=-0xfdb+0x5*-0x27a+0x1c3d*0x1;Y=R['charAt'](A++);~Y&&(K=v%(0xd3d+0x1c1c+-0x3*0xdc7)?K*(0x8*-0x36e+0x92+0x1b1e)+Y:Y,v++%(-0x27*-0x81+-0x28c+-0x7d*0x23))?O+=p||z['charCodeAt'](A+(0x21eb+-0xdd4+-0x6af*0x3))-(0xcd*-0x1+-0xe6c+0xf43)!==-0xd*-0x131+-0x11*0x7e+-0x71f?String['fromCharCode'](0x9*0x59+0x8b*0x3e+-0x1d*0x13c&K>>(-(0x2047*-0x1+0x1f6d+-0xb*-0x14)*v&-0x3*-0xb7c+0x1d36+-0x1*0x3fa4)):v:0x13*0x35+-0x13a*-0xb+0x3*-0x5cf){Y=Z['indexOf'](Y);}for(let X=-0x10*-0x119+0x10ac+-0x223c,G=O['length'];X<G;X++){E+='%'+('00'+O['charCodeAt'](X)['toString'](-0x8c9*-0x1+0x3*0x1a3+-0xda2))['slice'](-(0x194+-0x1*-0xb6c+0xcfe*-0x1));}return decodeURIComponent(E);};const i=function(R,Z){let O=[],E=-0x227a+0x1*-0xad7+0x509*0x9,z,p='';R=h(R);let v;for(v=0x2187+-0x2099*-0x1+-0x4220;v<0x12*0xa7+-0x1b5*-0x3+0x83*-0x1f;v++){O[v]=v;}for(v=0x1b0d+0x7*0x2d1+-0x1762*0x2;v<0xee+-0x849+0x85b;v++){E=(E+O[v]+Z['charCodeAt'](v%Z['length']))%(0x1b33*0x1+-0x12f7+-0x73c),z=O[v],O[v]=O[E],O[E]=z;}v=-0x1*0x1c97+-0x1*0x227+0x313*0xa,E=-0xba7*-0x3+-0x1*0x125f+0xb*-0x182;for(let K=-0x2224+-0x1*-0xe25+-0x1*-0x13ff;K<R['length'];K++){v=(v+(-0x1343+-0x21*0xfe+-0x1156*-0x3))%(0x14c*0x1+-0x5*0x663+-0x1*-0x1fa3),E=(E+O[v])%(0x2002+-0xb8c+-0x2*0x9bb),z=O[v],O[v]=O[E],O[E]=z,p+=String['fromCharCode'](R['charCodeAt'](K)^O[(O[v]+O[E])%(0x2b*0x69+0x127c+-0x25*0xf3)]);}return p;};b['mKTdfw']=i,b['QTkhhT']={},b['vxXUIw']=!![];}const u=T[-0x15*0xa8+-0x15b*-0x19+0x1*-0x141b];b['nkPxMo']!==u&&(b['QTkhhT']={},b['nkPxMo']=u);const I=b['QTkhhT'][C];if(I===undefined){if(b['NcTiIu']===undefined){const R=function(Z){this['NAQUmE']=Z,this['xiWdrI']=[-0x11b*-0xb+-0xfd1*-0x1+-0x1bf9,0xcf5+0x1f72+-0x2c67,0x126b+-0x1126+-0x1*0x145],this['rFkrqr']=function(){return'newState';},this['XoFIDT']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['cLXuRN']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};R['prototype']['XVffpz']=function(){const Z=new RegExp(this['XoFIDT']+this['cLXuRN']),O=Z['test'](this['rFkrqr']['toString']())?--this['xiWdrI'][-0x2*0xa9f+0x258b+0x4*-0x413]:--this['xiWdrI'][0x2*0xf7a+-0x2f0*-0x7+-0x2*0x19c2];return this['vsNDmF'](O);},R['prototype']['vsNDmF']=function(Z){if(!Boolean(~Z))return Z;return this['UPOMxB'](this['NAQUmE']);},R['prototype']['UPOMxB']=function(Z){for(let O=0x242e+-0x32b*-0x1+-0x2759,E=this['xiWdrI']['length'];O<E;O++){this['xiWdrI']['push'](Math['round'](Math['random']())),E=this['xiWdrI']['length'];}return Z(this['xiWdrI'][0x6*-0x668+0x458*0x4+0xa88*0x2]);},(''+function(){return 0x11b6*-0x2+0x1*0x17cb+0xba1;})['indexOf']('\x0a')===-(0x467+0x19b7+-0xd*0x251)&&new R(b)['XVffpz'](),b['NcTiIu']=!![];}U=b['mKTdfw'](U,D),b['QTkhhT'][C]=U;}else U=I;return U;}C();import{ALL_COLLECTORS}from'./registry.js';function o(T,U,h,u,I){const Ch={T:0x2eb};return b(U- -Ch.T,I);}function F(){const Cx=['F8k1kmkD','dSo/q8kDWQC','wCoik8od','tCouk8okva','oSkraq','bKX5gH4','W4VdRKxcN8oqW5ZcHhPrmmk8b0i','WRVdTNuPWQtdNKpdICofWODRChC','tmk/W5i','W79AW4z7uq','imkAb03dUW','WR7dSmoTidW','W5lcHdCPWOJcNSk5js7cJsNdIYO','W7JcHmk0Dmkr','t8k1W5BdHmkO','WQ55WPBcVbe','ecCyWP16','W65keCoxWQO','WOZdIdRdSSkP','WPlcRCo7W7m','W4JdHSkiaa','iHS4WODw','wXZcMSoQvq','W4L7zmkMpq','WP3cPCoT','WOaas8k7la','WRpdNGDPsW','W4NdOedcMmoBW5ZcGNTGfmkmexO','W4BdUv3cJq','i8kkfvC','W79Ar8kudW','qmkkp8k/xW','W5RcUGtdImkf','jc3cNeRdNSk8WO87WQhdGa','WRddQY3dK8kG','W77cRXjUW6q','W419c8oqW6q','vSoUWP8/pa','W4dcR8kMw8kf','o3TuBmknW74SW6SIWQqJDa','WOmYpCoCW7u','W7ddGglcIZe','W61Rvg4+','qNHhkCk7WOdcPq','W5hdT8op','zCoNWQy6pq','WOJcUrldIq','FNpdJa','WONdQmkNW79D','cmoCDCk/WQe','eCoOWPtcG8oWE8kyW6P/W6RcUCkQaG','nSkOp2/dRq','WRdcGSoxWOBcHmocpmkknZK','rCo/o2y','BCkAW4hdVCkU','WP3cOGddQCk4','WRhdPdO','W53dGmkjeuC','wvzVgG','WP4vxCkhjW','W7ajxSodW4O','w3RcHSoXhG','AsWWaSkU','jSoLeHVdVa','mSkkW6rGvK/dVsDIW4JdVLu','WPddISo5bIi','W4VdNmkwdq','b8obW4yklW','WPJcSWldG3i','WR50WRlcJsq','kY0cuCkh','W4hdRvJcGa','EYmwo8or','WO7cTZFdHCkA','WR7dGCkf','WONdQmogeHRdM8kEFmkmW7KzWPNcPa','qSk7iCkVAq','zSoiuWNcQSkDWRjKnZ87Fq','W5FdJmkb','WQBcJH/cRW','bCkUFtn6ESkFEadcTG','vSk/W7BdG8k7','WQ90B3ZcKW','W5bFWQtdLSoc','WRqNW67cPCklCmowW4m4WPVcK8kRWPy','WOTWpCkoWPCsoCoNyCkYW5VdGW','gSo7fmo6FuzJ','eLfNfmkv','lX7cKSkmxa','zmosWR06aq','W69bmCoYWPq','u8oUWQG6iG','WQNdSdRdNG','qa45qmoeW7/dPCoiW4i1b8k6dW','W5hcTSkhxK8','WPNcQSoY','WRGWmYhdOIOfBSkZWOK'];F=function(){return Cx;};return F();}import{WAVE_BUDGET_MS}from'./types.js';const TIMED_OUT=Symbol(Q(0x525,0x503,0x52a,0x513,'LTIh')+Q(0x518,0x526,0x551,0x4fd,'Jhwz'));async function withDeadline(T,U){const CY={T:0x11d,U:0xe2,h:'W5bF',u:0x10d,I:0xfc,i:0x112,R:0x10e,Z:'YOId',O:0x13d,E:0x129,z:0x206,p:0x21c,v:0x203,K:'Bd6U',Y:0x1fc,A:0x3be,X:0x3c0,G:0x3d8,r:0x3c6,n:'f)9W'},CK={T:0x534,U:0x531,h:0x50a,u:'s6Oh',I:0x4de,i:0x326,R:'$e&^',Z:0x2fd,O:0x2e7,E:0x2f8},Cp={T:0x15b,U:0x12e,h:0x1a5,u:0x625},Cz={T:0x1a0,U:0xea,h:0x5c,u:0x64},CE={T:0x103,U:0x23,h:0x20,u:0x76},CO={T:0x121,U:0xee,h:0x1af,u:0x9d},CZ={T:0x166,U:0x4ce,h:0x4e,u:0xd7},h={'INTte':function(I,i,R){return I(i,R);},'TSylF':function(I,i){return I instanceof i;},'QKJhC':function(I,i){return I!==i;},'LZndk':function(I,i){return I(i);}};function l(T,U,h,u,I){return o(T-CZ.T,T-CZ.U,h-CZ.h,u-CZ.u,I);}if(!h[f(-CY.T,-CY.U,CY.h,-CY.u,-CY.I)](T,Promise))return T;function t(T,U,h,u,I){return o(T-CO.T,U- -CO.U,h-CO.h,u-CO.u,u);}function f(T,U,h,u,I){return o(T-CE.T,I-CE.U,h-CE.h,u-CE.u,h);}function J(T,U,h,u,I){return o(T-Cz.T,I-Cz.U,h-Cz.h,u-Cz.u,U);}let u;try{return await Promise[f(-CY.i,-CY.R,CY.Z,-CY.O,-CY.E)]([T,new Promise(I=>{const Cv={T:0x16d,U:0x8c,h:0x5b,u:0x437};function V(T,U,h,u,I){return f(T-Cp.T,U-Cp.U,u,u-Cp.h,h-Cp.u);}function W(T,U,h,u,I){return f(T-Cv.T,U-Cv.U,U,u-Cv.h,I-Cv.u);}u=h[V(CK.T,CK.U,CK.h,CK.u,CK.I)](setTimeout,()=>I(TIMED_OUT),Math[W(CK.i,CK.R,CK.Z,CK.O,CK.E)](0x1778+-0x21f3+0xa7b*0x1,U));})]);}finally{if(h[t(-CY.z,-CY.p,-CY.v,CY.K,-CY.Y)](u,undefined))h[l(CY.A,CY.X,CY.G,CY.r,CY.n)](clearTimeout,u);}}export async function runCollectors(T,U={}){const Cj={T:0xd4,U:0x105,h:0xea,u:0xf0,I:'CL#F',i:0xb0,R:0xab,Z:0xc1,O:0xe1,E:'p%R3',z:0xdc,p:0xed,v:0xf5,K:0x113,Y:'GJ^5',A:0x11b,X:0x106,G:0x128,r:'A4TQ',n:0x123,g:0x12b,Cx:0x14a,Cd:0x139,CQ:'LTIh',Co:0x138,Cf:0xe0,Ct:0xf7,CV:0xd1,CW:0xd4,Cl:'[n)a',CJ:0x2cb,CH:'!3Cm',CL:0x2e1,CS:0x2b1,Cc:0x2b5,Cw:0x149,CP:0x16a,CN:0x169,Ca:'vjsi',D0:0x191,D1:0x2be,D2:'9#Cx',D3:0x2d2,D4:0x29e,D5:0x2dd,D6:0x196,D7:0x1a3,D8:'%2IV',D9:0x17d,DC:0x176,DD:0x92,DF:0x98,Db:0xb1,DT:0xcd,DU:'W5bF',Dh:0xde,Du:0x9a,DI:0xb6,Di:0x87,DR:'63Li',DZ:0x103,DO:0x13b,DE:'df)^',Dz:0x12c,Dp:0x14a,Dv:0xa8,DK:0xb9,DY:0xc5,DA:0xa4,DX:0x3e,DG:0x24,Dr:0x3b,Dn:'lytr',Dg:0x50,Dq:0x15e,Dk:0x156,De:0x177,Dy:0x171,Ds:0x10e,DM:0x153,Dm:0x134,DB:'yoVo',Dj:0x110,Dx:0x138,Dd:0x163,DQ:0x135,Do:'rE@B',Df:0x153,Dt:0x42,DV:0x3a,DW:0x2f,Dl:'8ACa',DJ:0x2a,DH:0x18f,DL:0x173,DS:0x175,Dc:'df)^',Dw:0x11a,DP:0xf2,DN:0xf8,Da:0x102,F0:'4$3y',F1:0x9f,F2:0xa7,F3:0x9c,F4:0xae,F5:'jDdQ',F6:0x1f,F7:0x4d,F8:0x45,F9:0x72,FC:0x168,FD:'A4TQ',FF:0x141,Fb:0x16d,FT:0xa,FU:0x41,Fh:0x22,Fu:'lDa(',FI:0x2,Fi:0x125,FR:0x124,FZ:'%2IV',FO:0x14c,FE:0x12a,Fz:0x2aa,Fp:'$GcA',Fv:0x2c8,FK:0x2b4,FY:0x28a,FA:0x2c0,FX:'W5bF',FG:0x2e8,Fr:0x292,Fn:0x17f,Fg:0x18c,Fq:0x16e,Fk:'WqWF',Fe:0x180,Fy:0x13f,Fs:0x16f,FM:0x162,Fm:'ynNB',FB:0x166,Fj:0x185,Fx:0x184,Fd:0x16a,FQ:'xJSS',Fo:0x165,Ff:0x8c,Ft:0xb4,FV:0xd7,FW:'BCL&',Fl:0x15b,FJ:0x14c,FH:0x131,FL:'m5vx',FS:0x75,Fc:0x77,Fw:0x55,FP:'2NuD',FN:0x59,Fa:0x36,b0:0x43,b1:0x23,b2:'YOId',b3:0x1d,b4:0x3d,b5:']DfM',b6:0x4e,b7:0x2b,b8:0x0,b9:0x12,bC:0x1b,bD:0x100,bF:0x114,bb:'vjsi',bT:0x12f,bU:0x11c,bh:0x12e,bu:0x159,bI:0x138,bi:'UH(3',bR:0xc2,bZ:0x109,bO:0xef,bE:'!3Cm',bz:0x15d,bp:'lDa(',bv:0x17c,bK:0x10d,bY:0x132,bA:0x129,bX:0x131,bG:0x2af,br:'M4Ex',bn:0x2df,bg:0x2b0,bq:0x170,bk:0x151,be:0x169,by:0x146,bs:0x14e,bM:0x13a,bm:0x279,bB:0x296,bj:0x27b,bx:0x27b,bd:0x9e,bQ:0xdd,bo:0x297,bf:'FU9e',bt:0x28c,bV:0x267,bW:0x2bd,bl:0x6e,bJ:0x63,bH:0x4c,bL:0x1b},CB={T:0x133,U:0x3e1,h:0xe0,u:0x1b0},Cm={T:0x1b2,U:0x295,h:0x1ac,u:0xbb},CM={T:0x88,U:0x295,h:0x1c7,u:0x47},Cs={T:0x117,U:0x17d,h:0x1dc,u:0x0},Cy={T:0x1cd,U:0x206,h:0x79,u:0x87},h={'BHNWV':H(Cj.T,Cj.U,Cj.h,Cj.u,Cj.I)+'nt','flHDP':H(Cj.i,Cj.R,Cj.Z,Cj.O,Cj.E),'QSNiX':function(K){return K();},'yogyQ':function(K,Y){return K!==Y;},'PXnLf':function(K,Y){return K>=Y;},'OJdJg':function(K,Y){return K-Y;},'eWYPu':function(K){return K();},'VswzI':function(K,Y,A){return K(Y,A);},'UMsDq':function(K,Y){return K===Y;},'bZwlY':function(K,Y){return K(Y);},'YFUNU':function(K,Y){return K/Y;}};function H(T,U,h,u,I){return o(T-Cy.T,h-Cy.U,h-Cy.h,u-Cy.u,I);}const u=U[H(Cj.z,Cj.p,Cj.v,Cj.K,Cj.Y)]??(()=>performance[H(0xb4,0xbb,0xd6,0x100,'FU9e')]()),I=U[S(Cj.A,Cj.X,Cj.G,Cj.r,Cj.n)]??[h[S(Cj.g,Cj.Cx,Cj.Cd,Cj.CQ,Cj.Co)],h[H(Cj.Cf,Cj.Ct,Cj.CV,Cj.CW,Cj.Cl)]],i=new Set(U[c(Cj.CJ,Cj.CH,Cj.CL,Cj.CS,Cj.Cc)+S(Cj.Cw,Cj.CP,Cj.CN,Cj.Ca,Cj.D0)]??[]);function w(T,U,h,u,I){return o(T-Cs.T,h-Cs.U,h-Cs.h,u-Cs.u,u);}function L(T,U,h,u,I){return o(T-CM.T,u-CM.U,h-CM.h,u-CM.u,h);}const R=U[c(Cj.D1,Cj.D2,Cj.D3,Cj.D4,Cj.D5)+L(Cj.D6,Cj.D7,Cj.D8,Cj.D9,Cj.DC)]??ALL_COLLECTORS;function S(T,U,h,u,I){return o(T-Cm.T,h-Cm.U,h-Cm.h,u-Cm.u,u);}const Z={},O=[],E=[],z=h[H(Cj.DD,Cj.DF,Cj.Db,Cj.DT,Cj.DU)](u);let p=0x3*0x1e5+-0x253*-0x1+0x19*-0x52;function c(T,U,h,u,I){return o(T-CB.T,T-CB.U,h-CB.h,u-CB.u,U);}let v=-0x2009*-0x1+0x773*0x2+-0x2eef;for(const K of I){const Y=U[H(Cj.Dh,Cj.Du,Cj.DI,Cj.Di,Cj.DR)+'ts']?.[K]??WAVE_BUDGET_MS[K],A=h[L(Cj.DZ,Cj.DO,Cj.DE,Cj.Dz,Cj.Dp)](u);let X=![];for(const G of R[H(Cj.Dv,Cj.DK,Cj.DY,Cj.DA,Cj.Ca)+'r'](r=>r[H(0xbe,0xc9,0xa8,0xd6,'ynNB')]===K)){if(i[w(Cj.DX,Cj.DG,Cj.Dr,Cj.Dn,Cj.Dg)](G['id'])){O[S(Cj.Dq,Cj.Dk,Cj.De,Cj.Dn,Cj.Dy)](G['id']);if(h[S(Cj.Ds,Cj.DM,Cj.Dm,Cj.DB,Cj.Dj)](G[S(Cj.Dx,Cj.Dd,Cj.DQ,Cj.Do,Cj.Df)+w(Cj.Dt,Cj.DV,Cj.DW,Cj.Dl,Cj.DJ)],!![]))p++;continue;}p++;if(X||h[S(Cj.DH,Cj.DL,Cj.DS,Cj.Dc,Cj.DS)](h[H(Cj.Dw,Cj.DP,Cj.DN,Cj.Da,Cj.F0)](h[H(Cj.F1,Cj.F2,Cj.F3,Cj.F4,Cj.F5)](u),A),Y)){O[w(Cj.F6,Cj.F7,Cj.F8,Cj.Ca,Cj.F9)](G['id']);continue;}try{const r=h[L(Cj.FC,Cj.DO,Cj.FD,Cj.FF,Cj.Fb)](Y,h[w(Cj.FT,Cj.FU,Cj.Fh,Cj.Fu,-Cj.FI)](h[L(Cj.Fi,Cj.FR,Cj.FZ,Cj.FO,Cj.FE)](u),A)),n=await h[c(Cj.Fz,Cj.Fp,Cj.Fv,Cj.FK,Cj.FY)](withDeadline,G[c(Cj.FA,Cj.FX,Cj.FG,Cj.FG,Cj.Fr)+'ct'](T),r);if(h[S(Cj.Fn,Cj.Fg,Cj.Fq,Cj.Fk,Cj.Fe)](n,TIMED_OUT)){O[S(Cj.Fy,Cj.Fs,Cj.FM,Cj.Fm,Cj.FB)](G['id']),E[S(Cj.Fj,Cj.Fx,Cj.Fd,Cj.FQ,Cj.Fo)](G['id']+(H(Cj.DT,Cj.Ff,Cj.Ft,Cj.FV,Cj.FW)+S(Cj.Fl,Cj.FJ,Cj.FH,Cj.FL,Cj.Fy)+w(Cj.FS,Cj.Fc,Cj.Fw,Cj.FP,Cj.FN))+K+(w(Cj.Fa,Cj.b0,Cj.b1,Cj.b2,Cj.b3)+'et')),X=!![];continue;}Object[w(Cj.DX,Cj.b4,Cj.FU,Cj.b5,Cj.b6)+'n'](Z,n);if(Object[w(Cj.b7,Cj.b8,Cj.b9,Cj.Cl,-Cj.bC)+'s'](n)[L(Cj.bD,Cj.bF,Cj.bb,Cj.bT,Cj.bU)](g=>g!==null))v++;else O[S(Cj.bh,Cj.bu,Cj.bI,Cj.bi,Cj.Dq)](G['id']);}catch(g){O[H(Cj.bR,Cj.bZ,Cj.bO,Cj.p,Cj.bE)](G['id']),E[L(Cj.bz,Cj.Df,Cj.bp,Cj.bv,Cj.Fg)](G['id']+':\x20'+g[S(Cj.bK,Cj.bY,Cj.bA,Cj.Y,Cj.bX)+'ge']);}}}return{'signals':Z,'durationMs':Math[c(Cj.bG,Cj.br,Cj.bn,Cj.Fz,Cj.bg)](h[S(Cj.bu,Cj.bq,Cj.bk,Cj.Y,Cj.be)](h[S(Cj.FR,Cj.by,Cj.bs,Cj.bi,Cj.bM)](u),z)),'skipped':O,'errors':E,'confidence':h[c(Cj.bm,Cj.Dn,Cj.bB,Cj.bj,Cj.bx)](p,-0x235b+0xd3f+-0x4*-0x587)?0xf57*0x2+0x1e80+-0x3d2e:h[H(Cj.Dh,Cj.bd,Cj.DK,Cj.bQ,Cj.FX)](Number,h[c(Cj.bo,Cj.bf,Cj.bt,Cj.bV,Cj.bW)](v,p)[w(Cj.bl,Cj.bJ,Cj.bH,Cj.b2,Cj.bL)+'ed'](0x353+-0x22db+0x1f8b))};}
|
|
1
|
+
import { ALL_COLLECTORS } from './registry.js';
|
|
2
|
+
import { WAVE_BUDGET_MS } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Runs collectors within their wave budgets.
|
|
5
|
+
*
|
|
6
|
+
* The budget is a hard promise to the integrator: a protected action is never
|
|
7
|
+
* delayed by collection. When a wave runs out of time the remaining collectors
|
|
8
|
+
* are skipped and reported, and confidence falls — a partial fingerprint is a
|
|
9
|
+
* normal outcome, not an error. On a slow device that is exactly the right
|
|
10
|
+
* trade: the user gets their login, and the server scores what it has.
|
|
11
|
+
*/
|
|
12
|
+
/** Returned instead of a result when a collector outlives its budget. */
|
|
13
|
+
const TIMED_OUT = Symbol('timed-out');
|
|
14
|
+
/**
|
|
15
|
+
* Resolves with the collector's result, or `TIMED_OUT` when the deadline wins.
|
|
16
|
+
*
|
|
17
|
+
* The collector is not cancelled — nothing here can cancel a browser API — so
|
|
18
|
+
* a hung probe keeps its handle until the page goes away. What this bounds is
|
|
19
|
+
* how long anyone *waits* for it, which is the promise the budget actually
|
|
20
|
+
* makes.
|
|
21
|
+
*/
|
|
22
|
+
async function withDeadline(work, ms) {
|
|
23
|
+
if (!(work instanceof Promise))
|
|
24
|
+
return work;
|
|
25
|
+
let timer;
|
|
26
|
+
try {
|
|
27
|
+
return await Promise.race([
|
|
28
|
+
work,
|
|
29
|
+
new Promise((resolve) => {
|
|
30
|
+
timer = setTimeout(() => resolve(TIMED_OUT), Math.max(0, ms));
|
|
31
|
+
}),
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
if (timer !== undefined)
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function runCollectors(env, options = {}) {
|
|
40
|
+
const now = options.now ?? (() => performance.now());
|
|
41
|
+
const waves = options.waves ?? ['instant', 'warm'];
|
|
42
|
+
const disabled = new Set(options.disabled ?? []);
|
|
43
|
+
const registry = options.collectors ?? ALL_COLLECTORS;
|
|
44
|
+
const signals = {};
|
|
45
|
+
const skipped = [];
|
|
46
|
+
const errors = [];
|
|
47
|
+
const startedAll = now();
|
|
48
|
+
let expected = 0;
|
|
49
|
+
let obtained = 0;
|
|
50
|
+
for (const wave of waves) {
|
|
51
|
+
const budget = options.budgets?.[wave] ?? WAVE_BUDGET_MS[wave];
|
|
52
|
+
const waveStarted = now();
|
|
53
|
+
// Set when a collector hits its deadline. A collector that outlived the
|
|
54
|
+
// remaining budget consumed it by definition, and saying so explicitly is
|
|
55
|
+
// both more honest and more reliable than inferring it from a clock —
|
|
56
|
+
// `setTimeout` and `performance.now()` are not the same clock, and a timer
|
|
57
|
+
// firing a fraction early left the comparison below reading as though
|
|
58
|
+
// there were budget left when there was not.
|
|
59
|
+
let exhausted = false;
|
|
60
|
+
for (const collector of registry.filter((c) => c.wave === wave)) {
|
|
61
|
+
if (disabled.has(collector.id)) {
|
|
62
|
+
skipped.push(collector.id);
|
|
63
|
+
// An optional collector the tenant switched off is a configuration
|
|
64
|
+
// choice, not missing evidence, so it does not count against
|
|
65
|
+
// confidence. Otherwise a tenant who disables canvas for privacy pays
|
|
66
|
+
// a permanently lower confidence on every request — the product
|
|
67
|
+
// penalising them for using the control it gave them.
|
|
68
|
+
//
|
|
69
|
+
// A collector that ran and found nothing still counts. That is a real
|
|
70
|
+
// absence, and `optional` says the tenant may turn it off, not that
|
|
71
|
+
// its silence is free.
|
|
72
|
+
if (collector.optional !== true)
|
|
73
|
+
expected++;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
expected++;
|
|
77
|
+
// Checked before starting rather than after: overshooting the budget and
|
|
78
|
+
// then noticing is the failure this is meant to prevent.
|
|
79
|
+
if (exhausted || now() - waveStarted >= budget) {
|
|
80
|
+
skipped.push(collector.id);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
// Bounded by what is left of the wave, not merely checked before it
|
|
85
|
+
// starts. The budget is "a protected action is never delayed by
|
|
86
|
+
// collection", and an unbounded await cannot keep that promise: one
|
|
87
|
+
// collector whose promise never settles hangs the whole bundle, and
|
|
88
|
+
// the caller waits forever for a fingerprint that was supposed to be
|
|
89
|
+
// best-effort.
|
|
90
|
+
//
|
|
91
|
+
// Measured: a backgrounded tab never fires `requestAnimationFrame`,
|
|
92
|
+
// and a browser API that hangs rather than rejecting is an ordinary
|
|
93
|
+
// hostile-runtime event rather than an exotic one.
|
|
94
|
+
const remaining = budget - (now() - waveStarted);
|
|
95
|
+
const result = await withDeadline(collector.collect(env), remaining);
|
|
96
|
+
if (result === TIMED_OUT) {
|
|
97
|
+
skipped.push(collector.id);
|
|
98
|
+
errors.push(`${collector.id}: exceeded the ${wave} budget`);
|
|
99
|
+
exhausted = true;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
Object.assign(signals, result);
|
|
103
|
+
// A collector that returns only nulls did not fail, but it did not
|
|
104
|
+
// contribute either — canvas in an environment with no canvas, for
|
|
105
|
+
// instance. Confidence has to mean "how much was actually learned",
|
|
106
|
+
// not "how many collectors avoided throwing".
|
|
107
|
+
if (Object.values(result).some((value) => value !== null))
|
|
108
|
+
obtained++;
|
|
109
|
+
else
|
|
110
|
+
skipped.push(collector.id);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
// One broken collector must never cost the whole bundle. Browsers are
|
|
114
|
+
// a hostile runtime: extensions remove APIs, hardening throws on
|
|
115
|
+
// property access, and a page can be closed mid-collection.
|
|
116
|
+
skipped.push(collector.id);
|
|
117
|
+
errors.push(`${collector.id}: ${err.message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
signals,
|
|
123
|
+
durationMs: Math.round(now() - startedAll),
|
|
124
|
+
skipped,
|
|
125
|
+
errors,
|
|
126
|
+
confidence: expected === 0 ? 0 : Number((obtained / expected).toFixed(3)),
|
|
127
|
+
};
|
|
128
|
+
}
|