@axeptio/behavior-detection 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -12
- package/dist/behavior-detection.esm.min.js +1 -1
- package/dist/behavior-detection.esm.min.js.map +4 -4
- package/dist/behavior-detection.min.js +1 -1
- package/dist/behavior-detection.min.js.map +3 -3
- package/dist/cjs/index.cjs +920 -22
- package/dist/esm/browser.js +0 -2
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/strategies/click.d.ts +8 -0
- package/dist/esm/strategies/click.js +108 -9
- package/dist/esm/strategies/environment.d.ts +39 -0
- package/dist/esm/strategies/environment.js +188 -7
- package/dist/esm/strategies/index.d.ts +4 -0
- package/dist/esm/strategies/index.js +4 -0
- package/dist/esm/strategies/mouse.d.ts +53 -1
- package/dist/esm/strategies/mouse.js +198 -2
- package/dist/esm/strategies/timing.d.ts +64 -0
- package/dist/esm/strategies/timing.js +308 -0
- package/dist/esm/strategies/visibility.d.ts +64 -0
- package/dist/esm/strategies/visibility.js +295 -0
- package/dist/index.d.ts +1 -1
- package/dist/strategies/click.d.ts +8 -0
- package/dist/strategies/environment.d.ts +39 -0
- package/dist/strategies/index.d.ts +4 -0
- package/dist/strategies/mouse.d.ts +53 -1
- package/dist/strategies/timing.d.ts +64 -0
- package/dist/strategies/visibility.d.ts +64 -0
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{var V=class{constructor(t){this.strategies=new Map,this.isTracking=!1,this.isPausedByVisibility=!1,this.tickInterval=null,this.tickIntervalMs=1e3,this.pauseOnHidden=!0,this.visibilityChangeHandler=null,this.confidenceScore=0,this.CONFIDENCE_TARGET=1,this.CONFIDENCE_DECAY=.95,t!=null&&t.interval&&(this.tickIntervalMs=t.interval),(t==null?void 0:t.pauseOnHidden)!==void 0&&(this.pauseOnHidden=t.pauseOnHidden)}addStrategy(t,e){let s={strategy:t,weight:e!=null?e:t.defaultWeight,enabled:!0};return this.strategies.set(t.name,s),t.setEventCallback&&t.setEventCallback(n=>{this.onStrategyEvent(n,s.weight)}),this.isTracking&&t.start(),this}onStrategyEvent(t,e){this.confidenceScore*=this.CONFIDENCE_DECAY;let s=t.weight*e;this.confidenceScore=Math.min(this.CONFIDENCE_TARGET,this.confidenceScore+s)}removeStrategy(t){let e=this.strategies.get(t);return e&&(this.isTracking&&e.strategy.stop(),this.strategies.delete(t)),this}setStrategyEnabled(t,e){let s=this.strategies.get(t);return s&&(s.enabled=e,!e&&this.isTracking&&s.strategy.stop(),e&&this.isTracking&&s.strategy.start()),this}getStrategies(){return this.strategies}start(){if(!this.isTracking){if(this.isTracking=!0,this.pauseOnHidden&&typeof document!="undefined"&&(this.visibilityChangeHandler=this.handleVisibilityChange.bind(this),document.addEventListener("visibilitychange",this.visibilityChangeHandler),document.hidden)){this.isPausedByVisibility=!0;return}for(let[t,e]of this.strategies)e.enabled&&e.strategy.start();this.startTick()}}stop(){if(this.isTracking){this.isTracking=!1,this.isPausedByVisibility=!1,this.visibilityChangeHandler&&typeof document!="undefined"&&(document.removeEventListener("visibilitychange",this.visibilityChangeHandler),this.visibilityChangeHandler=null);for(let[t,e]of this.strategies)e.strategy.stop();this.stopTick()}}reset(){this.confidenceScore=0;for(let[t,e]of this.strategies)e.strategy.reset()}async score(t={}){let e=this.calculateStrategyScore(),s={score:e.overall};return t.breakdown&&(s.breakdown=e),s}isActive(){return this.isTracking}isPaused(){return this.isPausedByVisibility}getEventCount(){var t,e;let s={};for(let[n,o]of this.strategies){let i=(e=(t=o.strategy).getDebugInfo)===null||e===void 0?void 0:e.call(t);(i==null?void 0:i.eventCount)!==void 0&&(s[n]=i.eventCount)}return s}getStrategyDebugInfo(){let t={};for(let[e,s]of this.strategies)s.strategy.getDebugInfo&&(t[e]=s.strategy.getDebugInfo());return t}getConfidence(){return Math.min(1,this.confidenceScore)}hasConfidentData(t=.3){return this.getConfidence()>=t}destroy(){this.stop(),this.strategies.clear()}handleVisibilityChange(){if(this.isTracking){if(document.hidden){if(!this.isPausedByVisibility){this.isPausedByVisibility=!0;for(let[t,e]of this.strategies)e.enabled&&e.strategy.stop();this.stopTick()}}else if(this.isPausedByVisibility){this.isPausedByVisibility=!1;for(let[t,e]of this.strategies)e.enabled&&e.strategy.start();this.startTick()}}}startTick(){this.tickInterval===null&&(this.tickInterval=window.setInterval(()=>{let t=Date.now();for(let[e,s]of this.strategies)s.enabled&&s.strategy.onTick&&s.strategy.onTick(t)},this.tickIntervalMs))}stopTick(){this.tickInterval!==null&&(clearInterval(this.tickInterval),this.tickInterval=null)}calculateStrategyScore(){let t={},e={},s=0,n=0;for(let[i,a]of this.strategies){if(!a.enabled)continue;let l=a.strategy.score();t[i]=l,e[i]=a.weight,l!=null&&(s+=a.weight,n+=l*a.weight)}let o=s>0?n/s:.5;return{overall:Math.max(0,Math.min(1,o)),factors:t,weights:e}}};var v=class{constructor(){this.eventCallback=null}setEventCallback(t){this.eventCallback=t}notifyEvent(t){this.eventCallback&&this.eventCallback({strategy:this.name,weight:t,timestamp:Date.now()})}};function X(c,t=0,e=1){return 1/(1+Math.exp(-e*(c-t)))}function x(c,t=0,e=1){return 1-X(c,t,e)}function y(c,t=0,e=1){let s=-Math.pow(c-t,2)/(2*e*e);return Math.exp(s)}function T(c){if(c.length===0)return{mean:0,variance:0,stdDev:0,cv:0};let t=c.reduce((o,i)=>o+i,0)/c.length,e=c.reduce((o,i)=>o+(i-t)**2,0)/c.length,s=Math.sqrt(e),n=t>0?s/t:0;return{mean:t,variance:e,stdDev:s,cv:n}}function C(c){if(c.length<2)return;let t=new Set(c.map(n=>Math.round(n/10))).size,e=t===1;return{statistics:T(c),uniqueCount:t,allIdentical:e}}function A(c){return c<.05?.1:c>2?.3:y(c,.45,.35)}var D=class extends v{constructor(t){super(),this.name="mouse",this.defaultWeight=.3,this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.rollingWindowMs=5e3,this.listener=null,this.leaveListener=null,this.isActive=!1,this.screenDiagonal=1,(t==null?void 0:t.rollingWindow)!==void 0&&(this.rollingWindowMs=t.rollingWindow)}start(){if(this.isActive)return;this.isActive=!0;let t=window.innerWidth,e=window.innerHeight;this.screenDiagonal=Math.sqrt(t*t+e*e),this.listener=s=>{let n=s,o=Date.now(),i={x:n.clientX,y:n.clientY};if(this.lastPosition){let a=i.x-this.lastPosition.x,l=i.y-this.lastPosition.y,f=Math.sqrt(a*a+l*l)/this.screenDiagonal;if(f>.001){let g=Math.atan2(l,a),u=g-this.lastAngle;for(;u>Math.PI;)u-=2*Math.PI;for(;u<-Math.PI;)u+=2*Math.PI;this.cumulativeAngle+=u,this.lastAngle=g,this.distanceSeries.push({value:f,timestamp:o}),this.angleSeries.push({value:this.cumulativeAngle,timestamp:o}),this.notifyEvent(Math.min(1,f*100))}let h=o-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<h;)this.distanceSeries.shift(),this.angleSeries.shift()}this.lastPosition=i},document.addEventListener("mousemove",this.listener,{passive:!0}),this.leaveListener=()=>{this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0},document.addEventListener("mouseleave",this.leaveListener,{passive:!0})}stop(){this.isActive&&(this.isActive=!1,this.listener&&(document.removeEventListener("mousemove",this.listener),this.listener=null),this.leaveListener&&(document.removeEventListener("mouseleave",this.leaveListener),this.leaveListener=null))}reset(){this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0}score(){if(!(this.distanceSeries.length<10))return this.detectMousePatterns()}detectMousePatterns(){if(this.distanceSeries.length<10)return;let t=0,e=0,s=this.distanceSeries.map(o=>o.value);if(s.length>=3){let o=T(s);t+=y(o.cv,.9,.35),e++}let n=this.angleSeries.map(o=>o.value);if(n.length>=3){let o=[];for(let a=1;a<n.length;a++)o.push(Math.abs(n[a]-n[a-1]));let i=o.reduce((a,l)=>a+l,0)/o.length;t+=y(i,.15,.12),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,angleSeries:this.angleSeries}}};var P=class extends v{constructor(t){super(),this.name="scroll",this.defaultWeight=.15,this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0,this.rollingWindowMs=5e3,this.documentHeight=1,this.listener=null,this.isActive=!1,(t==null?void 0:t.rollingWindow)!==void 0&&(this.rollingWindowMs=t.rollingWindow)}start(){this.isActive||(this.isActive=!0,this.documentHeight=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,1),this.listener=t=>{let e=window.scrollY,s=Date.now();if(this.lastScrollY===null){this.lastScrollY=e,this.lastTimestamp=s;return}let n=e-this.lastScrollY,o=s-this.lastTimestamp;if(n===0)return;let i=Math.abs(n)/this.documentHeight;if(o>0){let a=i/o;this.distanceSeries.push({value:i,timestamp:s}),this.velocitySeries.push({value:a,timestamp:s}),this.notifyEvent(Math.min(1,i*10));let l=s-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<l;)this.distanceSeries.shift(),this.velocitySeries.shift()}this.lastScrollY=e,this.lastTimestamp=s},window.addEventListener("scroll",this.listener,{passive:!0}))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("scroll",this.listener),this.listener=null))}reset(){this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0}score(){if(!(this.distanceSeries.length<2))return this.detectScrollPatterns()}detectScrollPatterns(){if(this.distanceSeries.length<2)return;let t=0,e=0,s=this.distanceSeries.map(i=>i.value);if(s.length>=2&&new Set(s.map(a=>Math.round(a*1e3))).size===1)return .05;if(s.length>=2){let i=T(s);t+=y(i.cv,1,.4),e++}let n=this.velocitySeries.map(i=>i.value);if(n.length>=2){let i=T(n);t+=y(i.cv,1.2,.5),e++}let o=s.filter(i=>i>.1).length;if(s.length>0){let i=o/s.length;t+=x(i,.3,15),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,velocitySeries:this.velocitySeries}}};var I=class extends v{constructor(t){super(),this.name="click",this.defaultWeight=.3,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.lastMousePosition=null,this.mouseListener=null,this.clickListeners=new Map,this.isActive=!1,t!=null&&t.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.mouseListener=t=>{let e=t;this.lastMousePosition={x:e.clientX,y:e.clientY}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.attachClickListeners())}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachClickListenersForSelector(t))}attachClickListeners(){this.targetSelectors.forEach(t=>{this.attachClickListenersForSelector(t)})}attachClickListenersForSelector(t){document.querySelectorAll(t).forEach(s=>{if(this.clickListeners.has(s))return;let n=o=>{var i,a;let l=o,r=s.getBoundingClientRect(),f=r.top>=0&&r.left>=0&&r.bottom<=window.innerHeight&&r.right<=window.innerWidth,h;if(!this.lastMousePosition)h="no-mouse-data";else{let g=this.lastMousePosition.x,u=this.lastMousePosition.y;if(!(g>=r.left&&g<=r.right&&u>=r.top&&u<=r.bottom))h="outside";else{let d=r.left+r.width/2,b=r.top+r.height/2;Math.sqrt((g-d)**2+(u-b)**2)<2?h="dead-center":h="over-element"}}this.events.push({clickX:l.clientX,clickY:l.clientY,mouseX:(i=this.lastMousePosition)===null||i===void 0?void 0:i.x,mouseY:(a=this.lastMousePosition)===null||a===void 0?void 0:a.y,rect:r,inViewport:f,position:h,timestamp:Date.now()}),this.notifyEvent(1)};s.addEventListener("click",n),this.clickListeners.set(s,n)})}stop(){this.isActive&&(this.isActive=!1,this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null),this.clickListeners.forEach((t,e)=>{e.removeEventListener("click",t)}),this.clickListeners.clear())}reset(){this.events=[],this.lastMousePosition=null}score(){if(this.events.length===0)return;let t=0;for(let e of this.events)switch(e.position){case"no-mouse-data":t+=0;break;case"outside":t+=0;break;case"dead-center":t+=.5;break;case"over-element":t+=1;break}return t/this.events.length}getDebugInfo(){return{eventCount:this.events.length,positions:{noMouseData:this.events.filter(t=>t.position==="no-mouse-data").length,outside:this.events.filter(t=>t.position==="outside").length,deadCenter:this.events.filter(t=>t.position==="dead-center").length,overElement:this.events.filter(t=>t.position==="over-element").length},inViewport:this.events.filter(t=>t.inViewport).length,trackedElements:this.clickListeners.size}}};var _=class extends v{constructor(t){super(),this.name="tap",this.defaultWeight=.35,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.touchStartListeners=new Map,this.touchEndListeners=new Map,this.activeTouches=new Map,this.isActive=!1,t!=null&&t.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachTouchListeners())}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachTouchListenersForSelector(t))}attachTouchListeners(){this.targetSelectors.forEach(t=>{this.attachTouchListenersForSelector(t)})}attachTouchListenersForSelector(t){document.querySelectorAll(t).forEach(s=>{if(this.touchStartListeners.has(s))return;let n=i=>{let a=i;if(a.touches.length!==1)return;let l=a.touches[0];this.activeTouches.set(l.identifier,{x:l.clientX,y:l.clientY,timestamp:Date.now(),element:s})},o=i=>{let a=i;if(a.changedTouches.length!==1)return;let l=a.changedTouches[0],r=this.activeTouches.get(l.identifier);if(!r||r.element!==s)return;let f=Date.now(),h=f-r.timestamp,g=l.clientX-r.x,u=l.clientY-r.y,M=Math.sqrt(g*g+u*u),d=s.getBoundingClientRect(),b=d.top>=0&&d.left>=0&&d.bottom<=window.innerHeight&&d.right<=window.innerWidth,S=l.clientX,E=l.clientY,z=S>=d.left&&S<=d.right&&E>=d.top&&E<=d.bottom,k;if(!z)k="outside";else{let F=d.left+d.width/2,Y=d.top+d.height/2;k=Math.sqrt((S-F)**2+(E-Y)**2)<2?"dead-center":"over-element"}this.events.push({x:S,y:E,rect:d,inViewport:b,position:k,duration:h,movement:M,timestamp:f}),this.notifyEvent(1),this.activeTouches.delete(l.identifier)};s.addEventListener("touchstart",n,{passive:!0}),s.addEventListener("touchend",o,{passive:!0}),this.touchStartListeners.set(s,n),this.touchEndListeners.set(s,o)})}stop(){this.isActive&&(this.isActive=!1,this.touchStartListeners.forEach((t,e)=>{e.removeEventListener("touchstart",t)}),this.touchStartListeners.clear(),this.touchEndListeners.forEach((t,e)=>{e.removeEventListener("touchend",t)}),this.touchEndListeners.clear(),this.activeTouches.clear())}reset(){this.events=[],this.activeTouches.clear()}score(){if(this.events.length===0)return;let t=0,e=0,s=0;for(let i of this.events)switch(i.position){case"outside":s+=0;break;case"dead-center":s+=.5;break;case"over-element":s+=1;break}t+=s/this.events.length,e++;let n=this.events.map(i=>i.duration);if(n.length>=2){let i=C(n);if(i){let{statistics:a,allIdentical:l}=i;if(l)return .05;t+=A(a.cv),e++,t+=y(a.mean,95,40),e++}}let o=this.events.map(i=>i.movement);if(o.length>0){let i=o.reduce((a,l)=>a+l,0)/o.length;t+=y(i,2,3),e++}if(this.events.length>=3){let i=[];for(let l=1;l<this.events.length;l++)i.push(this.events[l].timestamp-this.events[l-1].timestamp);let a=C(i);a&&!a.allIdentical&&(t+=A(a.statistics.cv),e++)}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.events.length,positions:{outside:this.events.filter(t=>t.position==="outside").length,deadCenter:this.events.filter(t=>t.position==="dead-center").length,overElement:this.events.filter(t=>t.position==="over-element").length},durations:this.events.map(t=>t.duration),movements:this.events.map(t=>t.movement),inViewport:this.events.filter(t=>t.inViewport).length,trackedElements:this.touchStartListeners.size}}};var W=class extends v{constructor(t){super(),this.name="keyboard",this.defaultWeight=.1,this.events=[],this.targetSelectors=['input[type="text"]','input[type="email"]',"textarea"],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0,this.sessionPauseThreshold=1e3,this.downListener=null,this.upListener=null,this.focusListeners=new Map,this.blurListeners=new Map,this.isActive=!1,t!=null&&t.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachFocusListeners(),this.downListener=t=>{if(!this.focusedElement)return;let e=Date.now(),s=t;this.lastEventTimestamp>0&&e-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:s.key,type:"down",timestamp:e,targetElement:this.focusedElementSelector}),this.notifyEvent(.8),this.lastEventTimestamp=e},this.upListener=t=>{if(!this.focusedElement)return;let e=Date.now(),s=t;this.lastEventTimestamp>0&&e-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:s.key,type:"up",timestamp:e,targetElement:this.focusedElementSelector}),this.lastEventTimestamp=e},document.addEventListener("keydown",this.downListener),document.addEventListener("keyup",this.upListener))}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachFocusListenersForSelector(t))}attachFocusListeners(){this.targetSelectors.forEach(t=>{this.attachFocusListenersForSelector(t)})}attachFocusListenersForSelector(t){document.querySelectorAll(t).forEach(s=>{if(this.focusListeners.has(s))return;let n=()=>{this.focusedElement=s,this.focusedElementSelector=t},o=()=>{this.focusedElement=null,this.focusedElementSelector=""};s.addEventListener("focus",n),s.addEventListener("blur",o),this.focusListeners.set(s,n),this.blurListeners.set(s,o)})}stop(){this.isActive&&(this.isActive=!1,this.downListener&&(document.removeEventListener("keydown",this.downListener),this.downListener=null),this.upListener&&(document.removeEventListener("keyup",this.upListener),this.upListener=null),this.focusListeners.forEach((t,e)=>{e.removeEventListener("focus",t)}),this.focusListeners.clear(),this.blurListeners.forEach((t,e)=>{e.removeEventListener("blur",t)}),this.blurListeners.clear(),this.focusedElement=null)}reset(){this.events=[],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0}score(){if(this.events.length<6)return;let t=this.events.filter(r=>r.type==="down");if(t.length<3)return;let e=0,s=0,n=[];for(let r=1;r<t.length;r++)n.push(t[r].timestamp-t[r-1].timestamp);let o=C(n);if(o){let{statistics:r,allIdentical:f}=o;if(f)return .1;let h=A(r.cv);if(e+=h,s++,h<=.1)return h}let i=[];for(let r=0;r<this.events.length-1;r++)this.events[r].type==="down"&&this.events[r+1].type==="up"&&this.events[r].key===this.events[r+1].key&&i.push(this.events[r+1].timestamp-this.events[r].timestamp);let a=C(i);if(a){let{statistics:r,allIdentical:f}=a;if(f)return .1;if(r.mean<5)e+=.1,s++;else{let h=A(r.cv);if(e+=h,s++,h<=.1)return h}}let l=this.events.filter(r=>r.key==="Backspace").length;if(l>0){let r=l/t.length;r>.05&&r<.3?(e+=1,s++):r>0&&(e+=.8,s++)}return s>0?e/s:void 0}getDebugInfo(){let t=[];for(let e=0;e<this.events.length-1;e++)this.events[e].type==="down"&&this.events[e+1].type==="up"&&this.events[e].key===this.events[e+1].key&&t.push(this.events[e+1].timestamp-this.events[e].timestamp);return{eventCount:this.events.length,downEvents:this.events.filter(e=>e.type==="down").length,upEvents:this.events.filter(e=>e.type==="up").length,backspaceCount:this.events.filter(e=>e.key==="Backspace").length,pressDurations:t,focusedElement:this.focusedElementSelector,trackedElements:this.focusListeners.size}}};var H=class extends v{constructor(){super(...arguments),this.name="environment",this.defaultWeight=.08,this.data=null}start(){this.captureEnvironment()}stop(){}reset(){this.data=null}onTick(t){this.captureEnvironment()}score(){if(!this.data)return;let t=this.data,e=0,s=0;e+=t.suspiciousDimensions?.1:1,e+=t.suspiciousRatio?.2:1,e+=t.featureInconsistency?.3:1,s+=3;let n=[t.hasWebGL,t.hasLocalStorage,t.hasSessionStorage,t.hasIndexedDB].filter(Boolean).length;return e+=n/4,s++,e+=x(t.plugins,-2,-.5),e+=t.plugins>0?1:.1,s+=2,e+=y(t.devicePixelRatio,2,1.5),e+=t.colorDepth===24||t.colorDepth===32?1:.4,s+=2,s>0?e/s:void 0}isMobileDevice(){let t=navigator.maxTouchPoints>0||"ontouchstart"in window,e=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),s=window.innerWidth<768&&window.innerHeight<1024;return t&&s||e}captureEnvironment(){try{let t=!1;try{let u=document.createElement("canvas");t=!!(u.getContext("webgl")||u.getContext("experimental-webgl"))}catch(u){t=!1}let e=!!(window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection),s=this.isMobileDevice(),n=window.innerWidth,o=window.innerHeight,i=window.screen.width,a=window.screen.height,l=n===800&&o===600||n===1024&&o===768||n===1280&&o===720||i===800&&a===600,r=n*o/(i*a),f=r===1||r<.1||r>1,h=typeof localStorage!="undefined"&&typeof sessionStorage!="undefined",g=navigator.plugins.length===0&&navigator.mimeTypes.length===0||!t||!h;this.data={screenWidth:i,screenHeight:a,windowWidth:n,windowHeight:o,devicePixelRatio:window.devicePixelRatio,colorDepth:window.screen.colorDepth,userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,languages:navigator.languages?Array.from(navigator.languages):[navigator.language],hardwareConcurrency:navigator.hardwareConcurrency,maxTouchPoints:navigator.maxTouchPoints||0,vendor:navigator.vendor,hasWebGL:t,hasWebRTC:e,hasLocalStorage:typeof localStorage!="undefined",hasSessionStorage:typeof sessionStorage!="undefined",hasIndexedDB:"indexedDB"in window,plugins:navigator.plugins.length,mimeTypes:navigator.mimeTypes.length,suspiciousRatio:f,suspiciousDimensions:l,featureInconsistency:g,isMobile:s,timestamp:Date.now()}}catch(t){}}getDebugInfo(){return this.data}isMobile(){var t,e;return(e=(t=this.data)===null||t===void 0?void 0:t.isMobile)!==null&&e!==void 0?e:null}};var B=class extends v{constructor(){super(...arguments),this.name="resize",this.defaultWeight=.02,this.events=[],this.listener=null,this.isActive=!1,this.lastMousePosition=null,this.mouseListener=null}start(){this.isActive||(this.isActive=!0,this.mouseListener=t=>{let e=t;this.lastMousePosition={x:e.clientX,y:e.clientY}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.listener=()=>{var t,e;let s=(t=this.lastMousePosition)===null||t===void 0?void 0:t.x,n=(e=this.lastMousePosition)===null||e===void 0?void 0:e.y,o=!1;s!==void 0&&n!==void 0&&(o=s<50||s>window.innerWidth-50||n<50||n>window.innerHeight-50),this.events.push({width:window.innerWidth,height:window.innerHeight,mouseX:s,mouseY:n,mouseNearEdge:o,timestamp:Date.now()})},window.addEventListener("resize",this.listener))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("resize",this.listener),this.listener=null),this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null))}reset(){this.events=[]}score(){if(this.events.length===0)return;let t=0,e=0;t+=x(this.events.length,5,.5),e++;let s=this.events.filter(n=>n.mouseX!==void 0);if(s.length>0){let n=s.filter(o=>o.mouseNearEdge).length;t+=X(n/s.length,.5,8),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.events.length,withMouseData:this.events.filter(t=>t.mouseX!==void 0).length}}};function N(){let c=navigator.maxTouchPoints>0||"ontouchstart"in window,t=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),e=window.innerWidth<768&&window.innerHeight<1024;return c&&e||t}var q=class{constructor(){this.detector=null,this.checkInterval=null,this.settings=null}init(t){var e,s,n,o,i,a,l,r,f,h,g,u,M,d,b,S,E,z,k,F,Y;this.detector&&this.stop(),this.settings=t,this.detector=new V({pauseOnHidden:t.pauseOnHidden!==void 0?t.pauseOnHidden:!0});let R=N(),m=t.strategies||{},L=R?{mouse:0,scroll:.35,click:0,tap:.35,keyboard:.15,environment:.1,resize:.05}:{mouse:.3,scroll:.15,click:.3,tap:0,keyboard:.1,environment:.08,resize:.02};if(!R&&((e=m.mouse)===null||e===void 0?void 0:e.enabled)!==!1){let p=new D,w=(n=(s=m.mouse)===null||s===void 0?void 0:s.weight)!==null&&n!==void 0?n:L.mouse;this.detector.addStrategy(p,w)}if(((o=m.scroll)===null||o===void 0?void 0:o.enabled)!==!1){let p=new P,w=(a=(i=m.scroll)===null||i===void 0?void 0:i.weight)!==null&&a!==void 0?a:L.scroll;this.detector.addStrategy(p,w)}if(!R&&((l=m.click)===null||l===void 0?void 0:l.enabled)!==!1){let p=new I,w=(f=(r=m.click)===null||r===void 0?void 0:r.weight)!==null&&f!==void 0?f:L.click;this.detector.addStrategy(p,w)}if(R&&((h=m.tap)===null||h===void 0?void 0:h.enabled)!==!1){let p=new _,w=(u=(g=m.tap)===null||g===void 0?void 0:g.weight)!==null&&u!==void 0?u:L.tap;this.detector.addStrategy(p,w)}if(((M=m.keyboard)===null||M===void 0?void 0:M.enabled)!==!1){let p=new W,w=(b=(d=m.keyboard)===null||d===void 0?void 0:d.weight)!==null&&b!==void 0?b:L.keyboard;this.detector.addStrategy(p,w)}if(((S=m.environment)===null||S===void 0?void 0:S.enabled)!==!1){let p=new H,w=(z=(E=m.environment)===null||E===void 0?void 0:E.weight)!==null&&z!==void 0?z:L.environment;this.detector.addStrategy(p,w)}if(((k=m.resize)===null||k===void 0?void 0:k.enabled)!==!1){let p=new B,w=(Y=(F=m.resize)===null||F===void 0?void 0:F.weight)!==null&&Y!==void 0?Y:L.resize;this.detector.addStrategy(p,w)}t.autoStart!==!1&&this.start(),t.checkMs&&t.checkMs>0&&this.startPeriodicCheck(t.checkMs),t.onReady&&t.onReady(this)}start(){this.detector&&this.detector.start()}stop(){this.detector&&this.detector.stop(),this.checkInterval!==null&&(clearInterval(this.checkInterval),this.checkInterval=null)}async score(){return this.detector?this.detector.score({breakdown:!0}):null}startPeriodicCheck(t){this.checkInterval!==null&&clearInterval(this.checkInterval),this.checkInterval=window.setInterval(async()=>{var e,s;let n=await this.score();if(!n||!this.settings)return;this.settings.onScore&&this.settings.onScore(n);let o=(e=this.settings.botThreshold)!==null&&e!==void 0?e:.3,i=(s=this.settings.humanThreshold)!==null&&s!==void 0?s:.7;n.score<o&&this.settings.ifBot?this.settings.ifBot(n):n.score>=i&&this.settings.ifHuman&&this.settings.ifHuman(n)},t)}getDetector(){return this.detector}},O=new q;if(typeof window!="undefined"){window.BehaviorDetector=O;let c=()=>{let t=window.bdSettings;t&&O.init(t)};c(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",c)}})();
|
|
1
|
+
"use strict";(()=>{var V=class{constructor(t){this.strategies=new Map,this.isTracking=!1,this.isPausedByVisibility=!1,this.tickInterval=null,this.tickIntervalMs=1e3,this.pauseOnHidden=!0,this.visibilityChangeHandler=null,this.confidenceScore=0,this.CONFIDENCE_TARGET=1,this.CONFIDENCE_DECAY=.95,t!=null&&t.interval&&(this.tickIntervalMs=t.interval),(t==null?void 0:t.pauseOnHidden)!==void 0&&(this.pauseOnHidden=t.pauseOnHidden)}addStrategy(t,e){let i={strategy:t,weight:e!=null?e:t.defaultWeight,enabled:!0};return this.strategies.set(t.name,i),t.setEventCallback&&t.setEventCallback(n=>{this.onStrategyEvent(n,i.weight)}),this.isTracking&&t.start(),this}onStrategyEvent(t,e){this.confidenceScore*=this.CONFIDENCE_DECAY;let i=t.weight*e;this.confidenceScore=Math.min(this.CONFIDENCE_TARGET,this.confidenceScore+i)}removeStrategy(t){let e=this.strategies.get(t);return e&&(this.isTracking&&e.strategy.stop(),this.strategies.delete(t)),this}setStrategyEnabled(t,e){let i=this.strategies.get(t);return i&&(i.enabled=e,!e&&this.isTracking&&i.strategy.stop(),e&&this.isTracking&&i.strategy.start()),this}getStrategies(){return this.strategies}start(){if(!this.isTracking){if(this.isTracking=!0,this.pauseOnHidden&&typeof document!="undefined"&&(this.visibilityChangeHandler=this.handleVisibilityChange.bind(this),document.addEventListener("visibilitychange",this.visibilityChangeHandler),document.hidden)){this.isPausedByVisibility=!0;return}for(let[t,e]of this.strategies)e.enabled&&e.strategy.start();this.startTick()}}stop(){if(this.isTracking){this.isTracking=!1,this.isPausedByVisibility=!1,this.visibilityChangeHandler&&typeof document!="undefined"&&(document.removeEventListener("visibilitychange",this.visibilityChangeHandler),this.visibilityChangeHandler=null);for(let[t,e]of this.strategies)e.strategy.stop();this.stopTick()}}reset(){this.confidenceScore=0;for(let[t,e]of this.strategies)e.strategy.reset()}async score(t={}){let e=this.calculateStrategyScore(),i={score:e.overall};return t.breakdown&&(i.breakdown=e),i}isActive(){return this.isTracking}isPaused(){return this.isPausedByVisibility}getEventCount(){var t,e;let i={};for(let[n,o]of this.strategies){let s=(e=(t=o.strategy).getDebugInfo)===null||e===void 0?void 0:e.call(t);(s==null?void 0:s.eventCount)!==void 0&&(i[n]=s.eventCount)}return i}getStrategyDebugInfo(){let t={};for(let[e,i]of this.strategies)i.strategy.getDebugInfo&&(t[e]=i.strategy.getDebugInfo());return t}getConfidence(){return Math.min(1,this.confidenceScore)}hasConfidentData(t=.3){return this.getConfidence()>=t}destroy(){this.stop(),this.strategies.clear()}handleVisibilityChange(){if(this.isTracking){if(document.hidden){if(!this.isPausedByVisibility){this.isPausedByVisibility=!0;for(let[t,e]of this.strategies)e.enabled&&e.strategy.stop();this.stopTick()}}else if(this.isPausedByVisibility){this.isPausedByVisibility=!1;for(let[t,e]of this.strategies)e.enabled&&e.strategy.start();this.startTick()}}}startTick(){this.tickInterval===null&&(this.tickInterval=window.setInterval(()=>{let t=Date.now();for(let[e,i]of this.strategies)i.enabled&&i.strategy.onTick&&i.strategy.onTick(t)},this.tickIntervalMs))}stopTick(){this.tickInterval!==null&&(clearInterval(this.tickInterval),this.tickInterval=null)}calculateStrategyScore(){let t={},e={},i=0,n=0;for(let[s,r]of this.strategies){if(!r.enabled)continue;let l=r.strategy.score();t[s]=l,e[s]=r.weight,l!=null&&(i+=r.weight,n+=l*r.weight)}let o=i>0?n/i:.5;return{overall:Math.max(0,Math.min(1,o)),factors:t,weights:e}}};var p=class{constructor(){this.eventCallback=null}setEventCallback(t){this.eventCallback=t}notifyEvent(t){this.eventCallback&&this.eventCallback({strategy:this.name,weight:t,timestamp:Date.now()})}};function Y(f,t=0,e=1){return 1/(1+Math.exp(-e*(f-t)))}function A(f,t=0,e=1){return 1-Y(f,t,e)}function E(f,t=0,e=1){let i=-Math.pow(f-t,2)/(2*e*e);return Math.exp(i)}function T(f){if(f.length===0)return{mean:0,variance:0,stdDev:0,cv:0};let t=f.reduce((o,s)=>o+s,0)/f.length,e=f.reduce((o,s)=>o+(s-t)**2,0)/f.length,i=Math.sqrt(e),n=t>0?i/t:0;return{mean:t,variance:e,stdDev:i,cv:n}}function _(f){if(f.length<2)return;let t=new Set(f.map(n=>Math.round(n/10))).size,e=t===1;return{statistics:T(f),uniqueCount:t,allIdentical:e}}function D(f){return f<.05?.1:f>2?.3:E(f,.45,.35)}var I=class extends p{constructor(t){super(),this.name="mouse",this.defaultWeight=.3,this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.rollingWindowMs=5e3,this.listener=null,this.leaveListener=null,this.enterListener=null,this.isActive=!1,this.screenDiagonal=1,this.entryPoints=[],this.microMovements=[],this.STILLNESS_WINDOW=500,(t==null?void 0:t.rollingWindow)!==void 0&&(this.rollingWindowMs=t.rollingWindow)}start(){if(this.isActive)return;this.isActive=!0;let t=window.innerWidth,e=window.innerHeight;this.screenDiagonal=Math.sqrt(t*t+e*e),this.listener=i=>{let n=i,o=Date.now(),s={x:n.clientX,y:n.clientY,timestamp:o};if(this.lastPosition){let r=s.x-this.lastPosition.x,l=s.y-this.lastPosition.y,a=Math.sqrt(r*r+l*l);if(a>=1&&a<=5){this.microMovements.push({dx:r,dy:l,timestamp:o});let v=o-this.STILLNESS_WINDOW;for(;this.microMovements.length>0&&this.microMovements[0].timestamp<v;)this.microMovements.shift()}let c=a/this.screenDiagonal;if(c>.001){let v=Math.atan2(l,r),d=v-this.lastAngle;for(;d>Math.PI;)d-=2*Math.PI;for(;d<-Math.PI;)d+=2*Math.PI;this.cumulativeAngle+=d,this.lastAngle=v,this.distanceSeries.push({value:c,timestamp:o}),this.angleSeries.push({value:this.cumulativeAngle,timestamp:o}),this.notifyEvent(Math.min(1,c*100))}let h=o-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<h;)this.distanceSeries.shift(),this.angleSeries.shift()}this.lastPosition=s},document.addEventListener("mousemove",this.listener,{passive:!0}),this.enterListener=i=>{let n=i,o=Date.now(),s=n.clientX,r=n.clientY,l=window.innerWidth,a=window.innerHeight,c=r,h=a-r,v=s,d=l-s,g=Math.min(c,h,v,d),u,m=50;g<m?c<=g?u="top":h<=g?u="bottom":v<=g?u="left":u="right":s>l*.35&&s<l*.65&&r>a*.35&&r<a*.65?u="center":c<m*2&&v<m*2||c<m*2&&d<m*2||h<m*2&&v<m*2||h<m*2&&d<m*2?u="corner":c<h&&c<v&&c<d?u="top":h<v&&h<d?u="bottom":v<d?u="left":u="right",this.entryPoints.push({x:s,y:r,timestamp:o,edgeDistance:g,entryEdge:u}),this.entryPoints.length>20&&this.entryPoints.shift()},document.addEventListener("mouseenter",this.enterListener,{passive:!0}),this.leaveListener=()=>{this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.microMovements=[]},document.addEventListener("mouseleave",this.leaveListener,{passive:!0})}stop(){this.isActive&&(this.isActive=!1,this.listener&&(document.removeEventListener("mousemove",this.listener),this.listener=null),this.leaveListener&&(document.removeEventListener("mouseleave",this.leaveListener),this.leaveListener=null),this.enterListener&&(document.removeEventListener("mouseenter",this.enterListener),this.enterListener=null))}reset(){this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.entryPoints=[],this.microMovements=[]}score(){if(!(this.distanceSeries.length<10))return this.detectMousePatterns()}detectMousePatterns(){if(this.distanceSeries.length<10)return;let t=0,e=0,i=this.distanceSeries.map(r=>r.value);if(i.length>=3){let r=T(i);t+=E(r.cv,.9,.35),e++}let n=this.angleSeries.map(r=>r.value);if(n.length>=3){let r=[];for(let a=1;a<n.length;a++)r.push(Math.abs(n[a]-n[a-1]));let l=r.reduce((a,c)=>a+c,0)/r.length;t+=E(l,.15,.12),e++}let o=this.scoreEntryPoints();o!==void 0&&(t+=o,e++);let s=this.scoreMicroMovements();return s!==void 0&&(t+=s,e++),e>0?t/e:void 0}scoreEntryPoints(){if(this.entryPoints.length<2)return;let t=0,e=0,i=0,n=0;for(let r of this.entryPoints)r.x<5&&r.y<5?(n++,t++):r.entryEdge==="center"?(e++,t++):r.entryEdge==="corner"&&(i++,r.edgeDistance<10&&t++);let o=this.entryPoints.length,s=t/o;return n>=2||n/o>=.5?.1:e/o>=.5?.2:s>=.7?.3:s>=.5?.5:s>=.3?.7:1}scoreMicroMovements(){if(this.distanceSeries.length<20)return;let t=this.microMovements.length,e=this.distanceSeries[0],n=this.distanceSeries[this.distanceSeries.length-1].timestamp-e.timestamp;if(n<1e3)return;let o=t/n*1e3;return t===0?.3:o<1?.5:o<5?.7:o>=5&&o<=30?1:.8}getMicroMovementCount(){return this.microMovements.length}getLastPosition(){return this.lastPosition?{x:this.lastPosition.x,y:this.lastPosition.y}:null}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,angleSeries:this.angleSeries,entryPoints:this.entryPoints,microMovementCount:this.microMovements.length,lastPosition:this.lastPosition}}};var x=class extends p{constructor(t){super(),this.name="scroll",this.defaultWeight=.15,this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0,this.rollingWindowMs=5e3,this.documentHeight=1,this.listener=null,this.isActive=!1,(t==null?void 0:t.rollingWindow)!==void 0&&(this.rollingWindowMs=t.rollingWindow)}start(){this.isActive||(this.isActive=!0,this.documentHeight=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,1),this.listener=t=>{let e=window.scrollY,i=Date.now();if(this.lastScrollY===null){this.lastScrollY=e,this.lastTimestamp=i;return}let n=e-this.lastScrollY,o=i-this.lastTimestamp;if(n===0)return;let s=Math.abs(n)/this.documentHeight;if(o>0){let r=s/o;this.distanceSeries.push({value:s,timestamp:i}),this.velocitySeries.push({value:r,timestamp:i}),this.notifyEvent(Math.min(1,s*10));let l=i-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<l;)this.distanceSeries.shift(),this.velocitySeries.shift()}this.lastScrollY=e,this.lastTimestamp=i},window.addEventListener("scroll",this.listener,{passive:!0}))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("scroll",this.listener),this.listener=null))}reset(){this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0}score(){if(!(this.distanceSeries.length<2))return this.detectScrollPatterns()}detectScrollPatterns(){if(this.distanceSeries.length<2)return;let t=0,e=0,i=this.distanceSeries.map(s=>s.value);if(i.length>=2&&new Set(i.map(r=>Math.round(r*1e3))).size===1)return .05;if(i.length>=2){let s=T(i);t+=E(s.cv,1,.4),e++}let n=this.velocitySeries.map(s=>s.value);if(n.length>=2){let s=T(n);t+=E(s.cv,1.2,.5),e++}let o=i.filter(s=>s>.1).length;if(i.length>0){let s=o/i.length;t+=A(s,.3,15),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,velocitySeries:this.velocitySeries}}};var P=class extends p{constructor(t){super(),this.name="click",this.defaultWeight=.3,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.lastMousePosition=null,this.mouseListener=null,this.clickListeners=new Map,this.isActive=!1,t!=null&&t.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.mouseListener=t=>{let e=t;this.lastMousePosition={x:e.clientX,y:e.clientY,timestamp:Date.now()}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.attachClickListeners())}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachClickListenersForSelector(t))}attachClickListeners(){this.targetSelectors.forEach(t=>{this.attachClickListenersForSelector(t)})}attachClickListenersForSelector(t){document.querySelectorAll(t).forEach(i=>{if(this.clickListeners.has(i))return;let n=o=>{var s,r;let l=o,a=Date.now(),c=i.getBoundingClientRect(),h=c.top>=0&&c.left>=0&&c.bottom<=window.innerHeight&&c.right<=window.innerWidth,v=0,d=-1;if(this.lastMousePosition){let u=l.clientX-this.lastMousePosition.x,m=l.clientY-this.lastMousePosition.y;v=Math.sqrt(u*u+m*m),d=a-this.lastMousePosition.timestamp}let g;if(!this.lastMousePosition)g="no-mouse-data";else{let u=this.lastMousePosition.x,m=this.lastMousePosition.y;if(!(u>=c.left&&u<=c.right&&m>=c.top&&m<=c.bottom))g="outside";else{let b=c.left+c.width/2,k=c.top+c.height/2;Math.sqrt((u-b)**2+(m-k)**2)<2?g="dead-center":g="over-element"}}this.events.push({clickX:l.clientX,clickY:l.clientY,mouseX:(s=this.lastMousePosition)===null||s===void 0?void 0:s.x,mouseY:(r=this.lastMousePosition)===null||r===void 0?void 0:r.y,rect:c,inViewport:h,position:g,timestamp:a,mouseClickDelta:v,timeSinceMouseMove:d,isTrusted:l.isTrusted}),this.notifyEvent(1)};i.addEventListener("click",n),this.clickListeners.set(i,n)})}stop(){this.isActive&&(this.isActive=!1,this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null),this.clickListeners.forEach((t,e)=>{e.removeEventListener("click",t)}),this.clickListeners.clear())}reset(){this.events=[],this.lastMousePosition=null}score(){let t=this.events.length;if(t===0)return;let e=0,i=0,n=0,o=0,s=0,r=0;for(let c of this.events){switch(c.position){case"no-mouse-data":e+=0;break;case"outside":e+=0;break;case"dead-center":e+=.5;break;case"over-element":e+=1;break}c.mouseClickDelta>=0&&(i++,c.mouseClickDelta>5&&n++),c.timeSinceMouseMove>=0&&(o++,(c.timeSinceMouseMove<10||c.timeSinceMouseMove>2e3)&&s++),c.isTrusted||r++}let l=0,a=0;if(l+=e/t,a++,i>=2){let c=n/i,h;c>=.8?h=.1:c>=.5?h=.3:c>=.3?h=.5:c>0?h=.7:h=1,l+=h,a++}if(o>=2){let c=s/o,h;c>=.8?h=.2:c>=.5?h=.4:c>=.3?h=.6:c>0?h=.8:h=1,l+=h,a++}if(t>=2){let c=r/t,h;c>=.5?h=.1:c>0?h=.3:h=1,l+=h,a++}return a>0?l/a:void 0}getDebugInfo(){return{eventCount:this.events.length,positions:{noMouseData:this.events.filter(t=>t.position==="no-mouse-data").length,outside:this.events.filter(t=>t.position==="outside").length,deadCenter:this.events.filter(t=>t.position==="dead-center").length,overElement:this.events.filter(t=>t.position==="over-element").length},inViewport:this.events.filter(t=>t.inViewport).length,trackedElements:this.clickListeners.size,mouseClickDeltas:this.events.map(t=>t.mouseClickDelta),timeSinceMouseMoves:this.events.map(t=>t.timeSinceMouseMove),untrustedClicks:this.events.filter(t=>!t.isTrusted).length}}};var H=class extends p{constructor(t){super(),this.name="tap",this.defaultWeight=.35,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.touchStartListeners=new Map,this.touchEndListeners=new Map,this.activeTouches=new Map,this.isActive=!1,t!=null&&t.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachTouchListeners())}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachTouchListenersForSelector(t))}attachTouchListeners(){this.targetSelectors.forEach(t=>{this.attachTouchListenersForSelector(t)})}attachTouchListenersForSelector(t){document.querySelectorAll(t).forEach(i=>{if(this.touchStartListeners.has(i))return;let n=s=>{let r=s;if(r.touches.length!==1)return;let l=r.touches[0];this.activeTouches.set(l.identifier,{x:l.clientX,y:l.clientY,timestamp:Date.now(),element:i})},o=s=>{let r=s;if(r.changedTouches.length!==1)return;let l=r.changedTouches[0],a=this.activeTouches.get(l.identifier);if(!a||a.element!==i)return;let c=Date.now(),h=c-a.timestamp,v=l.clientX-a.x,d=l.clientY-a.y,g=Math.sqrt(v*v+d*d),u=i.getBoundingClientRect(),m=u.top>=0&&u.left>=0&&u.bottom<=window.innerHeight&&u.right<=window.innerWidth,L=l.clientX,b=l.clientY,k=L>=u.left&&L<=u.right&&b>=u.top&&b<=u.bottom,M;if(!k)M="outside";else{let N=u.left+u.width/2,O=u.top+u.height/2;M=Math.sqrt((L-N)**2+(b-O)**2)<2?"dead-center":"over-element"}this.events.push({x:L,y:b,rect:u,inViewport:m,position:M,duration:h,movement:g,timestamp:c}),this.notifyEvent(1),this.activeTouches.delete(l.identifier)};i.addEventListener("touchstart",n,{passive:!0}),i.addEventListener("touchend",o,{passive:!0}),this.touchStartListeners.set(i,n),this.touchEndListeners.set(i,o)})}stop(){this.isActive&&(this.isActive=!1,this.touchStartListeners.forEach((t,e)=>{e.removeEventListener("touchstart",t)}),this.touchStartListeners.clear(),this.touchEndListeners.forEach((t,e)=>{e.removeEventListener("touchend",t)}),this.touchEndListeners.clear(),this.activeTouches.clear())}reset(){this.events=[],this.activeTouches.clear()}score(){if(this.events.length===0)return;let t=0,e=0,i=0;for(let s of this.events)switch(s.position){case"outside":i+=0;break;case"dead-center":i+=.5;break;case"over-element":i+=1;break}t+=i/this.events.length,e++;let n=this.events.map(s=>s.duration);if(n.length>=2){let s=_(n);if(s){let{statistics:r,allIdentical:l}=s;if(l)return .05;t+=D(r.cv),e++,t+=E(r.mean,95,40),e++}}let o=this.events.map(s=>s.movement);if(o.length>0){let s=o.reduce((r,l)=>r+l,0)/o.length;t+=E(s,2,3),e++}if(this.events.length>=3){let s=[];for(let l=1;l<this.events.length;l++)s.push(this.events[l].timestamp-this.events[l-1].timestamp);let r=_(s);r&&!r.allIdentical&&(t+=D(r.statistics.cv),e++)}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.events.length,positions:{outside:this.events.filter(t=>t.position==="outside").length,deadCenter:this.events.filter(t=>t.position==="dead-center").length,overElement:this.events.filter(t=>t.position==="over-element").length},durations:this.events.map(t=>t.duration),movements:this.events.map(t=>t.movement),inViewport:this.events.filter(t=>t.inViewport).length,trackedElements:this.touchStartListeners.size}}};var W=class extends p{constructor(t){super(),this.name="keyboard",this.defaultWeight=.1,this.events=[],this.targetSelectors=['input[type="text"]','input[type="email"]',"textarea"],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0,this.sessionPauseThreshold=1e3,this.downListener=null,this.upListener=null,this.focusListeners=new Map,this.blurListeners=new Map,this.isActive=!1,t!=null&&t.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachFocusListeners(),this.downListener=t=>{if(!this.focusedElement)return;let e=Date.now(),i=t;this.lastEventTimestamp>0&&e-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:i.key,type:"down",timestamp:e,targetElement:this.focusedElementSelector}),this.notifyEvent(.8),this.lastEventTimestamp=e},this.upListener=t=>{if(!this.focusedElement)return;let e=Date.now(),i=t;this.lastEventTimestamp>0&&e-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:i.key,type:"up",timestamp:e,targetElement:this.focusedElementSelector}),this.lastEventTimestamp=e},document.addEventListener("keydown",this.downListener),document.addEventListener("keyup",this.upListener))}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachFocusListenersForSelector(t))}attachFocusListeners(){this.targetSelectors.forEach(t=>{this.attachFocusListenersForSelector(t)})}attachFocusListenersForSelector(t){document.querySelectorAll(t).forEach(i=>{if(this.focusListeners.has(i))return;let n=()=>{this.focusedElement=i,this.focusedElementSelector=t},o=()=>{this.focusedElement=null,this.focusedElementSelector=""};i.addEventListener("focus",n),i.addEventListener("blur",o),this.focusListeners.set(i,n),this.blurListeners.set(i,o)})}stop(){this.isActive&&(this.isActive=!1,this.downListener&&(document.removeEventListener("keydown",this.downListener),this.downListener=null),this.upListener&&(document.removeEventListener("keyup",this.upListener),this.upListener=null),this.focusListeners.forEach((t,e)=>{e.removeEventListener("focus",t)}),this.focusListeners.clear(),this.blurListeners.forEach((t,e)=>{e.removeEventListener("blur",t)}),this.blurListeners.clear(),this.focusedElement=null)}reset(){this.events=[],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0}score(){if(this.events.length<6)return;let t=this.events.filter(a=>a.type==="down");if(t.length<3)return;let e=0,i=0,n=[];for(let a=1;a<t.length;a++)n.push(t[a].timestamp-t[a-1].timestamp);let o=_(n);if(o){let{statistics:a,allIdentical:c}=o;if(c)return .1;let h=D(a.cv);if(e+=h,i++,h<=.1)return h}let s=[];for(let a=0;a<this.events.length-1;a++)this.events[a].type==="down"&&this.events[a+1].type==="up"&&this.events[a].key===this.events[a+1].key&&s.push(this.events[a+1].timestamp-this.events[a].timestamp);let r=_(s);if(r){let{statistics:a,allIdentical:c}=r;if(c)return .1;if(a.mean<5)e+=.1,i++;else{let h=D(a.cv);if(e+=h,i++,h<=.1)return h}}let l=this.events.filter(a=>a.key==="Backspace").length;if(l>0){let a=l/t.length;a>.05&&a<.3?(e+=1,i++):a>0&&(e+=.8,i++)}return i>0?e/i:void 0}getDebugInfo(){let t=[];for(let e=0;e<this.events.length-1;e++)this.events[e].type==="down"&&this.events[e+1].type==="up"&&this.events[e].key===this.events[e+1].key&&t.push(this.events[e+1].timestamp-this.events[e].timestamp);return{eventCount:this.events.length,downEvents:this.events.filter(e=>e.type==="down").length,upEvents:this.events.filter(e=>e.type==="up").length,backspaceCount:this.events.filter(e=>e.key==="Backspace").length,pressDurations:t,focusedElement:this.focusedElementSelector,trackedElements:this.focusListeners.size}}};var q=["__nightmare","_phantom","callPhantom","__selenium_evaluate","__webdriver_evaluate","__driver_evaluate","__webdriver_script_function","__lastWatirAlert","__lastWatirConfirm","__lastWatirPrompt","_Selenium_IDE_Recorder","domAutomation","domAutomationController","webdriver","_webdriver_script_fn","__webdriver_script_func","__fxdriver_evaluate","__fxdriver_unwrapped","__selenium_unwrapped"],R=class extends p{constructor(){super(...arguments),this.name="environment",this.defaultWeight=.08,this.data=null}start(){this.captureEnvironment()}stop(){}reset(){this.data=null}onTick(t){this.captureEnvironment()}score(){if(!this.data)return;let t=this.data,e=t.automation;if(e.isWebdriver)return .05;if(e.hasAutomationGlobals||e.hasCDPInjection)return .1;if([e.hasHeadlessUA,e.hasChromelessRuntime,e.hasSoftwareRenderer].filter(Boolean).length>=2)return .15;if(e.hasHeadlessUA)return .2;let n=0,o=0;n+=t.suspiciousDimensions?.1:1,n+=t.suspiciousRatio?.2:1,n+=t.featureInconsistency?.3:1,o+=3;let s=[t.hasWebGL,t.hasLocalStorage,t.hasSessionStorage,t.hasIndexedDB].filter(Boolean).length;return n+=s/4,o++,t.isMobile||(n+=A(t.plugins,-2,-.5),n+=t.plugins>0?1:.1,o+=2,e.hasNoPlugins&&t.vendor.includes("Google")&&(n+=.3,o++)),e.hasChromelessRuntime&&(n+=.3,o++),e.hasSoftwareRenderer&&(n+=.4,o++),n+=E(t.devicePixelRatio,2,1.5),n+=t.colorDepth===24||t.colorDepth===32?1:.4,o+=2,o>0?n/o:void 0}isMobileDevice(){let t=navigator.maxTouchPoints>0||"ontouchstart"in window,e=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),i=window.innerWidth<768&&window.innerHeight<1024;return t&&i||e}detectAutomation(){let t=this.isMobileDevice(),e=navigator.webdriver===!0,i=navigator.userAgent,n=/HeadlessChrome|Headless/i.test(i),o=window,s=!!(o.chrome&&typeof o.chrome=="object"&&!o.chrome.runtime),r=[];for(let d of q)d in o&&r.push(d);let l=r.length>0,a=[];try{for(let d of Object.keys(o))/^cdc_|^__cdc_/.test(d)&&a.push(d)}catch(d){}let c=a.length>0,h=!t&&navigator.plugins.length===0,v=!1;try{let d=document.createElement("canvas"),g=d.getContext("webgl")||d.getContext("experimental-webgl");if(g){let u=g.getExtension("WEBGL_debug_renderer_info");if(u){let m=g.getParameter(u.UNMASKED_RENDERER_WEBGL);v=/SwiftShader|Software|LLVMpipe/i.test(m),this._webglRenderer=m}}}catch(d){}return{isWebdriver:e,hasHeadlessUA:n,hasChromelessRuntime:s,hasSoftwareRenderer:v,hasNoPlugins:h,hasAutomationGlobals:l,detectedGlobals:r,hasCDPInjection:c,detectedCDPKeys:a}}captureEnvironment(){try{let t=!1,e;try{let u=document.createElement("canvas"),m=u.getContext("webgl")||u.getContext("experimental-webgl");if(t=!!m,m){let L=m.getExtension("WEBGL_debug_renderer_info");L&&(e=m.getParameter(L.UNMASKED_RENDERER_WEBGL))}}catch(u){t=!1}let i=!!(window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection),n=this.isMobileDevice(),o=window.innerWidth,s=window.innerHeight,r=window.screen.width,l=window.screen.height,a=o===800&&s===600||o===1024&&s===768||o===1280&&s===720||r===800&&l===600,c=o*s/(r*l),h=c===1||c<.1||c>1,v=typeof localStorage!="undefined"&&typeof sessionStorage!="undefined",d=navigator.plugins.length===0&&navigator.mimeTypes.length===0||!t||!v,g=this.detectAutomation();this.data={screenWidth:r,screenHeight:l,windowWidth:o,windowHeight:s,devicePixelRatio:window.devicePixelRatio,colorDepth:window.screen.colorDepth,userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,languages:navigator.languages?Array.from(navigator.languages):[navigator.language],hardwareConcurrency:navigator.hardwareConcurrency,maxTouchPoints:navigator.maxTouchPoints||0,vendor:navigator.vendor,hasWebGL:t,hasWebRTC:i,hasLocalStorage:typeof localStorage!="undefined",hasSessionStorage:typeof sessionStorage!="undefined",hasIndexedDB:"indexedDB"in window,plugins:navigator.plugins.length,mimeTypes:navigator.mimeTypes.length,suspiciousRatio:h,suspiciousDimensions:a,featureInconsistency:d,isMobile:n,timestamp:Date.now(),automation:g,webglRenderer:e}}catch(t){}}getDebugInfo(){return this.data}isMobile(){var t,e;return(e=(t=this.data)===null||t===void 0?void 0:t.isMobile)!==null&&e!==void 0?e:null}getAutomationIndicators(){var t,e;return(e=(t=this.data)===null||t===void 0?void 0:t.automation)!==null&&e!==void 0?e:null}isLikelyBot(){if(!this.data)return null;let t=this.data.automation;return t.isWebdriver||t.hasAutomationGlobals||t.hasCDPInjection||t.hasHeadlessUA}};var F=class extends p{constructor(){super(...arguments),this.name="resize",this.defaultWeight=.02,this.events=[],this.listener=null,this.isActive=!1,this.lastMousePosition=null,this.mouseListener=null}start(){this.isActive||(this.isActive=!0,this.mouseListener=t=>{let e=t;this.lastMousePosition={x:e.clientX,y:e.clientY}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.listener=()=>{var t,e;let i=(t=this.lastMousePosition)===null||t===void 0?void 0:t.x,n=(e=this.lastMousePosition)===null||e===void 0?void 0:e.y,o=!1;i!==void 0&&n!==void 0&&(o=i<50||i>window.innerWidth-50||n<50||n>window.innerHeight-50),this.events.push({width:window.innerWidth,height:window.innerHeight,mouseX:i,mouseY:n,mouseNearEdge:o,timestamp:Date.now()})},window.addEventListener("resize",this.listener))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("resize",this.listener),this.listener=null),this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null))}reset(){this.events=[]}score(){if(this.events.length===0)return;let t=0,e=0;t+=A(this.events.length,5,.5),e++;let i=this.events.filter(n=>n.mouseX!==void 0);if(i.length>0){let n=i.filter(o=>o.mouseNearEdge).length;t+=Y(n/i.length,.5,8),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.events.length,withMouseData:this.events.filter(t=>t.mouseX!==void 0).length}}};function j(){let f=navigator.maxTouchPoints>0||"ontouchstart"in window,t=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),e=window.innerWidth<768&&window.innerHeight<1024;return f&&e||t}var z=class{constructor(){this.detector=null,this.checkInterval=null,this.settings=null}init(t){var e,i,n,o,s,r,l,a,c,h,v,d,g,u,m,L,b,k,M,N,O;this.detector&&this.stop(),this.settings=t,this.detector=new V({pauseOnHidden:t.pauseOnHidden!==void 0?t.pauseOnHidden:!0});let B=j(),y=t.strategies||{},C=B?{mouse:0,scroll:.35,click:0,tap:.35,keyboard:.15,environment:.1,resize:.05}:{mouse:.3,scroll:.15,click:.3,tap:0,keyboard:.1,environment:.08,resize:.02};if(!B&&((e=y.mouse)===null||e===void 0?void 0:e.enabled)!==!1){let w=new I,S=(n=(i=y.mouse)===null||i===void 0?void 0:i.weight)!==null&&n!==void 0?n:C.mouse;this.detector.addStrategy(w,S)}if(((o=y.scroll)===null||o===void 0?void 0:o.enabled)!==!1){let w=new x,S=(r=(s=y.scroll)===null||s===void 0?void 0:s.weight)!==null&&r!==void 0?r:C.scroll;this.detector.addStrategy(w,S)}if(!B&&((l=y.click)===null||l===void 0?void 0:l.enabled)!==!1){let w=new P,S=(c=(a=y.click)===null||a===void 0?void 0:a.weight)!==null&&c!==void 0?c:C.click;this.detector.addStrategy(w,S)}if(B&&((h=y.tap)===null||h===void 0?void 0:h.enabled)!==!1){let w=new H,S=(d=(v=y.tap)===null||v===void 0?void 0:v.weight)!==null&&d!==void 0?d:C.tap;this.detector.addStrategy(w,S)}if(((g=y.keyboard)===null||g===void 0?void 0:g.enabled)!==!1){let w=new W,S=(m=(u=y.keyboard)===null||u===void 0?void 0:u.weight)!==null&&m!==void 0?m:C.keyboard;this.detector.addStrategy(w,S)}if(((L=y.environment)===null||L===void 0?void 0:L.enabled)!==!1){let w=new R,S=(k=(b=y.environment)===null||b===void 0?void 0:b.weight)!==null&&k!==void 0?k:C.environment;this.detector.addStrategy(w,S)}if(((M=y.resize)===null||M===void 0?void 0:M.enabled)!==!1){let w=new F,S=(O=(N=y.resize)===null||N===void 0?void 0:N.weight)!==null&&O!==void 0?O:C.resize;this.detector.addStrategy(w,S)}t.autoStart!==!1&&this.start(),t.checkMs&&t.checkMs>0&&this.startPeriodicCheck(t.checkMs),t.onReady&&t.onReady(this)}start(){this.detector&&this.detector.start()}stop(){this.detector&&this.detector.stop(),this.checkInterval!==null&&(clearInterval(this.checkInterval),this.checkInterval=null)}async score(){return this.detector?this.detector.score({breakdown:!0}):null}startPeriodicCheck(t){this.checkInterval!==null&&clearInterval(this.checkInterval),this.checkInterval=window.setInterval(async()=>{var e,i;let n=await this.score();if(!n||!this.settings)return;this.settings.onScore&&this.settings.onScore(n);let o=(e=this.settings.botThreshold)!==null&&e!==void 0?e:.3,s=(i=this.settings.humanThreshold)!==null&&i!==void 0?i:.7;n.score<o&&this.settings.ifBot?this.settings.ifBot(n):n.score>=s&&this.settings.ifHuman&&this.settings.ifHuman(n)},t)}getDetector(){return this.detector}},X=new z;if(typeof window!="undefined"){window.BehaviorDetector=X;let f=()=>{let t=window.bdSettings;t&&X.init(t)};f(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",f)}})();
|
|
2
2
|
//# sourceMappingURL=behavior-detection.min.js.map
|