@botsigged/sdk 1.0.7 → 1.0.8

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/botsigged.js CHANGED
@@ -1,46 +1,4 @@
1
- (()=>{var{defineProperty:h,getOwnPropertyNames:VA,getOwnPropertyDescriptor:DA}=Object,HA=Object.prototype.hasOwnProperty;var BA=new WeakMap,$A=(A)=>{var B=BA.get(A),Q;if(B)return B;if(B=h({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function")VA(A).map((E)=>!HA.call(B,E)&&h(B,E,{get:()=>A[E],enumerable:!(Q=DA(A,E))||Q.enumerable}));return BA.set(A,B),B};var v=(A,B)=>{for(var Q in B)h(A,Q,{get:B[Q],enumerable:!0,configurable:!0,set:(E)=>B[Q]=()=>E})};var g=(A,B)=>()=>(A&&(B=A(A=0)),B);var CA="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";function NA(A){let B=atob(A),Q=new Uint8Array(B.length);for(let E=0;E<B.length;E++)Q[E]=B.charCodeAt(E);return Q}async function c(){if(j)return j;return j=(async()=>{try{let A=NA(CA),B=await WebAssembly.compile(A);return l=(await WebAssembly.instantiate(B,{env:{abort:(E,I,C,Y)=>{}}})).exports,LA(l)}catch(A){throw j=null,A}})(),j}function a(){return l!==null}function LA(A){function B(I){let C=A.__new(I.length,1);return new Uint8Array(A.memory.buffer,C,I.length).set(I),C}function Q(I){let C=new Uint16Array(I.length);for(let Z=0;Z<I.length;Z++)C[Z]=I.charCodeAt(Z);let Y=A.__new(C.length*2,2);return new Uint16Array(A.memory.buffer,Y,C.length).set(C),Y}function E(I,C=1024){let Y=new Uint8Array(A.memory.buffer),G=Y.length;if(I<0||I>=G)return"";let Z=I,W=Math.min(I+C,G);while(Z<W&&Y[Z]!==0)Z++;let X=Y.slice(I,Z);return new TextDecoder().decode(X)}return{xxHash32(I,C=0){let Y=B(I);try{return A.xxHash32(Y,C)}finally{A.__unpin(Y)}},hashString(I,C=0){let Y=Q(I);try{return A.hashString(Y,C)}finally{A.__unpin(Y)}},hashStringToHex(I,C=0){let Y=Q(I);try{let G=A.hashStringToHex(Y,C);return E(G)}finally{A.__unpin(Y)}},verifyHash(I,C,Y=0){let G=B(I);try{return A.verifyHash(G,C,Y)}finally{A.__unpin(G)}},verifyStringHash(I,C,Y=0){let G=Q(I);try{return A.verifyStringHash(G,C,Y)}finally{A.__unpin(G)}}}}function P(){let A=new TextEncoder;function B(E,I=0){let X=(N,H)=>(N<<H|N>>>32-H)>>>0,L=(N,H)=>(N[H]|N[H+1]<<8|N[H+2]<<16|N[H+3]<<24)>>>0,D=E.length,z,q=0;if(D>=16){let N=D-16,H=I+2654435761+2246822519>>>0,T=I+2246822519>>>0,S=I>>>0,x=I-2654435761>>>0;while(q<=N)H=Math.imul(X(H+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4,T=Math.imul(X(T+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4,S=Math.imul(X(S+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4,x=Math.imul(X(x+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4;z=X(H,1)+X(T,7)+X(S,12)+X(x,18)>>>0}else z=I+374761393>>>0;z=z+D>>>0;while(q<=D-4)z=Math.imul(X(z+Math.imul(L(E,q),3266489917)>>>0,17),668265263)>>>0,q+=4;while(q<D)z=Math.imul(X(z+Math.imul(E[q],374761393)>>>0,11),2654435761)>>>0,q++;return z^=z>>>15,z=Math.imul(z,2246822519)>>>0,z^=z>>>13,z=Math.imul(z,3266489917)>>>0,z^=z>>>16,z>>>0}function Q(E){return(E>>>0).toString(16).padStart(8,"0")}return{xxHash32:B,hashString(E,I=0){return B(A.encode(E),I)},hashStringToHex(E,I=0){return Q(B(A.encode(E),I))},verifyHash(E,I,C=0){return B(E,C)===I},verifyStringHash(E,I,C=0){return B(A.encode(E),C)===I}}}var l=null,j=null;var YA=()=>{};var JA={};v(JA,{verifySignature:()=>FA,verify:()=>OA,loadHashModule:()=>c,isUsingWasm:()=>wA,isHashModuleLoaded:()=>a,initHashModule:()=>kA,hashToHex:()=>i,hash:()=>UA,getHash:()=>U,createSignature:()=>GA,createFallbackHashModule:()=>P});async function kA(A={}){let{preferWasm:B=!0,onWasmLoaded:Q,onFallback:E}=A;if($)return $;if(M)return M;return M=(async()=>{if(B)try{return $=await c(),y=!0,Q?.(),$}catch(I){let C=I instanceof Error?I.message:"Unknown error";E?.(C)}else E?.("WASM disabled by configuration");return $=P(),y=!1,$})(),M}function U(){if($)return $;return $=P(),y=!1,$}function wA(){return y&&a()}function UA(A,B=0){let Q=U();if(typeof A==="string")return Q.hashString(A,B);return Q.xxHash32(A,B)}function i(A,B=0){let Q=U();if(typeof A==="string")return Q.hashStringToHex(A,B);return Q.xxHash32(A,B).toString(16).padStart(8,"0")}function OA(A,B,Q=0){let E=U(),I=typeof B==="string"?parseInt(B,16):B;if(typeof A==="string")return E.verifyStringHash(A,I,Q);return E.verifyHash(A,I,Q)}function GA(A,B){let Q=U(),E=Q.hashString(B,0);return Q.hashString(A,E).toString(16).padStart(8,"0")}function FA(A,B,Q){return GA(A,Q)===B}var $=null,M=null,y=!0;var b=g(()=>{YA()});class AA{overlay=null;messageEl=null;progressEl=null;config;constructor(A){this.config=A}show(){if(!this.config.enabled||this.overlay)return;this.overlay=document.createElement("div"),this.overlay.id="botsigged-challenge-overlay",this.overlay.style.cssText=`
2
- position: fixed;
3
- top: 0;
4
- left: 0;
5
- width: 100%;
6
- height: 100%;
7
- background: ${this.config.backgroundColor};
8
- display: flex;
9
- flex-direction: column;
10
- align-items: center;
11
- justify-content: center;
12
- z-index: ${this.config.zIndex};
13
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14
- `;let A=document.createElement("div");A.style.cssText=`
15
- width: 48px;
16
- height: 48px;
17
- border: 4px solid ${this.config.textColor}33;
18
- border-top-color: ${this.config.spinnerColor};
19
- border-radius: 50%;
20
- animation: botsigged-spin 1s linear infinite;
21
- margin-bottom: 20px;
22
- `,this.messageEl=document.createElement("span"),this.messageEl.textContent=this.config.message,this.messageEl.style.cssText=`
23
- color: ${this.config.textColor};
24
- font-size: 18px;
25
- font-weight: 500;
26
- margin-bottom: 12px;
27
- `;let B=document.createElement("div");B.style.cssText=`
28
- width: 200px;
29
- height: 4px;
30
- background: ${this.config.textColor}33;
31
- border-radius: 2px;
32
- overflow: hidden;
33
- `,this.progressEl=document.createElement("div"),this.progressEl.style.cssText=`
34
- width: 0%;
35
- height: 100%;
36
- background: ${this.config.spinnerColor};
37
- border-radius: 2px;
38
- transition: width 0.1s ease-out;
39
- `,B.appendChild(this.progressEl);let Q=document.createElement("style");Q.textContent=`
40
- @keyframes botsigged-spin {
41
- to { transform: rotate(360deg); }
42
- }
43
- `,document.head.appendChild(Q),this.overlay.appendChild(A),this.overlay.appendChild(this.messageEl),this.overlay.appendChild(B),document.body.appendChild(this.overlay)}setProgress(A){if(this.progressEl){let B=Math.min(100,Math.max(0,A*100));this.progressEl.style.width=`${B}%`}}showSuccess(){if(this.messageEl)this.messageEl.textContent=this.config.successMessage;if(this.progressEl)this.progressEl.style.width="100%"}hide(){if(this.overlay)this.overlay.remove(),this.overlay=null,this.messageEl=null,this.progressEl=null}isVisible(){return this.overlay!==null}}var WA={};v(WA,{ChallengeManager:()=>KA});function _A(){let A=new Uint8Array(16);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(A);else for(let B=0;B<16;B++)A[B]=Math.floor(Math.random()*256);return A}function PA(A){if(A===0)return 32;let B=0;if((A&4294901760)===0)B+=16,A<<=16;if((A&4278190080)===0)B+=8,A<<=8;if((A&4026531840)===0)B+=4,A<<=4;if((A&3221225472)===0)B+=2,A<<=2;if((A&2147483648)===0)B+=1;return B}function MA(A,B,Q,E){let I=U(),C=new Uint8Array(A.length+4);C.set(A);let Y=E,G=0;while(G<Q){C[A.length]=Y&255,C[A.length+1]=Y>>>8&255,C[A.length+2]=Y>>>16&255,C[A.length+3]=Y>>>24&255;let Z=I.xxHash32(C,0);if(G++,PA(Z)>=B)return{nonce:Y,found:!0,iterations:G};Y=Y+1>>>0}return{nonce:Y,found:!1,iterations:G}}class KA{config;overlay;solving=!1;solved=!1;pendingForms=new Map;formHandler=null;formObserver=null;resubmitting=!1;debug;constructor(A,B=!1){this.config=A,this.debug=B,this.overlay=new AA(A.ui)}getDifficultyForLevel(A){let B=this.config.difficulty;switch(A){case"critical":return B.critical;case"high":return B.high;case"medium":return B.medium;default:return 0}}shouldChallenge(A){if(!this.config.enabled||this.solved)return!1;let B=["low","medium","high","critical"],Q=B.indexOf(A),E=B.indexOf(this.config.minLevel);return Q>=E}blockFormsUntilSolved(A){if(this.formHandler)return;this.formHandler=(B)=>{if(this.solved||this.resubmitting)return;B.preventDefault(),B.stopPropagation();let Q=B.target;if(!this.pendingForms.has(Q))this.pendingForms.set(Q,B);if(!this.solving)this.startChallenge(A)},document.querySelectorAll("form").forEach((B)=>{B.addEventListener("submit",this.formHandler,!0)}),this.formObserver=new MutationObserver((B)=>{B.forEach((Q)=>{Q.addedNodes.forEach((E)=>{if(E instanceof HTMLFormElement&&this.formHandler)E.addEventListener("submit",this.formHandler,!0);if(E instanceof HTMLElement&&this.formHandler)E.querySelectorAll("form").forEach((I)=>{I.addEventListener("submit",this.formHandler,!0)})})})}),this.formObserver.observe(document.body,{childList:!0,subtree:!0}),this.log("Forms blocked, challenge required")}async startChallenge(A){if(this.solving||this.solved)return;this.solving=!0;let B=this.getDifficultyForLevel(A),Q=_A(),E=performance.now();this.log(`Starting challenge: difficulty=${B}, level=${A}`),this.config.onChallengeStart?.(A,B),this.overlay.show();let I=1<<B,C=0,Y=0,G;do{await new Promise((L)=>setTimeout(L,0)),G=MA(Q,B,this.config.chunkSize,C),Y+=G.iterations,C=G.nonce+1;let X=Math.min(1,Y/I);this.overlay.setProgress(X),this.config.onChallengeProgress?.(X,Y)}while(!G.found);let Z=performance.now()-E;this.log(`Challenge solved: nonce=${G.nonce}, iterations=${Y}, time=${Z.toFixed(0)}ms`),this.overlay.showSuccess(),await new Promise((X)=>setTimeout(X,500)),this.overlay.hide(),this.solved=!0,this.solving=!1;let W={solveTimeMs:Z,iterations:Y,difficulty:B,level:A,nonce:G.nonce};this.config.onChallengeComplete?.(W),this.unblockForms()}unblockForms(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.formHandler)document.querySelectorAll("form").forEach((A)=>{A.removeEventListener("submit",this.formHandler,!0)}),this.formHandler=null;this.log("Forms unblocked"),this.resubmitting=!0,this.pendingForms.forEach((A,B)=>{if(this.log("Resubmitting pending form"),B.requestSubmit)B.requestSubmit();else B.submit()}),this.pendingForms.clear(),this.resubmitting=!1}isSolving(){return this.solving}isSolved(){return this.solved}reset(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.formHandler)document.querySelectorAll("form").forEach((A)=>{A.removeEventListener("submit",this.formHandler,!0)}),this.formHandler=null;this.solved=!1,this.solving=!1,this.resubmitting=!1,this.pendingForms.clear()}log(...A){if(this.debug);}}var qA=g(()=>{b()});var yA={};v(yA,{BotSigged:()=>K});function QA(A){return typeof A==="object"&&A!==null&&"code"in A&&A.code==="LIMIT_EXCEEDED"}var R={endpoint:"wss://botsigged.com/sdk/websocket",debug:!1,sendInterval:2000,maxBufferSize:1000,mouseSampleRate:0.5,autoStart:!0,actionThreshold:70,action:"none",minAlertLevel:"high",botScoreThresholds:{medium:40,high:70,critical:90},hashVerification:{enabled:!1,preferWasm:!0},challenge:{enabled:!1,minLevel:"high",chunkSize:1e4,difficulty:{medium:12,high:16,critical:20},ui:{enabled:!0,message:"Verifying you're human...",successMessage:"Verified!",backgroundColor:"rgba(0, 0, 0, 0.7)",textColor:"#ffffff",spinnerColor:"#3b82f6",zIndex:999999}},formProtection:{mode:"auto",minTimeBeforeSubmit:500,maxHoldTime:3000,showLoadingUI:!0,loadingMessage:"Please wait..."},fallbackMode:"degraded"},EA={action:"none",form_protection_mode:"none"};function IA(A){let B=A.action??R.action,Q=B==="challenge"||A.challenge?.enabled;return{apiKey:A.apiKey,accountId:A.accountId,endpoint:A.endpoint??R.endpoint,debug:A.debug??R.debug,sendInterval:A.sendInterval??R.sendInterval,maxBufferSize:A.maxBufferSize??R.maxBufferSize,mouseSampleRate:A.mouseSampleRate??R.mouseSampleRate,autoStart:A.autoStart??R.autoStart,actionThreshold:A.actionThreshold??R.actionThreshold,action:B,minAlertLevel:A.minAlertLevel??R.minAlertLevel,botScoreThresholds:{...R.botScoreThresholds,...A.botScoreThresholds},hashVerification:{...R.hashVerification,...A.hashVerification},challenge:{enabled:Q,minLevel:A.challenge?.minLevel??R.challenge.minLevel,chunkSize:A.challenge?.chunkSize??R.challenge.chunkSize,difficulty:{...R.challenge.difficulty,...A.challenge?.difficulty},ui:{...R.challenge.ui,...A.challenge?.ui},onChallengeStart:A.challenge?.onChallengeStart,onChallengeComplete:A.challenge?.onChallengeComplete,onChallengeProgress:A.challenge?.onChallengeProgress},formProtection:{mode:A.formProtection?.mode??R.formProtection.mode,minTimeBeforeSubmit:A.formProtection?.minTimeBeforeSubmit??R.formProtection.minTimeBeforeSubmit,maxHoldTime:A.formProtection?.maxHoldTime??R.formProtection.maxHoldTime,showLoadingUI:A.formProtection?.showLoadingUI??R.formProtection.showLoadingUI,loadingMessage:A.formProtection?.loadingMessage??R.formProtection.loadingMessage,onHold:A.formProtection?.onHold,onRelease:A.formProtection?.onRelease,onBlock:A.formProtection?.onBlock},fallbackMode:A.fallbackMode??R.fallbackMode,cookie:A.cookie,headers:A.headers,formInject:A.formInject,onScoreUpdate:A.onScoreUpdate,onConnectionChange:A.onConnectionChange,onError:A.onError,onUsageLimitExceeded:A.onUsageLimitExceeded,onHighBotScore:A.onHighBotScore,onServerConfig:A.onServerConfig,onServerAction:A.onServerAction}}class u{events=[];startTime=0;sampleRate;maxBufferSize;isListening=!1;boundHandleMouseMove;boundHandleMouseDown;boundHandleMouseUp;boundHandleClick;constructor(A={}){this.sampleRate=A.sampleRate??0.5,this.maxBufferSize=A.maxBufferSize??500,this.boundHandleMouseMove=this.handleMouseMove.bind(this),this.boundHandleMouseDown=this.handleMouseDown.bind(this),this.boundHandleMouseUp=this.handleMouseUp.bind(this),this.boundHandleClick=this.handleClick.bind(this)}start(){if(this.isListening)return;this.startTime=Date.now(),document.addEventListener("mousemove",this.boundHandleMouseMove,{passive:!0}),document.addEventListener("mousedown",this.boundHandleMouseDown,{passive:!0}),document.addEventListener("mouseup",this.boundHandleMouseUp,{passive:!0}),document.addEventListener("click",this.boundHandleClick,{passive:!0}),this.isListening=!0}stop(){if(!this.isListening)return;document.removeEventListener("mousemove",this.boundHandleMouseMove),document.removeEventListener("mousedown",this.boundHandleMouseDown),document.removeEventListener("mouseup",this.boundHandleMouseUp),document.removeEventListener("click",this.boundHandleClick),this.isListening=!1}addEvent(A){if(this.events.push(A),this.events.length>this.maxBufferSize)this.events.shift()}handleMouseMove(A){if(Math.random()>this.sampleRate)return;this.addEvent({type:"move",x:A.clientX,y:A.clientY,t:Date.now()})}handleMouseDown(A){this.addEvent({type:"down",x:A.clientX,y:A.clientY,t:Date.now(),button:A.button})}handleMouseUp(A){this.addEvent({type:"up",x:A.clientX,y:A.clientY,t:Date.now(),button:A.button})}handleClick(A){let B=A.target,Q,E;if(B&&B.getBoundingClientRect){let I=B.getBoundingClientRect();Q={top:I.top,left:I.left,width:I.width,height:I.height},E=B.tagName?.toLowerCase()}this.addEvent({type:"click",x:A.clientX,y:A.clientY,t:Date.now(),button:A.button,targetRect:Q,targetTag:E})}getSignal(){return{events:[...this.events],start_time:this.startTime}}flush(){this.events=[]}getBufferSize(){return this.events.length}reset(){this.events=[],this.startTime=Date.now()}}class p{events=[];startTime=0;maxBufferSize;isListening=!1;boundHandleScroll;constructor(A={}){this.maxBufferSize=A.maxBufferSize??200,this.boundHandleScroll=this.handleScroll.bind(this)}start(){if(this.isListening)return;this.startTime=Date.now(),window.addEventListener("scroll",this.boundHandleScroll,{passive:!0}),this.isListening=!0}stop(){if(!this.isListening)return;window.removeEventListener("scroll",this.boundHandleScroll),this.isListening=!1}handleScroll(){if(this.events.push({y:window.scrollY,t:Date.now()}),this.events.length>this.maxBufferSize)this.events.shift()}getSignal(){return{events:[...this.events],start_time:this.startTime}}flush(){this.events=[]}getBufferSize(){return this.events.length}reset(){this.events=[],this.startTime=Date.now()}}class k{static instance=null;timings={signalRoundtrips:[]};pendingSignals=new Map;constructor(){this.timings.scriptStart=performance.now()}static getInstance(){if(!k.instance)k.instance=new k;return k.instance}static reset(){k.instance=null}markScriptStart(){this.timings.scriptStart=performance.now()}markConstructorStart(){this.timings.constructorStart=performance.now()}markConstructorEnd(){this.timings.constructorEnd=performance.now()}markStartCalled(){this.timings.startCalled=performance.now()}markSdkReady(){this.timings.sdkReady=performance.now()}markFingerprintStart(){this.timings.fingerprintStart=performance.now()}markFingerprintEnd(){this.timings.fingerprintEnd=performance.now()}markWsConnectStart(){this.timings.wsConnectStart=performance.now()}markWsConnectEnd(){this.timings.wsConnectEnd=performance.now()}markChannelJoinStart(){this.timings.channelJoinStart=performance.now()}markChannelJoinEnd(){this.timings.channelJoinEnd=performance.now()}markInitialScoreReceived(){this.timings.initialScoreReceived=performance.now()}markFormCollectorStart(){this.timings.formCollectorStart=performance.now()}markFormCollectorReady(){this.timings.formCollectorReady=performance.now()}markFirstFormInteraction(){if(!this.timings.firstFormInteraction){if(this.timings.firstFormInteraction=performance.now(),this.timings.sdkReady)this.timings.timeToFirstInteraction=this.timings.firstFormInteraction-this.timings.sdkReady}}markFirstSubmitAttempt(A){if(!this.timings.firstSubmitAttempt)this.timings.firstSubmitAttempt=performance.now(),this.timings.hadScoreBeforeSubmit=A}markSignalSent(A){this.pendingSignals.set(A,performance.now())}markSignalResponseReceived(A){let B=this.pendingSignals.get(A);if(B!==void 0){let Q=performance.now(),E={sentAt:B,receivedAt:Q,roundtripMs:Q-B,seq:A};this.timings.signalRoundtrips?.push(E),this.pendingSignals.delete(A)}}getTimings(){return{...this.timings}}getSummary(){let A=this.timings,B=A.signalRoundtrips||[],Q=0,E=1/0,I=0;if(B.length>0)Q=B.reduce((D,z)=>D+z.roundtripMs,0)/B.length,E=Math.min(...B.map((D)=>D.roundtripMs)),I=Math.max(...B.map((D)=>D.roundtripMs));let C=(A.sdkReady??0)-(A.scriptStart??0),Y=(A.fingerprintEnd??0)-(A.fingerprintStart??0),G=(A.wsConnectEnd??0)-(A.wsConnectStart??0),Z=(A.channelJoinEnd??0)-(A.channelJoinStart??0),W=(A.initialScoreReceived??0)-(A.startCalled??0),X=(A.initialScoreReceived??0)-(A.scriptStart??0);return{totalStartupMs:Math.round(C),fingerprintMs:Math.round(Y),wsConnectionMs:Math.round(G),channelJoinMs:Math.round(Z),timeToFirstScoreMs:Math.round(W),avgSignalRoundtripMs:Math.round(Q),minSignalRoundtripMs:E===1/0?0:Math.round(E),maxSignalRoundtripMs:Math.round(I),vulnerabilityWindowMs:Math.round(X),protectedBeforeSubmit:A.hadScoreBeforeSubmit??!1}}logSummary(){let A=this.getSummary(),B=this.timings;if(B.firstFormInteraction);if(B.firstSubmitAttempt);if(A.vulnerabilityWindowMs>0);}getReport(){return{timings:this.timings,summary:this.getSummary(),userAgent:navigator.userAgent,timestamp:Date.now()}}}var J=k.getInstance();function O(){return k.getInstance()}var _="__bs_ghost_value";class m{keyEvents=[];focusEvents=[];pasteEvents=[];inputEvents=[];submitCount=0;startTime=0;maxKeyEvents;maxFocusEvents;maxInputEvents;isListening=!1;valueSetterHooked=!1;onSubmit;originalInputDescriptor;originalTextareaDescriptor;lastKeyWasTab=!1;currentField=null;emailDomains=new Set;boundHandleFocusIn;boundHandleFocusOut;boundHandleKeyDown;boundHandleKeyUp;boundHandlePaste;boundHandleSubmit;boundHandleClick;boundHandleInput;boundHandleGhostValue;constructor(A={}){this.maxKeyEvents=A.maxKeyEvents??500,this.maxFocusEvents=A.maxFocusEvents??100,this.maxInputEvents=A.maxInputEvents??200,this.onSubmit=A.onSubmit,this.boundHandleFocusIn=this.handleFocusIn.bind(this),this.boundHandleFocusOut=this.handleFocusOut.bind(this),this.boundHandleKeyDown=this.handleKeyDown.bind(this),this.boundHandleKeyUp=this.handleKeyUp.bind(this),this.boundHandlePaste=this.handlePaste.bind(this),this.boundHandleSubmit=this.handleSubmit.bind(this),this.boundHandleClick=this.handleClick.bind(this),this.boundHandleInput=this.handleInput.bind(this),this.boundHandleGhostValue=this.handleGhostValue.bind(this)}start(){if(this.isListening)return;this.startTime=Date.now(),document.addEventListener("focusin",this.boundHandleFocusIn,{passive:!0,capture:!0}),document.addEventListener("focusout",this.boundHandleFocusOut,{passive:!0,capture:!0}),document.addEventListener("keydown",this.boundHandleKeyDown,{passive:!0}),document.addEventListener("keyup",this.boundHandleKeyUp,{passive:!0}),document.addEventListener("paste",this.boundHandlePaste,{passive:!0}),document.addEventListener("submit",this.boundHandleSubmit,{passive:!0}),document.addEventListener("click",this.boundHandleClick,{passive:!0}),document.addEventListener("input",this.boundHandleInput,{passive:!0}),document.addEventListener(_,this.boundHandleGhostValue,{passive:!0}),this.hookValueSetters(),this.isListening=!0}stop(){if(!this.isListening)return;document.removeEventListener("focusin",this.boundHandleFocusIn,{capture:!0}),document.removeEventListener("focusout",this.boundHandleFocusOut,{capture:!0}),document.removeEventListener("keydown",this.boundHandleKeyDown),document.removeEventListener("keyup",this.boundHandleKeyUp),document.removeEventListener("paste",this.boundHandlePaste),document.removeEventListener("submit",this.boundHandleSubmit),document.removeEventListener("click",this.boundHandleClick),document.removeEventListener("input",this.boundHandleInput),document.removeEventListener(_,this.boundHandleGhostValue),this.unhookValueSetters(),this.isListening=!1}isFormInput(A){if(!A||!(A instanceof HTMLElement))return!1;let B=A.tagName.toLowerCase();if(B==="textarea"||B==="select")return!0;if(B==="input"){let Q=A.type.toLowerCase();return!["submit","button","reset","hidden","image"].includes(Q)}return!1}isEmailField(A){let B=A.type?.toLowerCase()||"",Q=(A.name||"").toLowerCase(),E=(A.id||"").toLowerCase();return B==="email"||Q.includes("email")||Q.includes("e-mail")||E.includes("email")||E.includes("e-mail")}extractEmailDomain(A){if(!A||typeof A!=="string")return null;let B=A.trim();if(!B)return null;let Q=B.match(/@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/);return Q?Q[1].toLowerCase():null}getFieldId(A){return A.id||A.getAttribute("name")||`field-${A.tagName.toLowerCase()}`}handleFocusIn(A){if(!this.isFormInput(A.target))return;O().markFirstFormInteraction();let B=this.getFieldId(A.target),Q="direct";if(this.lastKeyWasTab)Q="tab";if(this.focusEvents.push({type:"focus",field:B,t:Date.now(),method:Q}),this.focusEvents.length>this.maxFocusEvents)this.focusEvents.shift();this.currentField=B,this.lastKeyWasTab=!1}handleFocusOut(A){if(!this.isFormInput(A.target))return;let B=A.target,Q=this.getFieldId(B);if(this.focusEvents.push({type:"blur",field:Q,t:Date.now()}),this.focusEvents.length>this.maxFocusEvents)this.focusEvents.shift();if(B instanceof HTMLInputElement&&this.isEmailField(B)){let E=this.extractEmailDomain(B.value);if(E)this.emailDomains.add(E)}this.currentField=null}handleClick(A){if(!this.isFormInput(A.target))return;let B=this.focusEvents[this.focusEvents.length-1];if(B&&B.type==="focus"&&Date.now()-B.t<50)B.method="click"}handleKeyDown(A){if(A.key==="Tab"){this.lastKeyWasTab=!0;return}if(!this.isFormInput(A.target))return;let B="key";if(A.key==="Backspace")B="backspace";else if(A.key==="Delete")B="delete";else if(A.key==="Enter")B="enter";else if(A.key==="Tab")B="tab";else if(A.key.length===1)B="char";else if(A.key.startsWith("Arrow"))B="arrow";if(this.keyEvents.push({type:"down",code:B,t:Date.now(),field:this.currentField||void 0}),this.keyEvents.length>this.maxKeyEvents)this.keyEvents.shift()}handleKeyUp(A){if(!this.isFormInput(A.target))return;let B="key";if(A.key==="Backspace")B="backspace";else if(A.key==="Delete")B="delete";else if(A.key.length===1)B="char";if(this.keyEvents.push({type:"up",code:B,t:Date.now(),field:this.currentField||void 0}),this.keyEvents.length>this.maxKeyEvents)this.keyEvents.shift()}handleInput(A){if(!this.isFormInput(A.target))return;let B=A.target,E=A.inputType||"unknown",I=B.value?.length??0;if(this.inputEvents.push({field:this.getFieldId(B),t:Date.now(),inputType:E,valueLength:I}),this.inputEvents.length>this.maxInputEvents)this.inputEvents.shift()}handlePaste(A){if(!this.isFormInput(A.target))return;let B=A.clipboardData?.getData("text")||"";this.pasteEvents.push({field:this.getFieldId(A.target),t:Date.now(),length:B.length})}handleSubmit(A){this.submitCount++;let B=A.target;if(B&&B.elements)for(let Q=0;Q<B.elements.length;Q++){let E=B.elements[Q];if(E instanceof HTMLInputElement&&this.isEmailField(E)){let I=this.extractEmailDomain(E.value);if(I)this.emailDomains.add(I)}}this.onSubmit?.()}getSignal(){return{keys:[...this.keyEvents],focus:[...this.focusEvents],pastes:[...this.pasteEvents],inputs:[...this.inputEvents],submits:this.submitCount,start_time:this.startTime,email_domains:this.emailDomains.size>0?Array.from(this.emailDomains):void 0}}flush(){this.keyEvents=[],this.focusEvents=[],this.pasteEvents=[],this.inputEvents=[]}getBufferSize(){return this.keyEvents.length+this.focusEvents.length+this.pasteEvents.length+this.inputEvents.length}reset(){this.keyEvents=[],this.focusEvents=[],this.pasteEvents=[],this.inputEvents=[],this.submitCount=0,this.startTime=Date.now(),this.lastKeyWasTab=!1,this.currentField=null,this.emailDomains.clear()}hookValueSetters(){if(this.valueSetterHooked)return;if(this.originalInputDescriptor=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value"),this.originalInputDescriptor){let A=this.originalInputDescriptor.set,B=this.originalInputDescriptor.get;Object.defineProperty(HTMLInputElement.prototype,"value",{configurable:!0,enumerable:!0,get(){return B?.call(this)},set(Q){let E=B?.call(this)??"";A?.call(this,Q);let I=Q??"";if(I!==E)this.dispatchEvent(new CustomEvent(_,{bubbles:!0,detail:{valueLength:I.length,wasEmpty:E.length===0}}))}})}if(this.originalTextareaDescriptor=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value"),this.originalTextareaDescriptor){let A=this.originalTextareaDescriptor.set,B=this.originalTextareaDescriptor.get;Object.defineProperty(HTMLTextAreaElement.prototype,"value",{configurable:!0,enumerable:!0,get(){return B?.call(this)},set(Q){let E=B?.call(this)??"";A?.call(this,Q);let I=Q??"";if(I!==E)this.dispatchEvent(new CustomEvent(_,{bubbles:!0,detail:{valueLength:I.length,wasEmpty:E.length===0}}))}})}this.valueSetterHooked=!0}unhookValueSetters(){if(!this.valueSetterHooked)return;if(this.originalInputDescriptor)Object.defineProperty(HTMLInputElement.prototype,"value",this.originalInputDescriptor);if(this.originalTextareaDescriptor)Object.defineProperty(HTMLTextAreaElement.prototype,"value",this.originalTextareaDescriptor);this.valueSetterHooked=!1}handleGhostValue(A){let B=A.target;if(!this.isFormInput(B))return;let E=A.detail?.valueLength??0;if(this.inputEvents.push({field:this.getFieldId(B),t:Date.now(),inputType:"programmatic",valueLength:E}),this.inputEvents.length>this.maxInputEvents)this.inputEvents.shift()}}class d{cachedSignal=null;collect(){if(this.cachedSignal)return this.cachedSignal;let A=navigator,B=window;return this.cachedSignal={user_agent:navigator.userAgent,platform:navigator.platform,language:navigator.language,languages:[...navigator.languages||[]],hardware_concurrency:navigator.hardwareConcurrency??null,device_memory:A.deviceMemory??null,max_touch_points:navigator.maxTouchPoints??0,screen_width:screen.width,screen_height:screen.height,screen_avail_width:screen.availWidth,screen_avail_height:screen.availHeight,color_depth:screen.colorDepth,pixel_ratio:window.devicePixelRatio??1,...this.getWebGLInfo(),plugins_count:navigator.plugins?.length??0,mime_types_count:navigator.mimeTypes?.length??0,timezone:this.getTimezone(),timezone_offset:new Date().getTimezoneOffset(),has_webdriver:A.webdriver===!0,has_chrome_runtime:!!B.chrome?.runtime,has_chrome_app:!!B.chrome?.app,has_notification_api:"Notification"in window,has_permissions_api:"permissions"in navigator,outer_dimensions:{width:window.outerWidth,height:window.outerHeight},inner_dimensions:{width:window.innerWidth,height:window.innerHeight},notification_permission:this.getNotificationPermission()},this.cachedSignal}getWebGLInfo(){try{let A=document.createElement("canvas"),B=A.getContext("webgl")||A.getContext("experimental-webgl");if(!B||!(B instanceof WebGLRenderingContext))return{webgl_vendor:null,webgl_renderer:null};let Q=B.getExtension("WEBGL_debug_renderer_info");if(!Q)return{webgl_vendor:null,webgl_renderer:null};return{webgl_vendor:B.getParameter(Q.UNMASKED_VENDOR_WEBGL),webgl_renderer:B.getParameter(Q.UNMASKED_RENDERER_WEBGL)}}catch{return{webgl_vendor:null,webgl_renderer:null}}}getTimezone(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return null}}getNotificationPermission(){if("Notification"in window)return Notification.permission;return null}getSignal(){return this.collect()}reset(){this.cachedSignal=null}}b();class s{cachedFingerprint=null;async generate(){if(this.cachedFingerprint)return this.cachedFingerprint;let[A,B,Q,E,I]=await Promise.all([this.getCanvasHash(),this.getWebGLData(),this.getAudioHash(),this.getFontData(),this.getScreenHash()]),C={hash:"",canvas_hash:A,webgl_hash:B.hash,audio_hash:Q,font_hash:E.hash,screen_hash:I,webgl_vendor:B.vendor,webgl_renderer:B.renderer,timezone:this.getTimezone(),language:this.getLanguage(),platform:this.getPlatform(),font_count:E.count};return C.hash=await this.generateMainHash(C),this.cachedFingerprint=C,C}getFingerprint(){return this.cachedFingerprint}reset(){this.cachedFingerprint=null}async getCanvasHash(){try{let A=document.createElement("canvas");A.width=200,A.height=50;let B=A.getContext("2d");if(!B)return null;B.textBaseline="top",B.font="14px 'Arial'",B.fillStyle="#f60",B.fillRect(125,1,62,20),B.fillStyle="#069",B.fillText("BotSigged,\uD83C\uDFA8",2,15),B.fillStyle="rgba(102, 204, 0, 0.7)",B.fillText("BotSigged,\uD83C\uDFA8",4,17);let Q=A.toDataURL();return this.hashString(Q)}catch{return null}}async getWebGLData(){try{let A=document.createElement("canvas"),B=A.getContext("webgl")||A.getContext("experimental-webgl");if(!B||!(B instanceof WebGLRenderingContext))return{hash:null,vendor:null,renderer:null};let Q=[],E=[B.ALIASED_LINE_WIDTH_RANGE,B.ALIASED_POINT_SIZE_RANGE,B.ALPHA_BITS,B.BLUE_BITS,B.DEPTH_BITS,B.GREEN_BITS,B.MAX_COMBINED_TEXTURE_IMAGE_UNITS,B.MAX_CUBE_MAP_TEXTURE_SIZE,B.MAX_FRAGMENT_UNIFORM_VECTORS,B.MAX_RENDERBUFFER_SIZE,B.MAX_TEXTURE_IMAGE_UNITS,B.MAX_TEXTURE_SIZE,B.MAX_VARYING_VECTORS,B.MAX_VERTEX_ATTRIBS,B.MAX_VERTEX_TEXTURE_IMAGE_UNITS,B.MAX_VERTEX_UNIFORM_VECTORS,B.MAX_VIEWPORT_DIMS,B.RED_BITS,B.RENDERER,B.SHADING_LANGUAGE_VERSION,B.STENCIL_BITS,B.VENDOR,B.VERSION];for(let W of E)try{let X=B.getParameter(W);Q.push(String(X))}catch{Q.push("")}let I=B.getSupportedExtensions();if(I)Q.push(I.sort().join(","));let C=null,Y=null,G=B.getExtension("WEBGL_debug_renderer_info");if(G)C=B.getParameter(G.UNMASKED_VENDOR_WEBGL),Y=B.getParameter(G.UNMASKED_RENDERER_WEBGL);return{hash:this.hashString(Q.join("|")),vendor:C,renderer:Y}}catch{return{hash:null,vendor:null,renderer:null}}}async getAudioHash(){try{let A=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(!A)return null;let B=new A(1,4500,44100),Q=B.createOscillator(),E=B.createDynamicsCompressor();Q.type="triangle",Q.frequency.setValueAtTime(1e4,B.currentTime),E.threshold.setValueAtTime(-50,B.currentTime),E.knee.setValueAtTime(40,B.currentTime),E.ratio.setValueAtTime(12,B.currentTime),E.attack.setValueAtTime(0,B.currentTime),E.release.setValueAtTime(0.25,B.currentTime),Q.connect(E),E.connect(B.destination),Q.start(0);let C=(await B.startRendering()).getChannelData(0),Y=[];for(let G=0;G<C.length;G+=100)Y.push(C[G]);return this.hashString(Y.join(","))}catch{return null}}async getFontData(){let A=["Arial","Arial Black","Arial Narrow","Calibri","Cambria","Cambria Math","Comic Sans MS","Consolas","Courier","Courier New","Georgia","Helvetica","Impact","Lucida Console","Lucida Sans Unicode","Microsoft Sans Serif","MS Gothic","MS PGothic","MS Sans Serif","MS Serif","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Symbol","Tahoma","Times","Times New Roman","Trebuchet MS","Verdana","Wingdings"],B=["monospace","sans-serif","serif"],Q="mmmmmmmmmmlli",E="72px",I=document.createElement("span");I.style.position="absolute",I.style.left="-9999px",I.style.fontSize="72px",I.style.lineHeight="normal",I.innerHTML="mmmmmmmmmmlli",document.body.appendChild(I);let C={};for(let Z of B)I.style.fontFamily=Z,C[Z]=I.offsetWidth;let Y=[];for(let Z of A){let W=!1;for(let X of B)if(I.style.fontFamily=`'${Z}', ${X}`,I.offsetWidth!==C[X]){W=!0;break}if(W)Y.push(Z)}return document.body.removeChild(I),{hash:this.hashString(Y.join(",")),count:Y.length}}async getScreenHash(){let A=[String(screen.width),String(screen.height),String(screen.availWidth),String(screen.availHeight),String(screen.colorDepth),String(screen.pixelDepth),String(window.devicePixelRatio||1)];return this.hashString(A.join("|"))}getTimezone(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return null}}getLanguage(){return navigator.language||null}getPlatform(){return navigator.platform||null}generateMainHash(A){let B=[A.canvas_hash||"",A.webgl_hash||"",A.audio_hash||"",A.font_hash||"",A.screen_hash||"",A.timezone||"",A.language||"",A.platform||""];return this.hashString(B.join("|"))}hashString(A){return i(A)}}class n{ws=null;endpoint;apiKey;heartbeatInterval;reconnectAttempts;reconnectDelay;debug;state="disconnected";channelState="closed";refCounter=0;joinRef=null;heartbeatTimer=null;reconnectTimer=null;reconnectCount=0;pendingReplies=new Map;onConnectionChange;onError;channelCallbacks={};topic=null;constructor(A){this.endpoint=A.endpoint,this.apiKey=A.apiKey,this.heartbeatInterval=A.heartbeatInterval??30000,this.reconnectAttempts=A.reconnectAttempts??10,this.reconnectDelay=A.reconnectDelay??((B)=>Math.min(1000*Math.pow(2,B),30000)),this.debug=A.debug??!1,this.onConnectionChange=A.onConnectionChange,this.onError=A.onError}connect(){return new Promise((A,B)=>{if(this.ws&&this.state==="connected"){A();return}this.setState("connecting");let Q=this.buildUrl();this.log("Connecting to",Q);try{this.ws=new WebSocket(Q),this.ws.onopen=()=>{this.log("WebSocket connected"),this.setState("connected"),this.reconnectCount=0,this.startHeartbeat(),A()},this.ws.onclose=(E)=>{this.log("WebSocket closed",E.code,E.reason),this.handleClose()},this.ws.onerror=(E)=>{this.log("WebSocket error",E);let I=Error("WebSocket connection error");this.handleError(I),B(I)},this.ws.onmessage=(E)=>{this.handleMessage(E.data)}}catch(E){let I=E instanceof Error?E:Error(String(E));this.handleError(I),B(I)}})}disconnect(){if(this.stopHeartbeat(),this.stopReconnect(),this.ws)this.ws.close(1000,"Client disconnect"),this.ws=null;this.setState("disconnected"),this.setChannelState("closed")}joinChannel(A,B,Q,E,I={},C){return this.channelCallbacks=I,this.topic=`detection:${A}`,new Promise((Y,G)=>{if(this.state!=="connected"){G(Error("WebSocket not connected"));return}this.setChannelState("joining"),this.joinRef=this.makeRef();let Z={session_id:A,api_key:this.apiKey,fingerprint:B,session:Q,browser:E};if(C)Z.account_id=C;this.push("phx_join",Z,this.joinRef).then((W)=>{this.log("Channel joined",W),this.setChannelState("joined"),this.channelCallbacks.onJoin?.(),Y(W)}).catch((W)=>{this.log("Channel join failed",W),this.setChannelState("error"),this.channelCallbacks.onError?.(W),G(W)})})}leaveChannel(){return new Promise((A,B)=>{if(this.channelState!=="joined"){A();return}this.setChannelState("leaving"),this.push("phx_leave",{}).then(()=>{this.log("Channel left"),this.setChannelState("closed"),this.joinRef=null,this.topic=null,this.channelCallbacks.onLeave?.(),A()}).catch((Q)=>{this.setChannelState("error"),B(Q)})})}sendSignal(A){if(this.channelState!=="joined")return Promise.reject(Error("Channel not joined"));return this.push("signal",A)}sendFormStatus(A){if(this.channelState!=="joined")return Promise.reject(Error("Channel not joined"));return this.push("form_status",{status:A})}sendEvent(A,B){if(this.channelState!=="joined")return Promise.reject(Error("Channel not joined"));return this.push(A,B)}getState(){return this.state}getChannelState(){return this.channelState}isReady(){return this.state==="connected"&&this.channelState==="joined"}buildUrl(){let A=new URL(this.endpoint);return A.searchParams.set("vsn","2.0.0"),A.searchParams.set("api_key",this.apiKey),A.toString()}makeRef(){return this.refCounter++,String(this.refCounter)}push(A,B,Q){return new Promise((E,I)=>{if(!this.ws||this.ws.readyState!==WebSocket.OPEN){I(Error("WebSocket not open"));return}if(!this.topic){I(Error("Channel topic not set"));return}let C=Q??this.makeRef(),Y=[this.joinRef,C,this.topic,A,B],G=setTimeout(()=>{this.pendingReplies.delete(C),I(Error(`Timeout waiting for reply to ${A}`))},1e4);this.pendingReplies.set(C,{resolve:E,reject:I,timeout:G}),this.log("Sending",A,B),this.ws.send(JSON.stringify(Y))})}handleMessage(A){try{let[B,Q,E,I,C]=JSON.parse(A);if(this.log("Received",I,C),I==="phx_reply"&&Q){let Y=this.pendingReplies.get(Q);if(Y){clearTimeout(Y.timeout),this.pendingReplies.delete(Q);let G=C;if(G.status==="ok")Y.resolve(G.response??{});else if(G.response&&typeof G.response==="object"&&"code"in G.response)Y.reject(G.response);else{let Z=this.buildErrorMessage(G.status,G.response);Y.reject(Error(Z))}}return}if(I==="phx_error"){let Y=Error("Channel error");this.setChannelState("error"),this.channelCallbacks.onError?.(Y);return}if(I==="phx_close"){this.setChannelState("closed"),this.channelCallbacks.onLeave?.();return}if(I==="score_update"){this.channelCallbacks.onScoreUpdate?.(C);return}if(I==="action"){this.channelCallbacks.onAction?.(C);return}this.channelCallbacks.onMessage?.(I,C)}catch(B){this.log("Error parsing message",B)}}handleClose(){this.stopHeartbeat(),this.setState("disconnected"),this.setChannelState("closed");for(let[A,B]of this.pendingReplies)clearTimeout(B.timeout),B.reject(Error("Connection closed"));this.pendingReplies.clear(),this.scheduleReconnect()}handleError(A){this.setState("error"),this.onError?.(A)}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){let A=[null,this.makeRef(),"phoenix","heartbeat",{}];if(this.ws.send(JSON.stringify(A)),this.channelState==="joined")this.push("heartbeat",{}).then((B)=>{if(B.bot_score!==void 0)this.channelCallbacks.onScoreUpdate?.({bot_score:B.bot_score,classification:B.classification,triggered_rules:[],event_count:0})}).catch(()=>{})}},this.heartbeatInterval)}stopHeartbeat(){if(this.heartbeatTimer)clearInterval(this.heartbeatTimer),this.heartbeatTimer=null}scheduleReconnect(){if(this.reconnectCount>=this.reconnectAttempts){this.log("Max reconnect attempts reached");return}let A=this.reconnectDelay(this.reconnectCount);this.reconnectCount++,this.log(`Scheduling reconnect attempt ${this.reconnectCount} in ${A}ms`),this.reconnectTimer=setTimeout(()=>{this.connect().catch((B)=>{this.log("Reconnect failed",B)})},A)}stopReconnect(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.reconnectCount=0}setState(A){if(this.state!==A)this.state=A,this.onConnectionChange?.(A)}setChannelState(A){this.channelState=A}buildErrorMessage(A,B){if(B){if(typeof B.reason==="string")return`Channel error: ${B.reason}`;if(Object.keys(B).length>0)return`Channel error (${A??"error"}): ${JSON.stringify(B)}`}return A??"Unknown error"}log(...A){if(this.debug);}}class t{config;isReady=!1;hasScore=!1;hasFormScore=!1;currentScore=null;pendingSubmissions=[];pendingRequests=[];protectedForms=new Set;releasingForms=new Set;loadingOverlay=null;formObserver=null;startTime;originalFetch=null;originalXHROpen=null;originalXHRSend=null;constructor(A={}){if(this.startTime=performance.now(),this.config={mode:A.mode??"none",minTimeBeforeSubmit:A.minTimeBeforeSubmit??500,maxHoldTime:A.maxHoldTime??5000,showLoadingUI:A.showLoadingUI??!0,loadingMessage:A.loadingMessage??"Please wait...",onHold:A.onHold,onRelease:A.onRelease,onBlock:A.onBlock,flushAndWaitForScore:A.flushAndWaitForScore},this.config.mode!=="none")this.setup()}setup(){if(this.config.mode==="auto")this.interceptFetch(),this.interceptXHR();let A=()=>{document.querySelectorAll("form").forEach((B)=>{this.protectForm(B)}),this.formObserver=new MutationObserver((B)=>{B.forEach((Q)=>{Q.addedNodes.forEach((E)=>{if(E instanceof HTMLFormElement)this.protectForm(E);if(E instanceof HTMLElement)E.querySelectorAll("form").forEach((I)=>{this.protectForm(I)})})})}),this.formObserver.observe(document.body,{childList:!0,subtree:!0})};if(document.body)A();else document.addEventListener("DOMContentLoaded",A,{once:!0})}isFormLikeRequest(A,B){if((B?.method?.toUpperCase()||"GET")!=="POST")return!1;try{if((typeof A==="string"?new URL(A,window.location.origin):A instanceof URL?A:new URL(A.url)).origin!==window.location.origin)return!1}catch{return!1}let E=B?.headers instanceof Headers?B.headers.get("content-type"):typeof B?.headers==="object"&&B.headers!==null?B.headers["content-type"]||B.headers["Content-Type"]:null;if(E){let I=E.toLowerCase();if(I.includes("application/x-www-form-urlencoded")||I.includes("multipart/form-data")||I.includes("application/json"))return!0;return!1}if(B?.body)return!0;return!1}interceptFetch(){this.originalFetch=window.fetch.bind(window);let A=this;window.fetch=async function(B,Q){if(!A.isFormLikeRequest(B,Q))return A.originalFetch(B,Q);if(A.hasScore)return A.originalFetch(B,Q);return new Promise((E,I)=>{let C={resolve:E,reject:I,execute:()=>A.originalFetch(B,Q),timestamp:performance.now()};if(A.pendingRequests.push(C),A.config.showLoadingUI&&A.pendingRequests.length===1)A.showLoading(document.createElement("form"));if(setTimeout(()=>{if(A.pendingRequests.includes(C))A.releaseRequest(C)},A.config.maxHoldTime),A.hasScore)A.releaseRequest(C)})}}interceptXHR(){this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send;let A=this;XMLHttpRequest.prototype.open=function(B,Q,E=!0,I,C){let Y=this;return Y._bsMethod=B.toUpperCase(),Y._bsUrl=Q.toString(),A.originalXHROpen.call(this,B,Q,E,I,C)},XMLHttpRequest.prototype.send=function(B){let Q=this,E=Q._bsMethod||"GET",I=Q._bsUrl||"";if(E!=="POST")return A.originalXHRSend.call(this,B);try{if(new URL(I,window.location.origin).origin!==window.location.origin)return A.originalXHRSend.call(this,B)}catch{return A.originalXHRSend.call(this,B)}if(A.hasScore)return A.originalXHRSend.call(this,B);let C=performance.now(),Y=()=>{if(A.hasScore){if(A.config.showLoadingUI)A.hideLoading();A.originalXHRSend.call(Q,B)}else if(performance.now()-C>=A.config.maxHoldTime){if(A.config.showLoadingUI)A.hideLoading();A.originalXHRSend.call(Q,B)}else setTimeout(Y,50)};if(A.config.showLoadingUI)A.showLoading(document.createElement("form"));Y()}}releaseRequest(A){let B=this.pendingRequests.indexOf(A);if(B===-1)return;if(this.pendingRequests.splice(B,1),this.pendingRequests.length===0&&this.config.showLoadingUI)this.hideLoading();A.execute().then(A.resolve).catch(A.reject)}protectForm(A){if(this.protectedForms.has(A))return;this.protectedForms.add(A),A.addEventListener("submit",(B)=>this.handleSubmit(B,A),{capture:!0})}handleSubmit(A,B){if(this.releasingForms.has(B)){this.releasingForms.delete(B);return}let E=performance.now()-this.startTime;switch(O().markFirstSubmitAttempt(this.hasScore),this.config.mode){case"holdUntilReady":if(!this.hasScore)A.preventDefault(),A.stopPropagation(),this.holdSubmission(B,A);break;case"holdUntilFormScored":A.preventDefault(),A.stopPropagation(),this.holdAndScoreSubmission(B,A);break;case"blockInstant":if(E<this.config.minTimeBeforeSubmit)A.preventDefault(),A.stopPropagation(),this.config.onBlock?.(B,"instant_submission");break;case"challengeFirst":if(!this.hasScore)A.preventDefault(),A.stopPropagation(),this.holdSubmission(B,A);break;case"none":default:break}}holdSubmission(A,B){if(this.config.onHold?.(A),this.config.showLoadingUI)this.showLoading(A);let Q={form:A,event:B,timestamp:performance.now(),resolver:()=>{},rejecter:()=>{}},E=new Promise((I,C)=>{Q.resolver=I,Q.rejecter=C});if(this.pendingSubmissions.push(Q),setTimeout(()=>{if(this.pendingSubmissions.includes(Q))this.releaseSubmission(Q,!1)},this.config.maxHoldTime),this.hasScore)this.releaseSubmission(Q,!1);E.catch(()=>{})}async holdAndScoreSubmission(A,B){if(this.config.onHold?.(A),this.config.showLoadingUI)this.showLoading(A);let Q=performance.now();try{if(!this.config.flushAndWaitForScore){this.submitForm(A);return}let E=this.config.flushAndWaitForScore(),I=new Promise((G)=>{setTimeout(()=>G(null),this.config.maxHoldTime)}),C=await Promise.race([E,I]),Y=performance.now()-Q;if(C===null);else this.currentScore=C,this.hasFormScore=!0;if(this.config.showLoadingUI)this.hideLoading();this.config.onRelease?.(A,!1),this.submitForm(A)}catch(E){if(this.config.showLoadingUI)this.hideLoading();this.config.onRelease?.(A,!1),this.submitForm(A)}}submitForm(A){if(this.releasingForms.add(A),A.requestSubmit)A.requestSubmit();else A.submit()}releaseSubmission(A,B){let Q=this.pendingSubmissions.indexOf(A);if(Q===-1)return;if(this.pendingSubmissions.splice(Q,1),this.config.showLoadingUI)this.hideLoading();if(this.config.onRelease?.(A.form,B),!B)if(A.resolver(),A.form.requestSubmit)A.form.requestSubmit();else A.form.submit();else A.rejecter("blocked")}showLoading(A){if(this.loadingOverlay)return;this.loadingOverlay=document.createElement("div"),this.loadingOverlay.innerHTML=`
1
+ (()=>{var{defineProperty:h,getOwnPropertyNames:VA,getOwnPropertyDescriptor:DA}=Object,HA=Object.prototype.hasOwnProperty;var BA=new WeakMap,$A=(A)=>{var B=BA.get(A),Q;if(B)return B;if(B=h({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function")VA(A).map((E)=>!HA.call(B,E)&&h(B,E,{get:()=>A[E],enumerable:!(Q=DA(A,E))||Q.enumerable}));return BA.set(A,B),B};var v=(A,B)=>{for(var Q in B)h(A,Q,{get:B[Q],enumerable:!0,configurable:!0,set:(E)=>B[Q]=()=>E})};var g=(A,B)=>()=>(A&&(B=A(A=0)),B);var CA="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";function NA(A){let B=atob(A),Q=new Uint8Array(B.length);for(let E=0;E<B.length;E++)Q[E]=B.charCodeAt(E);return Q}async function c(){if(j)return j;return j=(async()=>{try{let A=NA(CA),B=await WebAssembly.compile(A);return l=(await WebAssembly.instantiate(B,{env:{abort:(E,I,C,Y)=>{}}})).exports,LA(l)}catch(A){throw j=null,A}})(),j}function a(){return l!==null}function LA(A){function B(I){let C=A.__new(I.length,1);return new Uint8Array(A.memory.buffer,C,I.length).set(I),C}function Q(I){let C=new Uint16Array(I.length);for(let Z=0;Z<I.length;Z++)C[Z]=I.charCodeAt(Z);let Y=A.__new(C.length*2,2);return new Uint16Array(A.memory.buffer,Y,C.length).set(C),Y}function E(I,C=1024){let Y=new Uint8Array(A.memory.buffer),G=Y.length;if(I<0||I>=G)return"";let Z=I,W=Math.min(I+C,G);while(Z<W&&Y[Z]!==0)Z++;let X=Y.slice(I,Z);return new TextDecoder().decode(X)}return{xxHash32(I,C=0){let Y=B(I);try{return A.xxHash32(Y,C)}finally{A.__unpin(Y)}},hashString(I,C=0){let Y=Q(I);try{return A.hashString(Y,C)}finally{A.__unpin(Y)}},hashStringToHex(I,C=0){let Y=Q(I);try{let G=A.hashStringToHex(Y,C);return E(G)}finally{A.__unpin(Y)}},verifyHash(I,C,Y=0){let G=B(I);try{return A.verifyHash(G,C,Y)}finally{A.__unpin(G)}},verifyStringHash(I,C,Y=0){let G=Q(I);try{return A.verifyStringHash(G,C,Y)}finally{A.__unpin(G)}}}}function P(){let A=new TextEncoder;function B(E,I=0){let X=(N,H)=>(N<<H|N>>>32-H)>>>0,L=(N,H)=>(N[H]|N[H+1]<<8|N[H+2]<<16|N[H+3]<<24)>>>0,D=E.length,z,q=0;if(D>=16){let N=D-16,H=I+2654435761+2246822519>>>0,T=I+2246822519>>>0,S=I>>>0,x=I-2654435761>>>0;while(q<=N)H=Math.imul(X(H+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4,T=Math.imul(X(T+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4,S=Math.imul(X(S+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4,x=Math.imul(X(x+Math.imul(L(E,q),2246822519)>>>0,13),2654435761)>>>0,q+=4;z=X(H,1)+X(T,7)+X(S,12)+X(x,18)>>>0}else z=I+374761393>>>0;z=z+D>>>0;while(q<=D-4)z=Math.imul(X(z+Math.imul(L(E,q),3266489917)>>>0,17),668265263)>>>0,q+=4;while(q<D)z=Math.imul(X(z+Math.imul(E[q],374761393)>>>0,11),2654435761)>>>0,q++;return z^=z>>>15,z=Math.imul(z,2246822519)>>>0,z^=z>>>13,z=Math.imul(z,3266489917)>>>0,z^=z>>>16,z>>>0}function Q(E){return(E>>>0).toString(16).padStart(8,"0")}return{xxHash32:B,hashString(E,I=0){return B(A.encode(E),I)},hashStringToHex(E,I=0){return Q(B(A.encode(E),I))},verifyHash(E,I,C=0){return B(E,C)===I},verifyStringHash(E,I,C=0){return B(A.encode(E),C)===I}}}var l=null,j=null;var YA=()=>{};var JA={};v(JA,{verifySignature:()=>FA,verify:()=>OA,loadHashModule:()=>c,isUsingWasm:()=>wA,isHashModuleLoaded:()=>a,initHashModule:()=>kA,hashToHex:()=>i,hash:()=>UA,getHash:()=>U,createSignature:()=>GA,createFallbackHashModule:()=>P});async function kA(A={}){let{preferWasm:B=!0,onWasmLoaded:Q,onFallback:E}=A;if($)return $;if(M)return M;return M=(async()=>{if(B)try{return $=await c(),y=!0,Q?.(),$}catch(I){let C=I instanceof Error?I.message:"Unknown error";E?.(C)}else E?.("WASM disabled by configuration");return $=P(),y=!1,$})(),M}function U(){if($)return $;return $=P(),y=!1,$}function wA(){return y&&a()}function UA(A,B=0){let Q=U();if(typeof A==="string")return Q.hashString(A,B);return Q.xxHash32(A,B)}function i(A,B=0){let Q=U();if(typeof A==="string")return Q.hashStringToHex(A,B);return Q.xxHash32(A,B).toString(16).padStart(8,"0")}function OA(A,B,Q=0){let E=U(),I=typeof B==="string"?parseInt(B,16):B;if(typeof A==="string")return E.verifyStringHash(A,I,Q);return E.verifyHash(A,I,Q)}function GA(A,B){let Q=U(),E=Q.hashString(B,0);return Q.hashString(A,E).toString(16).padStart(8,"0")}function FA(A,B,Q){return GA(A,Q)===B}var $=null,M=null,y=!0;var b=g(()=>{YA()});class AA{overlay=null;messageEl=null;progressEl=null;config;constructor(A){this.config=A}show(){return}setProgress(A){if(this.progressEl){let B=Math.min(100,Math.max(0,A*100));this.progressEl.style.width=`${B}%`}}showSuccess(){if(this.messageEl)this.messageEl.textContent=this.config.successMessage;if(this.progressEl)this.progressEl.style.width="100%"}hide(){if(this.overlay)this.overlay.remove(),this.overlay=null,this.messageEl=null,this.progressEl=null}isVisible(){return this.overlay!==null}}var WA={};v(WA,{ChallengeManager:()=>KA});function _A(){let A=new Uint8Array(16);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(A);else for(let B=0;B<16;B++)A[B]=Math.floor(Math.random()*256);return A}function PA(A){if(A===0)return 32;let B=0;if((A&4294901760)===0)B+=16,A<<=16;if((A&4278190080)===0)B+=8,A<<=8;if((A&4026531840)===0)B+=4,A<<=4;if((A&3221225472)===0)B+=2,A<<=2;if((A&2147483648)===0)B+=1;return B}function MA(A,B,Q,E){let I=U(),C=new Uint8Array(A.length+4);C.set(A);let Y=E,G=0;while(G<Q){C[A.length]=Y&255,C[A.length+1]=Y>>>8&255,C[A.length+2]=Y>>>16&255,C[A.length+3]=Y>>>24&255;let Z=I.xxHash32(C,0);if(G++,PA(Z)>=B)return{nonce:Y,found:!0,iterations:G};Y=Y+1>>>0}return{nonce:Y,found:!1,iterations:G}}class KA{config;overlay;solving=!1;solved=!1;pendingForms=new Map;formHandler=null;formObserver=null;resubmitting=!1;debug;constructor(A,B=!1){this.config=A,this.debug=B,this.overlay=new AA(A.ui)}getDifficultyForLevel(A){let B=this.config.difficulty;switch(A){case"critical":return B.critical;case"high":return B.high;case"medium":return B.medium;default:return 0}}shouldChallenge(A){if(!this.config.enabled||this.solved)return!1;let B=["low","medium","high","critical"],Q=B.indexOf(A),E=B.indexOf(this.config.minLevel);return Q>=E}blockFormsUntilSolved(A){if(this.formHandler)return;this.formHandler=(B)=>{if(this.solved||this.resubmitting)return;B.preventDefault(),B.stopPropagation();let Q=B.target;if(!this.pendingForms.has(Q))this.pendingForms.set(Q,B);if(!this.solving)this.startChallenge(A)},document.querySelectorAll("form").forEach((B)=>{B.addEventListener("submit",this.formHandler,!0)}),this.formObserver=new MutationObserver((B)=>{B.forEach((Q)=>{Q.addedNodes.forEach((E)=>{if(E instanceof HTMLFormElement&&this.formHandler)E.addEventListener("submit",this.formHandler,!0);if(E instanceof HTMLElement&&this.formHandler)E.querySelectorAll("form").forEach((I)=>{I.addEventListener("submit",this.formHandler,!0)})})})}),this.formObserver.observe(document.body,{childList:!0,subtree:!0}),this.log("Forms blocked, challenge required")}async startChallenge(A){if(this.solving||this.solved)return;this.solving=!0;let B=this.getDifficultyForLevel(A),Q=_A(),E=performance.now();this.log(`Starting challenge: difficulty=${B}, level=${A}`),this.config.onChallengeStart?.(A,B),this.overlay.show();let I=1<<B,C=0,Y=0,G;do{await new Promise((L)=>setTimeout(L,0)),G=MA(Q,B,this.config.chunkSize,C),Y+=G.iterations,C=G.nonce+1;let X=Math.min(1,Y/I);this.overlay.setProgress(X),this.config.onChallengeProgress?.(X,Y)}while(!G.found);let Z=performance.now()-E;this.log(`Challenge solved: nonce=${G.nonce}, iterations=${Y}, time=${Z.toFixed(0)}ms`),this.overlay.showSuccess(),await new Promise((X)=>setTimeout(X,500)),this.overlay.hide(),this.solved=!0,this.solving=!1;let W={solveTimeMs:Z,iterations:Y,difficulty:B,level:A,nonce:G.nonce};this.config.onChallengeComplete?.(W),this.unblockForms()}unblockForms(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.formHandler)document.querySelectorAll("form").forEach((A)=>{A.removeEventListener("submit",this.formHandler,!0)}),this.formHandler=null;this.log("Forms unblocked"),this.resubmitting=!0,this.pendingForms.forEach((A,B)=>{if(this.log("Resubmitting pending form"),B.requestSubmit)B.requestSubmit();else B.submit()}),this.pendingForms.clear(),this.resubmitting=!1}isSolving(){return this.solving}isSolved(){return this.solved}reset(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.formHandler)document.querySelectorAll("form").forEach((A)=>{A.removeEventListener("submit",this.formHandler,!0)}),this.formHandler=null;this.solved=!1,this.solving=!1,this.resubmitting=!1,this.pendingForms.clear()}log(...A){if(this.debug);}}var qA=g(()=>{b()});var yA={};v(yA,{BotSigged:()=>K});function QA(A){return typeof A==="object"&&A!==null&&"code"in A&&A.code==="LIMIT_EXCEEDED"}var R={endpoint:"wss://botsigged.com/sdk/websocket",debug:!1,sendInterval:2000,maxBufferSize:1000,mouseSampleRate:0.5,autoStart:!0,actionThreshold:70,action:"none",minAlertLevel:"high",botScoreThresholds:{medium:40,high:70,critical:90},hashVerification:{enabled:!1,preferWasm:!0},challenge:{enabled:!1,minLevel:"high",chunkSize:1e4,difficulty:{medium:12,high:16,critical:20},ui:{enabled:!0,message:"Verifying you're human...",successMessage:"Verified!",backgroundColor:"rgba(0, 0, 0, 0.7)",textColor:"#ffffff",spinnerColor:"#3b82f6",zIndex:999999}},formProtection:{mode:"auto",minTimeBeforeSubmit:500,maxHoldTime:3000,showLoadingUI:!0,loadingMessage:"Please wait..."},fallbackMode:"degraded"},EA={action:"none",form_protection_mode:"none"};function IA(A){let B=A.action??R.action,Q=B==="challenge"||A.challenge?.enabled;return{apiKey:A.apiKey,accountId:A.accountId,endpoint:A.endpoint??R.endpoint,debug:A.debug??R.debug,sendInterval:A.sendInterval??R.sendInterval,maxBufferSize:A.maxBufferSize??R.maxBufferSize,mouseSampleRate:A.mouseSampleRate??R.mouseSampleRate,autoStart:A.autoStart??R.autoStart,actionThreshold:A.actionThreshold??R.actionThreshold,action:B,minAlertLevel:A.minAlertLevel??R.minAlertLevel,botScoreThresholds:{...R.botScoreThresholds,...A.botScoreThresholds},hashVerification:{...R.hashVerification,...A.hashVerification},challenge:{enabled:Q,minLevel:A.challenge?.minLevel??R.challenge.minLevel,chunkSize:A.challenge?.chunkSize??R.challenge.chunkSize,difficulty:{...R.challenge.difficulty,...A.challenge?.difficulty},ui:{...R.challenge.ui,...A.challenge?.ui},onChallengeStart:A.challenge?.onChallengeStart,onChallengeComplete:A.challenge?.onChallengeComplete,onChallengeProgress:A.challenge?.onChallengeProgress},formProtection:{mode:A.formProtection?.mode??R.formProtection.mode,minTimeBeforeSubmit:A.formProtection?.minTimeBeforeSubmit??R.formProtection.minTimeBeforeSubmit,maxHoldTime:A.formProtection?.maxHoldTime??R.formProtection.maxHoldTime,showLoadingUI:A.formProtection?.showLoadingUI??R.formProtection.showLoadingUI,loadingMessage:A.formProtection?.loadingMessage??R.formProtection.loadingMessage,onHold:A.formProtection?.onHold,onRelease:A.formProtection?.onRelease,onBlock:A.formProtection?.onBlock},fallbackMode:A.fallbackMode??R.fallbackMode,cookie:A.cookie,headers:A.headers,formInject:A.formInject,onScoreUpdate:A.onScoreUpdate,onConnectionChange:A.onConnectionChange,onError:A.onError,onUsageLimitExceeded:A.onUsageLimitExceeded,onHighBotScore:A.onHighBotScore,onServerConfig:A.onServerConfig,onServerAction:A.onServerAction}}class u{events=[];startTime=0;sampleRate;maxBufferSize;isListening=!1;boundHandleMouseMove;boundHandleMouseDown;boundHandleMouseUp;boundHandleClick;constructor(A={}){this.sampleRate=A.sampleRate??0.5,this.maxBufferSize=A.maxBufferSize??500,this.boundHandleMouseMove=this.handleMouseMove.bind(this),this.boundHandleMouseDown=this.handleMouseDown.bind(this),this.boundHandleMouseUp=this.handleMouseUp.bind(this),this.boundHandleClick=this.handleClick.bind(this)}start(){if(this.isListening)return;this.startTime=Date.now(),document.addEventListener("mousemove",this.boundHandleMouseMove,{passive:!0}),document.addEventListener("mousedown",this.boundHandleMouseDown,{passive:!0}),document.addEventListener("mouseup",this.boundHandleMouseUp,{passive:!0}),document.addEventListener("click",this.boundHandleClick,{passive:!0}),this.isListening=!0}stop(){if(!this.isListening)return;document.removeEventListener("mousemove",this.boundHandleMouseMove),document.removeEventListener("mousedown",this.boundHandleMouseDown),document.removeEventListener("mouseup",this.boundHandleMouseUp),document.removeEventListener("click",this.boundHandleClick),this.isListening=!1}addEvent(A){if(this.events.push(A),this.events.length>this.maxBufferSize)this.events.shift()}handleMouseMove(A){if(Math.random()>this.sampleRate)return;this.addEvent({type:"move",x:A.clientX,y:A.clientY,t:Date.now()})}handleMouseDown(A){this.addEvent({type:"down",x:A.clientX,y:A.clientY,t:Date.now(),button:A.button})}handleMouseUp(A){this.addEvent({type:"up",x:A.clientX,y:A.clientY,t:Date.now(),button:A.button})}handleClick(A){let B=A.target,Q,E;if(B&&B.getBoundingClientRect){let I=B.getBoundingClientRect();Q={top:I.top,left:I.left,width:I.width,height:I.height},E=B.tagName?.toLowerCase()}this.addEvent({type:"click",x:A.clientX,y:A.clientY,t:Date.now(),button:A.button,targetRect:Q,targetTag:E})}getSignal(){return{events:[...this.events],start_time:this.startTime}}flush(){this.events=[]}getBufferSize(){return this.events.length}reset(){this.events=[],this.startTime=Date.now()}}class p{events=[];startTime=0;maxBufferSize;isListening=!1;boundHandleScroll;constructor(A={}){this.maxBufferSize=A.maxBufferSize??200,this.boundHandleScroll=this.handleScroll.bind(this)}start(){if(this.isListening)return;this.startTime=Date.now(),window.addEventListener("scroll",this.boundHandleScroll,{passive:!0}),this.isListening=!0}stop(){if(!this.isListening)return;window.removeEventListener("scroll",this.boundHandleScroll),this.isListening=!1}handleScroll(){if(this.events.push({y:window.scrollY,t:Date.now()}),this.events.length>this.maxBufferSize)this.events.shift()}getSignal(){return{events:[...this.events],start_time:this.startTime}}flush(){this.events=[]}getBufferSize(){return this.events.length}reset(){this.events=[],this.startTime=Date.now()}}class k{static instance=null;timings={signalRoundtrips:[]};pendingSignals=new Map;constructor(){this.timings.scriptStart=performance.now()}static getInstance(){if(!k.instance)k.instance=new k;return k.instance}static reset(){k.instance=null}markScriptStart(){this.timings.scriptStart=performance.now()}markConstructorStart(){this.timings.constructorStart=performance.now()}markConstructorEnd(){this.timings.constructorEnd=performance.now()}markStartCalled(){this.timings.startCalled=performance.now()}markSdkReady(){this.timings.sdkReady=performance.now()}markFingerprintStart(){this.timings.fingerprintStart=performance.now()}markFingerprintEnd(){this.timings.fingerprintEnd=performance.now()}markWsConnectStart(){this.timings.wsConnectStart=performance.now()}markWsConnectEnd(){this.timings.wsConnectEnd=performance.now()}markChannelJoinStart(){this.timings.channelJoinStart=performance.now()}markChannelJoinEnd(){this.timings.channelJoinEnd=performance.now()}markInitialScoreReceived(){this.timings.initialScoreReceived=performance.now()}markFormCollectorStart(){this.timings.formCollectorStart=performance.now()}markFormCollectorReady(){this.timings.formCollectorReady=performance.now()}markFirstFormInteraction(){if(!this.timings.firstFormInteraction){if(this.timings.firstFormInteraction=performance.now(),this.timings.sdkReady)this.timings.timeToFirstInteraction=this.timings.firstFormInteraction-this.timings.sdkReady}}markFirstSubmitAttempt(A){if(!this.timings.firstSubmitAttempt)this.timings.firstSubmitAttempt=performance.now(),this.timings.hadScoreBeforeSubmit=A}markSignalSent(A){this.pendingSignals.set(A,performance.now())}markSignalResponseReceived(A){let B=this.pendingSignals.get(A);if(B!==void 0){let Q=performance.now(),E={sentAt:B,receivedAt:Q,roundtripMs:Q-B,seq:A};this.timings.signalRoundtrips?.push(E),this.pendingSignals.delete(A)}}getTimings(){return{...this.timings}}getSummary(){let A=this.timings,B=A.signalRoundtrips||[],Q=0,E=1/0,I=0;if(B.length>0)Q=B.reduce((D,z)=>D+z.roundtripMs,0)/B.length,E=Math.min(...B.map((D)=>D.roundtripMs)),I=Math.max(...B.map((D)=>D.roundtripMs));let C=(A.sdkReady??0)-(A.scriptStart??0),Y=(A.fingerprintEnd??0)-(A.fingerprintStart??0),G=(A.wsConnectEnd??0)-(A.wsConnectStart??0),Z=(A.channelJoinEnd??0)-(A.channelJoinStart??0),W=(A.initialScoreReceived??0)-(A.startCalled??0),X=(A.initialScoreReceived??0)-(A.scriptStart??0);return{totalStartupMs:Math.round(C),fingerprintMs:Math.round(Y),wsConnectionMs:Math.round(G),channelJoinMs:Math.round(Z),timeToFirstScoreMs:Math.round(W),avgSignalRoundtripMs:Math.round(Q),minSignalRoundtripMs:E===1/0?0:Math.round(E),maxSignalRoundtripMs:Math.round(I),vulnerabilityWindowMs:Math.round(X),protectedBeforeSubmit:A.hadScoreBeforeSubmit??!1}}logSummary(){let A=this.getSummary(),B=this.timings;if(B.firstFormInteraction);if(B.firstSubmitAttempt);if(A.vulnerabilityWindowMs>0);}getReport(){return{timings:this.timings,summary:this.getSummary(),userAgent:navigator.userAgent,timestamp:Date.now()}}}var J=k.getInstance();function O(){return k.getInstance()}var _="__bs_ghost_value";class m{keyEvents=[];focusEvents=[];pasteEvents=[];inputEvents=[];submitCount=0;startTime=0;maxKeyEvents;maxFocusEvents;maxInputEvents;isListening=!1;valueSetterHooked=!1;onSubmit;originalInputDescriptor;originalTextareaDescriptor;lastKeyWasTab=!1;currentField=null;emailDomains=new Set;boundHandleFocusIn;boundHandleFocusOut;boundHandleKeyDown;boundHandleKeyUp;boundHandlePaste;boundHandleSubmit;boundHandleClick;boundHandleInput;boundHandleGhostValue;constructor(A={}){this.maxKeyEvents=A.maxKeyEvents??500,this.maxFocusEvents=A.maxFocusEvents??100,this.maxInputEvents=A.maxInputEvents??200,this.onSubmit=A.onSubmit,this.boundHandleFocusIn=this.handleFocusIn.bind(this),this.boundHandleFocusOut=this.handleFocusOut.bind(this),this.boundHandleKeyDown=this.handleKeyDown.bind(this),this.boundHandleKeyUp=this.handleKeyUp.bind(this),this.boundHandlePaste=this.handlePaste.bind(this),this.boundHandleSubmit=this.handleSubmit.bind(this),this.boundHandleClick=this.handleClick.bind(this),this.boundHandleInput=this.handleInput.bind(this),this.boundHandleGhostValue=this.handleGhostValue.bind(this)}start(){if(this.isListening)return;this.startTime=Date.now(),document.addEventListener("focusin",this.boundHandleFocusIn,{passive:!0,capture:!0}),document.addEventListener("focusout",this.boundHandleFocusOut,{passive:!0,capture:!0}),document.addEventListener("keydown",this.boundHandleKeyDown,{passive:!0}),document.addEventListener("keyup",this.boundHandleKeyUp,{passive:!0}),document.addEventListener("paste",this.boundHandlePaste,{passive:!0}),document.addEventListener("submit",this.boundHandleSubmit,{passive:!0}),document.addEventListener("click",this.boundHandleClick,{passive:!0}),document.addEventListener("input",this.boundHandleInput,{passive:!0}),document.addEventListener(_,this.boundHandleGhostValue,{passive:!0}),this.hookValueSetters(),this.isListening=!0}stop(){if(!this.isListening)return;document.removeEventListener("focusin",this.boundHandleFocusIn,{capture:!0}),document.removeEventListener("focusout",this.boundHandleFocusOut,{capture:!0}),document.removeEventListener("keydown",this.boundHandleKeyDown),document.removeEventListener("keyup",this.boundHandleKeyUp),document.removeEventListener("paste",this.boundHandlePaste),document.removeEventListener("submit",this.boundHandleSubmit),document.removeEventListener("click",this.boundHandleClick),document.removeEventListener("input",this.boundHandleInput),document.removeEventListener(_,this.boundHandleGhostValue),this.unhookValueSetters(),this.isListening=!1}isFormInput(A){if(!A||!(A instanceof HTMLElement))return!1;let B=A.tagName.toLowerCase();if(B==="textarea"||B==="select")return!0;if(B==="input"){let Q=A.type.toLowerCase();return!["submit","button","reset","hidden","image"].includes(Q)}return!1}isEmailField(A){let B=A.type?.toLowerCase()||"",Q=(A.name||"").toLowerCase(),E=(A.id||"").toLowerCase();return B==="email"||Q.includes("email")||Q.includes("e-mail")||E.includes("email")||E.includes("e-mail")}extractEmailDomain(A){if(!A||typeof A!=="string")return null;let B=A.trim();if(!B)return null;let Q=B.match(/@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/);return Q?Q[1].toLowerCase():null}getFieldId(A){return A.id||A.getAttribute("name")||`field-${A.tagName.toLowerCase()}`}handleFocusIn(A){if(!this.isFormInput(A.target))return;O().markFirstFormInteraction();let B=this.getFieldId(A.target),Q="direct";if(this.lastKeyWasTab)Q="tab";if(this.focusEvents.push({type:"focus",field:B,t:Date.now(),method:Q}),this.focusEvents.length>this.maxFocusEvents)this.focusEvents.shift();this.currentField=B,this.lastKeyWasTab=!1}handleFocusOut(A){if(!this.isFormInput(A.target))return;let B=A.target,Q=this.getFieldId(B);if(this.focusEvents.push({type:"blur",field:Q,t:Date.now()}),this.focusEvents.length>this.maxFocusEvents)this.focusEvents.shift();if(B instanceof HTMLInputElement&&this.isEmailField(B)){let E=this.extractEmailDomain(B.value);if(E)this.emailDomains.add(E)}this.currentField=null}handleClick(A){if(!this.isFormInput(A.target))return;let B=this.focusEvents[this.focusEvents.length-1];if(B&&B.type==="focus"&&Date.now()-B.t<50)B.method="click"}handleKeyDown(A){if(A.key==="Tab"){this.lastKeyWasTab=!0;return}if(!this.isFormInput(A.target))return;let B="key";if(A.key==="Backspace")B="backspace";else if(A.key==="Delete")B="delete";else if(A.key==="Enter")B="enter";else if(A.key==="Tab")B="tab";else if(A.key.length===1)B="char";else if(A.key.startsWith("Arrow"))B="arrow";if(this.keyEvents.push({type:"down",code:B,t:Date.now(),field:this.currentField||void 0}),this.keyEvents.length>this.maxKeyEvents)this.keyEvents.shift()}handleKeyUp(A){if(!this.isFormInput(A.target))return;let B="key";if(A.key==="Backspace")B="backspace";else if(A.key==="Delete")B="delete";else if(A.key.length===1)B="char";if(this.keyEvents.push({type:"up",code:B,t:Date.now(),field:this.currentField||void 0}),this.keyEvents.length>this.maxKeyEvents)this.keyEvents.shift()}handleInput(A){if(!this.isFormInput(A.target))return;let B=A.target,E=A.inputType||"unknown",I=B.value?.length??0;if(this.inputEvents.push({field:this.getFieldId(B),t:Date.now(),inputType:E,valueLength:I}),this.inputEvents.length>this.maxInputEvents)this.inputEvents.shift()}handlePaste(A){if(!this.isFormInput(A.target))return;let B=A.clipboardData?.getData("text")||"";this.pasteEvents.push({field:this.getFieldId(A.target),t:Date.now(),length:B.length})}handleSubmit(A){this.submitCount++;let B=A.target;if(B&&B.elements)for(let Q=0;Q<B.elements.length;Q++){let E=B.elements[Q];if(E instanceof HTMLInputElement&&this.isEmailField(E)){let I=this.extractEmailDomain(E.value);if(I)this.emailDomains.add(I)}}this.onSubmit?.()}getSignal(){return{keys:[...this.keyEvents],focus:[...this.focusEvents],pastes:[...this.pasteEvents],inputs:[...this.inputEvents],submits:this.submitCount,start_time:this.startTime,email_domains:this.emailDomains.size>0?Array.from(this.emailDomains):void 0}}flush(){this.keyEvents=[],this.focusEvents=[],this.pasteEvents=[],this.inputEvents=[]}getBufferSize(){return this.keyEvents.length+this.focusEvents.length+this.pasteEvents.length+this.inputEvents.length}reset(){this.keyEvents=[],this.focusEvents=[],this.pasteEvents=[],this.inputEvents=[],this.submitCount=0,this.startTime=Date.now(),this.lastKeyWasTab=!1,this.currentField=null,this.emailDomains.clear()}hookValueSetters(){if(this.valueSetterHooked)return;if(this.originalInputDescriptor=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value"),this.originalInputDescriptor){let A=this.originalInputDescriptor.set,B=this.originalInputDescriptor.get;Object.defineProperty(HTMLInputElement.prototype,"value",{configurable:!0,enumerable:!0,get(){return B?.call(this)},set(Q){let E=B?.call(this)??"";A?.call(this,Q);let I=Q??"";if(I!==E)this.dispatchEvent(new CustomEvent(_,{bubbles:!0,detail:{valueLength:I.length,wasEmpty:E.length===0}}))}})}if(this.originalTextareaDescriptor=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value"),this.originalTextareaDescriptor){let A=this.originalTextareaDescriptor.set,B=this.originalTextareaDescriptor.get;Object.defineProperty(HTMLTextAreaElement.prototype,"value",{configurable:!0,enumerable:!0,get(){return B?.call(this)},set(Q){let E=B?.call(this)??"";A?.call(this,Q);let I=Q??"";if(I!==E)this.dispatchEvent(new CustomEvent(_,{bubbles:!0,detail:{valueLength:I.length,wasEmpty:E.length===0}}))}})}this.valueSetterHooked=!0}unhookValueSetters(){if(!this.valueSetterHooked)return;if(this.originalInputDescriptor)Object.defineProperty(HTMLInputElement.prototype,"value",this.originalInputDescriptor);if(this.originalTextareaDescriptor)Object.defineProperty(HTMLTextAreaElement.prototype,"value",this.originalTextareaDescriptor);this.valueSetterHooked=!1}handleGhostValue(A){let B=A.target;if(!this.isFormInput(B))return;let E=A.detail?.valueLength??0;if(this.inputEvents.push({field:this.getFieldId(B),t:Date.now(),inputType:"programmatic",valueLength:E}),this.inputEvents.length>this.maxInputEvents)this.inputEvents.shift()}}class d{cachedSignal=null;collect(){if(this.cachedSignal)return this.cachedSignal;let A=navigator,B=window;return this.cachedSignal={user_agent:navigator.userAgent,platform:navigator.platform,language:navigator.language,languages:[...navigator.languages||[]],hardware_concurrency:navigator.hardwareConcurrency??null,device_memory:A.deviceMemory??null,max_touch_points:navigator.maxTouchPoints??0,screen_width:screen.width,screen_height:screen.height,screen_avail_width:screen.availWidth,screen_avail_height:screen.availHeight,color_depth:screen.colorDepth,pixel_ratio:window.devicePixelRatio??1,...this.getWebGLInfo(),plugins_count:navigator.plugins?.length??0,mime_types_count:navigator.mimeTypes?.length??0,timezone:this.getTimezone(),timezone_offset:new Date().getTimezoneOffset(),has_webdriver:A.webdriver===!0,has_chrome_runtime:!!B.chrome?.runtime,has_chrome_app:!!B.chrome?.app,has_notification_api:"Notification"in window,has_permissions_api:"permissions"in navigator,outer_dimensions:{width:window.outerWidth,height:window.outerHeight},inner_dimensions:{width:window.innerWidth,height:window.innerHeight},notification_permission:this.getNotificationPermission()},this.cachedSignal}getWebGLInfo(){try{let A=document.createElement("canvas"),B=A.getContext("webgl")||A.getContext("experimental-webgl");if(!B||!(B instanceof WebGLRenderingContext))return{webgl_vendor:null,webgl_renderer:null};let Q=B.getExtension("WEBGL_debug_renderer_info");if(!Q)return{webgl_vendor:null,webgl_renderer:null};return{webgl_vendor:B.getParameter(Q.UNMASKED_VENDOR_WEBGL),webgl_renderer:B.getParameter(Q.UNMASKED_RENDERER_WEBGL)}}catch{return{webgl_vendor:null,webgl_renderer:null}}}getTimezone(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return null}}getNotificationPermission(){if("Notification"in window)return Notification.permission;return null}getSignal(){return this.collect()}reset(){this.cachedSignal=null}}b();class s{cachedFingerprint=null;async generate(){if(this.cachedFingerprint)return this.cachedFingerprint;let[A,B,Q,E,I]=await Promise.all([this.getCanvasHash(),this.getWebGLData(),this.getAudioHash(),this.getFontData(),this.getScreenHash()]),C={hash:"",canvas_hash:A,webgl_hash:B.hash,audio_hash:Q,font_hash:E.hash,screen_hash:I,webgl_vendor:B.vendor,webgl_renderer:B.renderer,timezone:this.getTimezone(),language:this.getLanguage(),platform:this.getPlatform(),font_count:E.count};return C.hash=await this.generateMainHash(C),this.cachedFingerprint=C,C}getFingerprint(){return this.cachedFingerprint}reset(){this.cachedFingerprint=null}async getCanvasHash(){try{let A=document.createElement("canvas");A.width=200,A.height=50;let B=A.getContext("2d");if(!B)return null;B.textBaseline="top",B.font="14px 'Arial'",B.fillStyle="#f60",B.fillRect(125,1,62,20),B.fillStyle="#069",B.fillText("BotSigged,\uD83C\uDFA8",2,15),B.fillStyle="rgba(102, 204, 0, 0.7)",B.fillText("BotSigged,\uD83C\uDFA8",4,17);let Q=A.toDataURL();return this.hashString(Q)}catch{return null}}async getWebGLData(){try{let A=document.createElement("canvas"),B=A.getContext("webgl")||A.getContext("experimental-webgl");if(!B||!(B instanceof WebGLRenderingContext))return{hash:null,vendor:null,renderer:null};let Q=[],E=[B.ALIASED_LINE_WIDTH_RANGE,B.ALIASED_POINT_SIZE_RANGE,B.ALPHA_BITS,B.BLUE_BITS,B.DEPTH_BITS,B.GREEN_BITS,B.MAX_COMBINED_TEXTURE_IMAGE_UNITS,B.MAX_CUBE_MAP_TEXTURE_SIZE,B.MAX_FRAGMENT_UNIFORM_VECTORS,B.MAX_RENDERBUFFER_SIZE,B.MAX_TEXTURE_IMAGE_UNITS,B.MAX_TEXTURE_SIZE,B.MAX_VARYING_VECTORS,B.MAX_VERTEX_ATTRIBS,B.MAX_VERTEX_TEXTURE_IMAGE_UNITS,B.MAX_VERTEX_UNIFORM_VECTORS,B.MAX_VIEWPORT_DIMS,B.RED_BITS,B.RENDERER,B.SHADING_LANGUAGE_VERSION,B.STENCIL_BITS,B.VENDOR,B.VERSION];for(let W of E)try{let X=B.getParameter(W);Q.push(String(X))}catch{Q.push("")}let I=B.getSupportedExtensions();if(I)Q.push(I.sort().join(","));let C=null,Y=null,G=B.getExtension("WEBGL_debug_renderer_info");if(G)C=B.getParameter(G.UNMASKED_VENDOR_WEBGL),Y=B.getParameter(G.UNMASKED_RENDERER_WEBGL);return{hash:this.hashString(Q.join("|")),vendor:C,renderer:Y}}catch{return{hash:null,vendor:null,renderer:null}}}async getAudioHash(){try{let A=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(!A)return null;let B=new A(1,4500,44100),Q=B.createOscillator(),E=B.createDynamicsCompressor();Q.type="triangle",Q.frequency.setValueAtTime(1e4,B.currentTime),E.threshold.setValueAtTime(-50,B.currentTime),E.knee.setValueAtTime(40,B.currentTime),E.ratio.setValueAtTime(12,B.currentTime),E.attack.setValueAtTime(0,B.currentTime),E.release.setValueAtTime(0.25,B.currentTime),Q.connect(E),E.connect(B.destination),Q.start(0);let C=(await B.startRendering()).getChannelData(0),Y=[];for(let G=0;G<C.length;G+=100)Y.push(C[G]);return this.hashString(Y.join(","))}catch{return null}}async getFontData(){let A=["Arial","Arial Black","Arial Narrow","Calibri","Cambria","Cambria Math","Comic Sans MS","Consolas","Courier","Courier New","Georgia","Helvetica","Impact","Lucida Console","Lucida Sans Unicode","Microsoft Sans Serif","MS Gothic","MS PGothic","MS Sans Serif","MS Serif","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Symbol","Tahoma","Times","Times New Roman","Trebuchet MS","Verdana","Wingdings"],B=["monospace","sans-serif","serif"],Q="mmmmmmmmmmlli",E="72px",I=document.createElement("span");I.style.position="absolute",I.style.left="-9999px",I.style.fontSize="72px",I.style.lineHeight="normal",I.innerHTML="mmmmmmmmmmlli",document.body.appendChild(I);let C={};for(let Z of B)I.style.fontFamily=Z,C[Z]=I.offsetWidth;let Y=[];for(let Z of A){let W=!1;for(let X of B)if(I.style.fontFamily=`'${Z}', ${X}`,I.offsetWidth!==C[X]){W=!0;break}if(W)Y.push(Z)}return document.body.removeChild(I),{hash:this.hashString(Y.join(",")),count:Y.length}}async getScreenHash(){let A=[String(screen.width),String(screen.height),String(screen.availWidth),String(screen.availHeight),String(screen.colorDepth),String(screen.pixelDepth),String(window.devicePixelRatio||1)];return this.hashString(A.join("|"))}getTimezone(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return null}}getLanguage(){return navigator.language||null}getPlatform(){return navigator.platform||null}generateMainHash(A){let B=[A.canvas_hash||"",A.webgl_hash||"",A.audio_hash||"",A.font_hash||"",A.screen_hash||"",A.timezone||"",A.language||"",A.platform||""];return this.hashString(B.join("|"))}hashString(A){return i(A)}}class n{ws=null;endpoint;apiKey;heartbeatInterval;reconnectAttempts;reconnectDelay;debug;state="disconnected";channelState="closed";refCounter=0;joinRef=null;heartbeatTimer=null;reconnectTimer=null;reconnectCount=0;pendingReplies=new Map;onConnectionChange;onError;channelCallbacks={};topic=null;constructor(A){this.endpoint=A.endpoint,this.apiKey=A.apiKey,this.heartbeatInterval=A.heartbeatInterval??30000,this.reconnectAttempts=A.reconnectAttempts??10,this.reconnectDelay=A.reconnectDelay??((B)=>Math.min(1000*Math.pow(2,B),30000)),this.debug=A.debug??!1,this.onConnectionChange=A.onConnectionChange,this.onError=A.onError}connect(){return new Promise((A,B)=>{if(this.ws&&this.state==="connected"){A();return}this.setState("connecting");let Q=this.buildUrl();this.log("Connecting to",Q);try{this.ws=new WebSocket(Q),this.ws.onopen=()=>{this.log("WebSocket connected"),this.setState("connected"),this.reconnectCount=0,this.startHeartbeat(),A()},this.ws.onclose=(E)=>{this.log("WebSocket closed",E.code,E.reason),this.handleClose()},this.ws.onerror=(E)=>{this.log("WebSocket error",E);let I=Error("WebSocket connection error");this.handleError(I),B(I)},this.ws.onmessage=(E)=>{this.handleMessage(E.data)}}catch(E){let I=E instanceof Error?E:Error(String(E));this.handleError(I),B(I)}})}disconnect(){if(this.stopHeartbeat(),this.stopReconnect(),this.ws)this.ws.close(1000,"Client disconnect"),this.ws=null;this.setState("disconnected"),this.setChannelState("closed")}joinChannel(A,B,Q,E,I={},C){return this.channelCallbacks=I,this.topic=`detection:${A}`,new Promise((Y,G)=>{if(this.state!=="connected"){G(Error("WebSocket not connected"));return}this.setChannelState("joining"),this.joinRef=this.makeRef();let Z={session_id:A,api_key:this.apiKey,fingerprint:B,session:Q,browser:E};if(C)Z.account_id=C;this.push("phx_join",Z,this.joinRef).then((W)=>{this.log("Channel joined",W),this.setChannelState("joined"),this.channelCallbacks.onJoin?.(),Y(W)}).catch((W)=>{this.log("Channel join failed",W),this.setChannelState("error"),this.channelCallbacks.onError?.(W),G(W)})})}leaveChannel(){return new Promise((A,B)=>{if(this.channelState!=="joined"){A();return}this.setChannelState("leaving"),this.push("phx_leave",{}).then(()=>{this.log("Channel left"),this.setChannelState("closed"),this.joinRef=null,this.topic=null,this.channelCallbacks.onLeave?.(),A()}).catch((Q)=>{this.setChannelState("error"),B(Q)})})}sendSignal(A){if(this.channelState!=="joined")return Promise.reject(Error("Channel not joined"));return this.push("signal",A)}sendFormStatus(A){if(this.channelState!=="joined")return Promise.reject(Error("Channel not joined"));return this.push("form_status",{status:A})}sendEvent(A,B){if(this.channelState!=="joined")return Promise.reject(Error("Channel not joined"));return this.push(A,B)}getState(){return this.state}getChannelState(){return this.channelState}isReady(){return this.state==="connected"&&this.channelState==="joined"}buildUrl(){let A=new URL(this.endpoint);return A.searchParams.set("vsn","2.0.0"),A.searchParams.set("api_key",this.apiKey),A.toString()}makeRef(){return this.refCounter++,String(this.refCounter)}push(A,B,Q){return new Promise((E,I)=>{if(!this.ws||this.ws.readyState!==WebSocket.OPEN){I(Error("WebSocket not open"));return}if(!this.topic){I(Error("Channel topic not set"));return}let C=Q??this.makeRef(),Y=[this.joinRef,C,this.topic,A,B],G=setTimeout(()=>{this.pendingReplies.delete(C),I(Error(`Timeout waiting for reply to ${A}`))},1e4);this.pendingReplies.set(C,{resolve:E,reject:I,timeout:G}),this.log("Sending",A,B),this.ws.send(JSON.stringify(Y))})}handleMessage(A){try{let[B,Q,E,I,C]=JSON.parse(A);if(this.log("Received",I,C),I==="phx_reply"&&Q){let Y=this.pendingReplies.get(Q);if(Y){clearTimeout(Y.timeout),this.pendingReplies.delete(Q);let G=C;if(G.status==="ok")Y.resolve(G.response??{});else if(G.response&&typeof G.response==="object"&&"code"in G.response)Y.reject(G.response);else{let Z=this.buildErrorMessage(G.status,G.response);Y.reject(Error(Z))}}return}if(I==="phx_error"){let Y=Error("Channel error");this.setChannelState("error"),this.channelCallbacks.onError?.(Y);return}if(I==="phx_close"){this.setChannelState("closed"),this.channelCallbacks.onLeave?.();return}if(I==="score_update"){this.channelCallbacks.onScoreUpdate?.(C);return}if(I==="action"){this.channelCallbacks.onAction?.(C);return}this.channelCallbacks.onMessage?.(I,C)}catch(B){this.log("Error parsing message",B)}}handleClose(){this.stopHeartbeat(),this.setState("disconnected"),this.setChannelState("closed");for(let[A,B]of this.pendingReplies)clearTimeout(B.timeout),B.reject(Error("Connection closed"));this.pendingReplies.clear(),this.scheduleReconnect()}handleError(A){this.setState("error"),this.onError?.(A)}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){let A=[null,this.makeRef(),"phoenix","heartbeat",{}];if(this.ws.send(JSON.stringify(A)),this.channelState==="joined")this.push("heartbeat",{}).then((B)=>{if(B.bot_score!==void 0)this.channelCallbacks.onScoreUpdate?.({bot_score:B.bot_score,classification:B.classification,triggered_rules:[],event_count:0})}).catch(()=>{})}},this.heartbeatInterval)}stopHeartbeat(){if(this.heartbeatTimer)clearInterval(this.heartbeatTimer),this.heartbeatTimer=null}scheduleReconnect(){if(this.reconnectCount>=this.reconnectAttempts){this.log("Max reconnect attempts reached");return}let A=this.reconnectDelay(this.reconnectCount);this.reconnectCount++,this.log(`Scheduling reconnect attempt ${this.reconnectCount} in ${A}ms`),this.reconnectTimer=setTimeout(()=>{this.connect().catch((B)=>{this.log("Reconnect failed",B)})},A)}stopReconnect(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;this.reconnectCount=0}setState(A){if(this.state!==A)this.state=A,this.onConnectionChange?.(A)}setChannelState(A){this.channelState=A}buildErrorMessage(A,B){if(B){if(typeof B.reason==="string")return`Channel error: ${B.reason}`;if(Object.keys(B).length>0)return`Channel error (${A??"error"}): ${JSON.stringify(B)}`}return A??"Unknown error"}log(...A){if(this.debug);}}class t{config;isReady=!1;hasScore=!1;hasFormScore=!1;currentScore=null;pendingSubmissions=[];pendingRequests=[];protectedForms=new Set;releasingForms=new Set;loadingOverlay=null;formObserver=null;startTime;originalFetch=null;originalXHROpen=null;originalXHRSend=null;constructor(A={}){if(this.startTime=performance.now(),this.config={mode:A.mode??"none",minTimeBeforeSubmit:A.minTimeBeforeSubmit??500,maxHoldTime:A.maxHoldTime??5000,showLoadingUI:A.showLoadingUI??!0,loadingMessage:A.loadingMessage??"Please wait...",onHold:A.onHold,onRelease:A.onRelease,onBlock:A.onBlock,flushAndWaitForScore:A.flushAndWaitForScore},this.config.mode!=="none")this.setup()}setup(){if(this.config.mode==="auto")this.interceptFetch(),this.interceptXHR();let A=()=>{document.querySelectorAll("form").forEach((B)=>{this.protectForm(B)}),this.formObserver=new MutationObserver((B)=>{B.forEach((Q)=>{Q.addedNodes.forEach((E)=>{if(E instanceof HTMLFormElement)this.protectForm(E);if(E instanceof HTMLElement)E.querySelectorAll("form").forEach((I)=>{this.protectForm(I)})})})}),this.formObserver.observe(document.body,{childList:!0,subtree:!0})};if(document.body)A();else document.addEventListener("DOMContentLoaded",A,{once:!0})}isFormLikeRequest(A,B){if((B?.method?.toUpperCase()||"GET")!=="POST")return!1;try{if((typeof A==="string"?new URL(A,window.location.origin):A instanceof URL?A:new URL(A.url)).origin!==window.location.origin)return!1}catch{return!1}let E=B?.headers instanceof Headers?B.headers.get("content-type"):typeof B?.headers==="object"&&B.headers!==null?B.headers["content-type"]||B.headers["Content-Type"]:null;if(E){let I=E.toLowerCase();if(I.includes("application/x-www-form-urlencoded")||I.includes("multipart/form-data")||I.includes("application/json"))return!0;return!1}if(B?.body)return!0;return!1}interceptFetch(){this.originalFetch=window.fetch.bind(window);let A=this;window.fetch=async function(B,Q){if(!A.isFormLikeRequest(B,Q))return A.originalFetch(B,Q);if(A.hasScore)return A.originalFetch(B,Q);return new Promise((E,I)=>{let C={resolve:E,reject:I,execute:()=>A.originalFetch(B,Q),timestamp:performance.now()};if(A.pendingRequests.push(C),A.config.showLoadingUI&&A.pendingRequests.length===1)A.showLoading(document.createElement("form"));if(setTimeout(()=>{if(A.pendingRequests.includes(C))A.releaseRequest(C)},A.config.maxHoldTime),A.hasScore)A.releaseRequest(C)})}}interceptXHR(){this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send;let A=this;XMLHttpRequest.prototype.open=function(B,Q,E=!0,I,C){let Y=this;return Y._bsMethod=B.toUpperCase(),Y._bsUrl=Q.toString(),A.originalXHROpen.call(this,B,Q,E,I,C)},XMLHttpRequest.prototype.send=function(B){let Q=this,E=Q._bsMethod||"GET",I=Q._bsUrl||"";if(E!=="POST")return A.originalXHRSend.call(this,B);try{if(new URL(I,window.location.origin).origin!==window.location.origin)return A.originalXHRSend.call(this,B)}catch{return A.originalXHRSend.call(this,B)}if(A.hasScore)return A.originalXHRSend.call(this,B);let C=performance.now(),Y=()=>{if(A.hasScore){if(A.config.showLoadingUI)A.hideLoading();A.originalXHRSend.call(Q,B)}else if(performance.now()-C>=A.config.maxHoldTime){if(A.config.showLoadingUI)A.hideLoading();A.originalXHRSend.call(Q,B)}else setTimeout(Y,50)};if(A.config.showLoadingUI)A.showLoading(document.createElement("form"));Y()}}releaseRequest(A){let B=this.pendingRequests.indexOf(A);if(B===-1)return;if(this.pendingRequests.splice(B,1),this.pendingRequests.length===0&&this.config.showLoadingUI)this.hideLoading();A.execute().then(A.resolve).catch(A.reject)}protectForm(A){if(this.protectedForms.has(A))return;this.protectedForms.add(A),A.addEventListener("submit",(B)=>this.handleSubmit(B,A),{capture:!0})}handleSubmit(A,B){if(this.releasingForms.has(B)){this.releasingForms.delete(B);return}let E=performance.now()-this.startTime;switch(O().markFirstSubmitAttempt(this.hasScore),this.config.mode){case"holdUntilReady":if(!this.hasScore)A.preventDefault(),A.stopPropagation(),this.holdSubmission(B,A);break;case"holdUntilFormScored":A.preventDefault(),A.stopPropagation(),this.holdAndScoreSubmission(B,A);break;case"blockInstant":if(E<this.config.minTimeBeforeSubmit)A.preventDefault(),A.stopPropagation(),this.config.onBlock?.(B,"instant_submission");break;case"challengeFirst":if(!this.hasScore)A.preventDefault(),A.stopPropagation(),this.holdSubmission(B,A);break;case"none":default:break}}holdSubmission(A,B){if(this.config.onHold?.(A),this.config.showLoadingUI)this.showLoading(A);let Q={form:A,event:B,timestamp:performance.now(),resolver:()=>{},rejecter:()=>{}},E=new Promise((I,C)=>{Q.resolver=I,Q.rejecter=C});if(this.pendingSubmissions.push(Q),setTimeout(()=>{if(this.pendingSubmissions.includes(Q))this.releaseSubmission(Q,!1)},this.config.maxHoldTime),this.hasScore)this.releaseSubmission(Q,!1);E.catch(()=>{})}async holdAndScoreSubmission(A,B){if(this.config.onHold?.(A),this.config.showLoadingUI)this.showLoading(A);let Q=performance.now();try{if(!this.config.flushAndWaitForScore){this.submitForm(A);return}let E=this.config.flushAndWaitForScore(),I=new Promise((G)=>{setTimeout(()=>G(null),this.config.maxHoldTime)}),C=await Promise.race([E,I]),Y=performance.now()-Q;if(C===null);else this.currentScore=C,this.hasFormScore=!0;if(this.config.showLoadingUI)this.hideLoading();this.config.onRelease?.(A,!1),this.submitForm(A)}catch(E){if(this.config.showLoadingUI)this.hideLoading();this.config.onRelease?.(A,!1),this.submitForm(A)}}submitForm(A){if(this.releasingForms.add(A),A.requestSubmit)A.requestSubmit();else A.submit()}releaseSubmission(A,B){let Q=this.pendingSubmissions.indexOf(A);if(Q===-1)return;if(this.pendingSubmissions.splice(Q,1),this.config.showLoadingUI)this.hideLoading();if(this.config.onRelease?.(A.form,B),!B)if(A.resolver(),A.form.requestSubmit)A.form.requestSubmit();else A.form.submit();else A.rejecter("blocked")}showLoading(A){if(this.loadingOverlay)return;this.loadingOverlay=document.createElement("div"),this.loadingOverlay.innerHTML=`
44
2
  <div style="
45
3
  position: fixed;
46
4
  top: 0;
@@ -0,0 +1,3 @@
1
+ import{c as V}from"./hash-q46pgar4.js";class U{overlay=null;messageEl=null;progressEl=null;config;constructor(j){this.config=j}show(){return}setProgress(j){if(this.progressEl){let q=Math.min(100,Math.max(0,j*100));this.progressEl.style.width=`${q}%`}}showSuccess(){if(this.messageEl)this.messageEl.textContent=this.config.successMessage;if(this.progressEl)this.progressEl.style.width="100%"}hide(){if(this.overlay)this.overlay.remove(),this.overlay=null,this.messageEl=null,this.progressEl=null}isVisible(){return this.overlay!==null}}function _(){let j=new Uint8Array(16);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(j);else for(let q=0;q<16;q++)j[q]=Math.floor(Math.random()*256);return j}function $(j){if(j===0)return 32;let q=0;if((j&4294901760)===0)q+=16,j<<=16;if((j&4278190080)===0)q+=8,j<<=8;if((j&4026531840)===0)q+=4,j<<=4;if((j&3221225472)===0)q+=2,j<<=2;if((j&2147483648)===0)q+=1;return q}function B(j,q,A,E){let G=V(),F=new Uint8Array(j.length+4);F.set(j);let w=E,D=0;while(D<A){F[j.length]=w&255,F[j.length+1]=w>>>8&255,F[j.length+2]=w>>>16&255,F[j.length+3]=w>>>24&255;let K=G.xxHash32(F,0);if(D++,$(K)>=q)return{nonce:w,found:!0,iterations:D};w=w+1>>>0}return{nonce:w,found:!1,iterations:D}}class H{config;overlay;solving=!1;solved=!1;pendingForms=new Map;formHandler=null;formObserver=null;resubmitting=!1;debug;constructor(j,q=!1){this.config=j,this.debug=q,this.overlay=new U(j.ui)}getDifficultyForLevel(j){let q=this.config.difficulty;switch(j){case"critical":return q.critical;case"high":return q.high;case"medium":return q.medium;default:return 0}}shouldChallenge(j){if(!this.config.enabled||this.solved)return!1;let q=["low","medium","high","critical"],A=q.indexOf(j),E=q.indexOf(this.config.minLevel);return A>=E}blockFormsUntilSolved(j){if(this.formHandler)return;this.formHandler=(q)=>{if(this.solved||this.resubmitting)return;q.preventDefault(),q.stopPropagation();let A=q.target;if(!this.pendingForms.has(A))this.pendingForms.set(A,q);if(!this.solving)this.startChallenge(j)},document.querySelectorAll("form").forEach((q)=>{q.addEventListener("submit",this.formHandler,!0)}),this.formObserver=new MutationObserver((q)=>{q.forEach((A)=>{A.addedNodes.forEach((E)=>{if(E instanceof HTMLFormElement&&this.formHandler)E.addEventListener("submit",this.formHandler,!0);if(E instanceof HTMLElement&&this.formHandler)E.querySelectorAll("form").forEach((G)=>{G.addEventListener("submit",this.formHandler,!0)})})})}),this.formObserver.observe(document.body,{childList:!0,subtree:!0}),this.log("Forms blocked, challenge required")}async startChallenge(j){if(this.solving||this.solved)return;this.solving=!0;let q=this.getDifficultyForLevel(j),A=_(),E=performance.now();this.log(`Starting challenge: difficulty=${q}, level=${j}`),this.config.onChallengeStart?.(j,q),this.overlay.show();let G=1<<q,F=0,w=0,D;do{await new Promise((Y)=>setTimeout(Y,0)),D=B(A,q,this.config.chunkSize,F),w+=D.iterations,F=D.nonce+1;let Q=Math.min(1,w/G);this.overlay.setProgress(Q),this.config.onChallengeProgress?.(Q,w)}while(!D.found);let K=performance.now()-E;this.log(`Challenge solved: nonce=${D.nonce}, iterations=${w}, time=${K.toFixed(0)}ms`),this.overlay.showSuccess(),await new Promise((Q)=>setTimeout(Q,500)),this.overlay.hide(),this.solved=!0,this.solving=!1;let X={solveTimeMs:K,iterations:w,difficulty:q,level:j,nonce:D.nonce};this.config.onChallengeComplete?.(X),this.unblockForms()}unblockForms(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.formHandler)document.querySelectorAll("form").forEach((j)=>{j.removeEventListener("submit",this.formHandler,!0)}),this.formHandler=null;this.log("Forms unblocked"),this.resubmitting=!0,this.pendingForms.forEach((j,q)=>{if(this.log("Resubmitting pending form"),q.requestSubmit)q.requestSubmit();else q.submit()}),this.pendingForms.clear(),this.resubmitting=!1}isSolving(){return this.solving}isSolved(){return this.solved}reset(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.formHandler)document.querySelectorAll("form").forEach((j)=>{j.removeEventListener("submit",this.formHandler,!0)}),this.formHandler=null;this.solved=!1,this.solving=!1,this.resubmitting=!1,this.pendingForms.clear()}log(...j){if(this.debug);}}export{H as ChallengeManager};
2
+
3
+ //# debugId=B58B5FCA888C5C8764756E2164756E21
package/dist/index.js CHANGED
@@ -37,6 +37,6 @@ import{a as y,b as U,d as S}from"./hash-q46pgar4.js";function T(Q){return typeof
37
37
  to { transform: rotate(360deg); }
38
38
  }
39
39
  </style>
40
- `,document.body.appendChild(this.loadingOverlay)}hideLoading(){if(this.loadingOverlay)this.loadingOverlay.remove(),this.loadingOverlay=null}notifyReady(Q){this.isReady=!0,this.hasScore=!0,this.currentScore=Q,[...this.pendingSubmissions].forEach((Z)=>{this.releaseSubmission(Z,!1)}),[...this.pendingRequests].forEach((Z)=>{this.releaseRequest(Z)}),this.hideLoading()}blockAllPending(Q){[...this.pendingSubmissions].forEach((Y)=>{this.config.onBlock?.(Y.form,Q),this.releaseSubmission(Y,!0)})}getStatus(){return{mode:this.config.mode,isReady:this.isReady,hasScore:this.hasScore,pendingCount:this.pendingSubmissions.length,protectedFormCount:this.protectedForms.size}}waitUntilReady(){if(this.hasScore)return Promise.resolve({score:this.currentScore,timedOut:!1});return new Promise((Q)=>{let X=performance.now(),Y=()=>{if(this.hasScore){Q({score:this.currentScore,timedOut:!1});return}if(performance.now()-X>=this.config.maxHoldTime){Q({score:null,timedOut:!0});return}setTimeout(Y,50)};Y()})}withProtection(Q){return async(...X)=>{let Y=performance.now()-this.startTime;if(P().markFirstSubmitAttempt(this.hasScore),this.config.mode==="blockInstant"&&Y<this.config.minTimeBeforeSubmit)throw this.config.onBlock?.(document.createElement("form"),"instant_submission"),Error("Submission blocked: too fast");if(this.config.mode==="holdUntilReady"&&!this.hasScore){if(this.config.showLoadingUI)this.showLoading(document.createElement("form"));let{timedOut:Z}=await this.waitUntilReady();if(this.config.showLoadingUI)this.hideLoading()}return Q(...X)}}protectedFetch(){return this.withProtection(async(Q,X)=>{return fetch(Q,X)})}setMode(Q){if(this.config.mode=Q,Q==="none")[...this.pendingSubmissions].forEach((Y)=>this.releaseSubmission(Y,!1))}setMaxHoldTime(Q){this.config.maxHoldTime=Q}canSubmit(){let Q=performance.now()-this.startTime;if(this.config.mode==="blockInstant"&&Q<this.config.minTimeBeforeSubmit)return{allowed:!1,reason:"too_fast",score:this.currentScore};if(this.config.mode==="holdUntilReady"&&!this.hasScore)return{allowed:!1,reason:"waiting_for_score",score:null};return{allowed:!0,score:this.currentScore}}destroy(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.originalFetch)window.fetch=this.originalFetch,this.originalFetch=null;if(this.originalXHROpen)XMLHttpRequest.prototype.open=this.originalXHROpen,this.originalXHROpen=null;if(this.originalXHRSend)XMLHttpRequest.prototype.send=this.originalXHRSend,this.originalXHRSend=null;this.hideLoading(),this.pendingSubmissions=[],this.pendingRequests=[],this.protectedForms.clear()}}var v={suspicious:40,bot:70},w={name:"_bsid",riskName:"_bsrisk",path:"/",sameSite:"Strict"};function u(Q){if(!Q)return null;if(Q===!0)return{...w};return{...w,...Q}}function a(Q){if(Q>=v.bot)return"bot";if(Q>=v.suspicious)return"suspicious";return"human"}class M{config;sessionIdGetter;sessionCookieSet=!1;currentRiskTier=null;constructor(Q,X){this.config={...w,...Q},this.sessionIdGetter=X}buildCookieString(Q,X){let Y=this.config.path||w.path,Z=this.config.sameSite||w.sameSite,$=this.config.secure??location.protocol==="https:",J=[`${encodeURIComponent(Q)}=${encodeURIComponent(X)}`,`Path=${Y}`,`SameSite=${Z}`];if($||Z==="None")J.push("Secure");return J.join("; ")}deleteCookie(Q){let X=this.config.path||w.path;document.cookie=`${encodeURIComponent(Q)}=; Path=${X}; Max-Age=0`}setSessionCookie(){if(this.sessionCookieSet)return;let Q=this.sessionIdGetter();if(!Q)return;let X=this.config.name||w.name;document.cookie=this.buildCookieString(X,Q),this.sessionCookieSet=!0}updateRiskTier(Q){let X=a(Q);if(X===this.currentRiskTier)return!1;let Y=this.config.riskName||w.riskName;document.cookie=this.buildCookieString(Y,X);let Z=this.currentRiskTier;return this.currentRiskTier=X,!0}removeCookies(){let Q=this.config.name||w.name,X=this.config.riskName||w.riskName;if(this.sessionCookieSet)this.deleteCookie(Q),this.sessionCookieSet=!1;if(this.currentRiskTier!==null)this.deleteCookie(X),this.currentRiskTier=null}setCookie(){this.setSessionCookie()}removeCookie(){this.removeCookies()}isSessionCookieSet(){return this.sessionCookieSet}getCurrentRiskTier(){return this.currentRiskTier}getSessionCookieName(){return this.config.name||w.name}getRiskCookieName(){return this.config.riskName||w.riskName}}var G={name:"X-BotSigged-ID"};function m(Q){if(!Q)return null;if(Q===!0)return{...G};return{...G,...Q}}class E{config;sessionIdGetter;started=!1;originalFetch=null;originalXHROpen=null;originalXHRSend=null;originalXHRSetRequestHeader=null;xhrInjectionMap=new WeakMap;constructor(Q,X){this.config={...G,...Q},this.sessionIdGetter=X}start(){if(this.started)return;this.started=!0,this.patchFetch(),this.patchXHR()}stop(){if(!this.started)return;if(this.originalFetch)window.fetch=this.originalFetch,this.originalFetch=null;if(this.originalXHROpen)XMLHttpRequest.prototype.open=this.originalXHROpen,this.originalXHROpen=null;if(this.originalXHRSend)XMLHttpRequest.prototype.send=this.originalXHRSend,this.originalXHRSend=null;if(this.originalXHRSetRequestHeader)XMLHttpRequest.prototype.setRequestHeader=this.originalXHRSetRequestHeader,this.originalXHRSetRequestHeader=null;this.started=!1}isSameOrigin(Q){try{let X;if(Q instanceof Request)X=new URL(Q.url,window.location.origin);else if(Q instanceof URL)X=Q;else X=new URL(Q,window.location.origin);return X.origin===window.location.origin}catch{return!0}}patchFetch(){this.originalFetch=window.fetch.bind(window);let Q=this,X=this.config.name||G.name;window.fetch=function(Y,Z){if(!Q.isSameOrigin(Y))return Q.originalFetch(Y,Z);let $=Q.sessionIdGetter();if(!$)return Q.originalFetch(Y,Z);let J=new Headers(Z?.headers);if(!J.has(X))J.set(X,$);return Q.originalFetch(Y,{...Z,headers:J})}}patchXHR(){this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send,this.originalXHRSetRequestHeader=XMLHttpRequest.prototype.setRequestHeader;let Q=this,X=this.config.name||G.name;XMLHttpRequest.prototype.open=function(Y,Z,$=!0,J,z){let W=Q.isSameOrigin(Z);return Q.xhrInjectionMap.set(this,W),Q.originalXHROpen.call(this,Y,Z,$,J,z)},XMLHttpRequest.prototype.send=function(Y){if(Q.xhrInjectionMap.get(this)){let Z=Q.sessionIdGetter();if(Z)try{Q.originalXHRSetRequestHeader.call(this,X,Z)}catch{}}return Q.originalXHRSend.call(this,Y)}}getHeaderName(){return this.config.name||G.name}isStarted(){return this.started}}var R={selector:"form",inputName:"_bsid"};function d(Q){if(!Q)return null;if(Q===!0)return{...R};return{...R,...Q}}class I{config;sessionIdGetter;observer=null;started=!1;constructor(Q,X){this.config={...R,...Q},this.sessionIdGetter=X}start(){if(this.started)return;this.started=!0;let Q=()=>{this.setupExistingForms(),this.setupObserver()};if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",Q,{once:!0});else Q()}stop(){if(!this.started)return;if(this.observer)this.observer.disconnect(),this.observer=null;let Q=this.config.selector||R.selector,X=this.config.inputName||R.inputName;document.querySelectorAll(`${Q}[data-bs-inject-setup]`).forEach((Y)=>{if(Y instanceof HTMLFormElement)Y.removeEventListener("submit",this.handleSubmit,{capture:!0});Y.removeAttribute("data-bs-inject-setup");let Z=Y.querySelector(`input[name="${X}"][data-bs-injected]`);if(Z)Z.remove()}),this.started=!1}setupExistingForms(){let Q=this.config.selector||R.selector;document.querySelectorAll(Q).forEach((X)=>{if(X instanceof HTMLFormElement)this.setupForm(X)})}setupObserver(){if(!document.body)return;let Q=this.config.selector||R.selector;this.observer=new MutationObserver((X)=>{X.forEach((Y)=>{Y.addedNodes.forEach((Z)=>{if(Z instanceof HTMLFormElement&&Z.matches(Q))this.setupForm(Z);if(Z instanceof HTMLElement)Z.querySelectorAll(Q).forEach(($)=>{if($ instanceof HTMLFormElement)this.setupForm($)})})})}),this.observer.observe(document.body,{childList:!0,subtree:!0})}setupForm(Q){if(Q.hasAttribute("data-bs-inject-setup"))return;Q.setAttribute("data-bs-inject-setup","true"),Q.addEventListener("submit",this.handleSubmit,{capture:!0})}handleSubmit=(Q)=>{let X=Q.currentTarget;this.injectInput(X)};injectInput(Q){let X=this.config.inputName||R.inputName,Y=Q.querySelector(`input[name="${X}"]`);if(Y){if(Y.hasAttribute("data-bs-injected"))Y.value=this.sessionIdGetter();return}let Z=document.createElement("input");Z.type="hidden",Z.name=X,Z.value=this.sessionIdGetter(),Z.setAttribute("data-bs-injected","true"),Q.appendChild(Z)}getConfig(){return{...this.config}}isStarted(){return this.started}}async function kQ(){return await import("./hash-q46pgar4.js")}class V{static instance=null;static init(Q){if(V.instance)return V.instance;return V.instance=new V(Q),V.instance}static getInstance(){return V.instance}static async destroy(){if(V.instance)await V.instance.stop(),V.instance=null}config;mouseCollector;scrollCollector;formCollector;browserCollector;fingerprintGenerator;socket=null;sessionId;sequenceNumber=0;isRunning=!1;sendTimer=null;fingerprint=null;browserSignal=null;lastScore=null;hasSentInitial=!1;boundBeforeUnload=null;boundVisibilityChange=null;hashModule=null;formBlocked=!1;formObserver=null;highScoreTriggeredLevels=new Set;challengeManager=null;challengeManagerPromise=null;formProtectionManager=null;formSubmissionStatus="no_submission";cookieManager=null;headerInjector=null;formInjector=null;serverConfig=null;connectionState="disconnected";reconnectTimer=null;readyPromise;readyResolver=null;constructor(Q){if(K.markConstructorStart(),!Q.apiKey)throw Error("BotSigged: apiKey is required");if(this.config=h(Q),this.sessionId=this.generateSessionId(),this.readyPromise=new Promise(($)=>{this.readyResolver=$}),this.mouseCollector=new k({sampleRate:this.config.mouseSampleRate,maxBufferSize:this.config.maxBufferSize}),this.scrollCollector=new x({maxBufferSize:Math.floor(this.config.maxBufferSize/3)}),this.formCollector=new C({maxKeyEvents:this.config.maxBufferSize,onSubmit:()=>this.handleFormSubmit()}),this.browserCollector=new L,this.fingerprintGenerator=new D,this.config.hashVerification.enabled)this.initializeHashModule();if(this.config.action==="challenge"||this.config.challenge.enabled)this.challengeManagerPromise=this.initializeChallengeManager();if(this.config.formProtection.mode!=="none")this.formProtectionManager=new b({mode:this.config.formProtection.mode,minTimeBeforeSubmit:this.config.formProtection.minTimeBeforeSubmit,maxHoldTime:this.config.formProtection.maxHoldTime,showLoadingUI:this.config.formProtection.showLoadingUI,loadingMessage:this.config.formProtection.loadingMessage,onHold:($)=>{this.updateFormStatus("challenged"),this.config.formProtection.onHold?.($)},onRelease:($,J)=>{if(!J)this.updateFormStatus("completed");this.config.formProtection.onRelease?.($,J)},onBlock:($,J)=>{this.updateFormStatus("blocked"),this.config.formProtection.onBlock?.($,J)},flushAndWaitForScore:()=>this.sendSignalAndGetScore()}),this.log("Form protection enabled:",this.config.formProtection.mode);else this.log("Form protection disabled (mode='none')");let X=u(this.config.cookie);if(X)this.cookieManager=new M(X,()=>this.sessionId),this.log("Cookie manager enabled:",X.name);let Y=m(this.config.headers);if(Y)this.headerInjector=new E(Y,()=>this.sessionId),this.headerInjector.start(),this.log("Header injector enabled:",Y.name);let Z=d(this.config.formInject);if(Z)this.formInjector=new I(Z,()=>this.sessionId),this.formInjector.start(),this.log("Form injector enabled:",Z.inputName);if(this.config.autoStart)if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",()=>this.start());else this.start();K.markConstructorEnd(),this.log("Constructor completed in",(K.getTimings().constructorEnd??0)-(K.getTimings().constructorStart??0),"ms")}async initializeHashModule(){try{let{initHashModule:Q}=await import("./hash-q46pgar4.js");this.hashModule=await Q({preferWasm:this.config.hashVerification.preferWasm,onWasmLoaded:()=>{this.log("WASM hash module loaded"),this.config.hashVerification.onWasmLoaded?.()},onFallback:(X)=>{this.log("Using JS hash fallback:",X),this.config.hashVerification.onWasmFallback?.(X)}})}catch(Q){this.log("Failed to initialize hash module",Q)}}async initializeChallengeManager(){try{let{ChallengeManager:Q}=await import("./challenge-8yg1wp51.js");this.challengeManager=new Q(this.config.challenge,this.config.debug),this.log("Challenge manager loaded")}catch(Q){this.log("Failed to initialize challenge manager",Q)}}async start(){if(this.isRunning){this.log("Already running");return}K.markStartCalled(),this.log("Starting BotSigged SDK"),this.isRunning=!0,this.connectionState="connecting";try{this.browserSignal=this.browserCollector.collect(),K.markFormCollectorStart(),this.mouseCollector.start(),this.scrollCollector.start(),this.formCollector.start(),K.markFormCollectorReady(),this.log("Collectors started in",(K.getTimings().formCollectorReady??0)-(K.getTimings().formCollectorStart??0),"ms"),K.markFingerprintStart(),K.markWsConnectStart();let[Q]=await Promise.all([this.fingerprintGenerator.generate(),this.connectWithRetry()]);this.fingerprint=Q,K.markFingerprintEnd(),this.log("Fingerprint generated in",(K.getTimings().fingerprintEnd??0)-(K.getTimings().fingerprintStart??0),"ms"),await this.joinChannel(),this.connectionState="connected",this.readyResolver?.(),K.markSdkReady(),this.startSendInterval(),this.registerBeforeUnload();let X=K.getSummary();if(this.log("SDK started successfully"),this.log("Total startup time:",X.totalStartupMs,"ms"),this.log("Time to first score:",X.timeToFirstScoreMs,"ms"),this.log("Vulnerability window:",X.vulnerabilityWindowMs,"ms"),this.config.debug)K.logSummary()}catch(Q){let X=Q instanceof Error?Q:Error(String(Q));this.log("Failed to start",X),this.handleConnectionFailure(X)}}async stop(){if(!this.isRunning)return;if(this.log("Stopping BotSigged SDK"),this.formProtectionManager)this.formProtectionManager.destroy(),this.formProtectionManager=null;if(this.cookieManager)this.cookieManager.removeCookies(),this.cookieManager=null;if(this.headerInjector)this.headerInjector.stop(),this.headerInjector=null;if(this.formInjector)this.formInjector.stop(),this.formInjector=null;if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;this.unregisterBeforeUnload(),this.mouseCollector.stop(),this.scrollCollector.stop(),this.formCollector.stop(),this.stopSendInterval(),await this.sendSignal(),await this.disconnect(),this.isRunning=!1,this.log("SDK stopped")}async sendSignal(){if(!this.socket?.isReady()){this.log("Cannot send signal: not connected");return}let Q=this.buildPayload(),X=Q.seq;this.log("Sending signal seq:",X),K.markSignalSent(X);try{let Y=await this.socket.sendSignal(Q);K.markSignalResponseReceived(X);let Z=K.getTimings().signalRoundtrips||[],$=Z[Z.length-1];if($)this.log("Signal roundtrip:",$.roundtripMs,"ms");if(Y.bot_score!==void 0){let J={bot_score:Y.bot_score,classification:Y.classification||"unknown",triggered_rules:Y.triggered_rules||[]};this.lastScore=J,this.config.onScoreUpdate?.(J),this.handleScoreUpdate(J)}this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush(),this.hasSentInitial=!0}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));this.log("Failed to send signal",Z),this.config.onError?.(Z)}}async sendSignalAndGetScore(){if(!this.socket?.isReady())return this.log("Cannot send signal: not connected"),null;let Q=this.buildPayload(),X=Q.seq;this.log("Sending signal for form scoring, seq:",X);try{let Y=await this.socket.sendSignal(Q);if(Y.bot_score!==void 0){let Z={bot_score:Y.bot_score,classification:Y.classification||"unknown",triggered_rules:Y.triggered_rules||[]};return this.lastScore=Z,this.config.onScoreUpdate?.(Z),this.handleScoreUpdate(Z),this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush(),this.hasSentInitial=!0,Z.bot_score}return this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush(),this.hasSentInitial=!0,null}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));return this.log("Failed to send signal for form scoring",Z),this.config.onError?.(Z),null}}getSessionId(){return this.sessionId}getFingerprint(){return this.fingerprint}getFormSubmissionStatus(){return this.formSubmissionStatus}getLastScore(){return this.lastScore}isConnected(){return this.socket?.isReady()??!1}whenReady(){if(this.connectionState==="connected")return Promise.resolve();return this.readyPromise}getConnectionState(){return this.connectionState}getServerConfig(){return this.serverConfig}async identify(Q){let{accountId:X}=Q;if(!X||typeof X!=="string")throw Error("BotSigged: accountId is required and must be a string");if(X.length>255)throw Error("BotSigged: accountId must be 255 characters or less");this.log("Identifying account:",X),await this.whenReady();try{let Y=await this.socket.sendEvent("identify",{account_id:X,timestamp:Date.now()});if(Y.identified)this.log("Account identified successfully");else throw Error(Y.reason?.toString()||"Failed to identify account")}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));throw this.log("Failed to identify account:",Z),this.config.onError?.(Z),Z}}isDegraded(){return this.connectionState==="degraded"||this.connectionState==="failed"}getCurrentSignals(){return{mouse:this.mouseCollector.getSignal(),scroll:this.scrollCollector.getSignal(),form:this.formCollector.getSignal(),browser:this.browserSignal}}getBufferSizes(){return{mouse:this.mouseCollector.getBufferSize(),scroll:this.scrollCollector.getBufferSize(),form:this.formCollector.getBufferSize()}}resetSignals(){this.mouseCollector.reset(),this.scrollCollector.reset(),this.formCollector.reset(),this.browserCollector.reset(),this.sequenceNumber=0,this.hasSentInitial=!1}async connectSocket(){this.socket=new A({endpoint:this.config.endpoint,apiKey:this.config.apiKey,debug:this.config.debug,onConnectionChange:(Q)=>{this.config.onConnectionChange?.(Q==="connected")},onError:(Q)=>{this.config.onError?.(Q)}}),await this.socket.connect(),K.markWsConnectEnd(),this.log("WebSocket connected in",(K.getTimings().wsConnectEnd??0)-(K.getTimings().wsConnectStart??0),"ms")}async connectWithRetry(){let X=[1000,2000,4000];for(let Y=0;Y<3;Y++)try{await this.connectSocket();return}catch(Z){if(this.log(`Connection attempt ${Y+1} failed:`,Z),Y<2)await this.sleep(X[Y]);else throw Z}}sleep(Q){return new Promise((X)=>setTimeout(X,Q))}handleConnectionFailure(Q){this.connectionState="failed";let X=this.config.fallbackMode||"degraded";switch(this.log("Connection failed, applying fallback mode:",X),X){case"open":if(this.connectionState="degraded",this.formProtectionManager)this.formProtectionManager.setMode("none"),this.formProtectionManager.notifyReady(0);break;case"closed":this.blockFormsUntilConnected(),this.scheduleReconnect();break;case"cached":let Y=this.loadCachedConfig();if(Y)this.applyServerConfig(Y),this.connectionState="degraded";else this.applyFallbackConfig();this.scheduleReconnect();break;case"degraded":default:this.applyFallbackConfig(),this.connectionState="degraded",this.scheduleReconnect();break}this.config.onError?.(Q),this.config.onConnectionChange?.(!1)}applyFallbackConfig(){if(this.log("Applying fallback config"),this.serverConfig=F,this.formProtectionManager&&this.serverConfig.form_protection_mode)this.formProtectionManager.setMode(this.serverConfig.form_protection_mode);this.config.onServerConfig?.(this.serverConfig,"fallback")}blockFormsUntilConnected(){if(this.formProtectionManager)this.formProtectionManager.setMode("holdUntilReady"),this.formProtectionManager.setMaxHoldTime(30000)}scheduleReconnect(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer);this.reconnectTimer=setTimeout(()=>{this.attemptReconnect()},5000)}async attemptReconnect(){this.log("Attempting reconnection..."),this.connectionState="connecting";try{if(await this.connectWithRetry(),!this.fingerprint)this.fingerprint=await this.fingerprintGenerator.generate();if(await this.joinChannel(),this.connectionState="connected",this.readyResolver?.(),this.log("Reconnection successful"),!this.sendTimer)this.startSendInterval()}catch(Q){this.log("Reconnection failed:",Q),this.connectionState="failed"}}cacheServerConfig(Q){try{localStorage.setItem(`botsigged_config_${this.config.apiKey}`,JSON.stringify({config:Q,timestamp:Date.now()}))}catch{}}loadCachedConfig(){try{let Q=localStorage.getItem(`botsigged_config_${this.config.apiKey}`);if(!Q)return null;let{config:X,timestamp:Y}=JSON.parse(Q);if(Date.now()-Y>86400000)return localStorage.removeItem(`botsigged_config_${this.config.apiKey}`),null;return X}catch{return null}}applyServerConfig(Q){if(this.log("Applying server config:",Q),this.serverConfig=Q,this.formProtectionManager&&Q.form_protection_mode)this.formProtectionManager.setMode(Q.form_protection_mode);if(Q.action&&Q.action!=="none")this.applyServerAction(Q.action,Q.challenge);this.cacheServerConfig(Q),this.config.onServerConfig?.(Q,"server")}async applyServerAction(Q,X){switch(this.log("Applying server action:",Q),Q){case"block":if(this.updateFormStatus("blocked"),!this.formBlocked)this.blockForms();break;case"challenge":if(this.updateFormStatus("challenged"),!this.challengeManager&&!this.challengeManagerPromise)this.log("Lazily loading challenge manager for server-requested challenge"),this.challengeManagerPromise=this.initializeChallengeManager();if(this.challengeManagerPromise)await this.challengeManagerPromise;if(this.challengeManager){let Y=X?.difficulty?.bot??16,Z=Y>=18?"critical":Y>=16?"high":"medium";this.challengeManager.blockFormsUntilSolved(Z)}else this.log("Challenge requested but challenge manager failed to load");break;case"flag":this.updateFormStatus("flagged"),this.log("Session flagged by server");break;case"none":default:break}}handleServerAction(Q){this.log("Received server action:",Q),this.config.onServerAction?.(Q);let X=Q.challenge?{difficulty:{suspicious:Q.challenge.difficulty,bot:Q.challenge.difficulty},timeout_ms:Q.challenge.timeout_ms}:void 0;this.applyServerAction(Q.type,X)}async joinChannel(){if(!this.socket)throw Error("WebSocket not initialized");K.markChannelJoinStart();let Q;try{Q=await this.socket.joinChannel(this.sessionId,this.fingerprint,this.getSessionData(),this.browserSignal,{onScoreUpdate:(X)=>{this.lastScore=X,this.config.onScoreUpdate?.(X),this.handleScoreUpdate(X)},onError:(X)=>{this.config.onError?.(X)},onAction:(X)=>{this.handleServerAction(X)}},this.config.accountId)}catch(X){if(T(X)){if(this.log("Usage limit exceeded:",X),this.config.onUsageLimitExceeded)this.config.onUsageLimitExceeded(X);else this.config.onError?.(Error(`Usage limit exceeded: ${X.current_usage}/${X.limit} verifications (${X.plan_name} plan). Please upgrade your plan.`));return}throw X}if(K.markChannelJoinEnd(),this.log("Channel joined in",(K.getTimings().channelJoinEnd??0)-(K.getTimings().channelJoinStart??0),"ms"),Q.config){let X=Q.config;this.applyServerConfig(X)}if(Q.initial_score!==void 0){K.markInitialScoreReceived();let X={bot_score:Q.initial_score,classification:Q.classification||"unknown",triggered_rules:Q.triggered_rules||[]};if(this.lastScore=X,this.config.onScoreUpdate?.(X),this.handleScoreUpdate(X),this.formProtectionManager)this.formProtectionManager.notifyReady(X.bot_score);if(this.cookieManager)this.cookieManager.setCookie();this.log("Initial score received:",X.bot_score,"in",(K.getTimings().initialScoreReceived??0)-(K.getTimings().startCalled??0),"ms from start")}}handleScoreUpdate(Q){if(this.cookieManager)this.cookieManager.updateRiskTier(Q.bot_score);let X=this.getBotScoreLevel(Q.bot_score),Y=Q.bot_score>=this.config.actionThreshold;if(this.shouldTriggerAlert(X)){let Z={score:Q.bot_score,level:X,scoreUpdate:Q,sessionId:this.sessionId,fingerprintHash:this.fingerprint?.hash};if(Y&&!this.highScoreTriggeredLevels.has(X))this.executeAction(Z);this.config.onHighBotScore?.(Z),this.highScoreTriggeredLevels.add(X)}}getBotScoreLevel(Q){let X=this.config.botScoreThresholds;if(Q>=X.critical)return"critical";if(Q>=X.high)return"high";if(Q>=X.medium)return"medium";return"low"}shouldTriggerAlert(Q){if(this.highScoreTriggeredLevels.has(Q))return!1;let X=["low","medium","high","critical"],Y=this.config.minAlertLevel,Z=X.indexOf(Q),$=X.indexOf(Y);return Z>=$}async executeAction(Q){let X=this.config.action;switch(this.log(`Executing action '${X}' for score ${Q.score}`),X){case"challenge":if(this.challengeManagerPromise)await this.challengeManagerPromise;if(this.challengeManager)this.challengeManager.blockFormsUntilSolved(Q.level);break;case"block":if(!this.formBlocked)this.blockForms();break;case"none":default:break}}blockForms(){if(this.formBlocked)return;this.formBlocked=!0,document.querySelectorAll("form").forEach((Q)=>{Q.addEventListener("submit",this.blockFormSubmit,!0)}),this.formObserver=new MutationObserver((Q)=>{Q.forEach((X)=>{X.addedNodes.forEach((Y)=>{if(Y instanceof HTMLFormElement)Y.addEventListener("submit",this.blockFormSubmit,!0);if(Y instanceof HTMLElement)Y.querySelectorAll("form").forEach((Z)=>{Z.addEventListener("submit",this.blockFormSubmit,!0)})})})}),this.formObserver.observe(document.body,{childList:!0,subtree:!0}),this.log("Forms blocked due to high bot score")}blockFormSubmit=(Q)=>{Q.preventDefault(),Q.stopPropagation(),this.log("Form submission blocked due to high bot score");return};isFormsBlocked(){return this.formBlocked}unblockForms(){if(!this.formBlocked)return;if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;document.querySelectorAll("form").forEach((Q)=>{Q.removeEventListener("submit",this.blockFormSubmit,!0)}),this.formBlocked=!1,this.log("Forms unblocked")}getHashModule(){return this.hashModule}createSignature(Q){let X=this.config.hashVerification.secret;if(!X)return this.log("Cannot create signature: no secret configured"),null;return createSignature(Q,X)}verifySignature(Q,X){let Y=this.config.hashVerification.secret;if(!Y)return this.log("Cannot verify signature: no secret configured"),!1;return verifySignature(Q,X,Y)}isChallengeSolving(){return this.challengeManager?.isSolving()??!1}isChallengeSolved(){return this.challengeManager?.isSolved()??!1}getPerformanceSummary(){return K.getSummary()}logPerformance(){K.logSummary()}getPerformanceReport(){return K.getReport()}async waitUntilReady(){if(this.lastScore)return{score:this.lastScore.bot_score,timedOut:!1};if(this.formProtectionManager)return this.formProtectionManager.waitUntilReady();return new Promise((Q)=>{let X=performance.now(),Y=5000,Z=()=>{if(this.lastScore){Q({score:this.lastScore.bot_score,timedOut:!1});return}if(performance.now()-X>=5000){Q({score:null,timedOut:!0});return}setTimeout(Z,50)};Z()})}withProtection(Q,X={}){let Y=X.blockThreshold??this.config.actionThreshold;return async(...Z)=>{let{score:$,timedOut:J}=await this.waitUntilReady();if(K.markFirstSubmitAttempt($!==null),$!==null&&$>=Y)throw this.log(`Blocking submission: score ${$} >= threshold ${Y}`),Error(`Submission blocked: bot score ${$} exceeds threshold`);if(J)this.log("Warning: submitting without detection score (timed out)");return Q(...Z)}}protectedFetch(Q={}){return this.withProtection(async(X,Y)=>{return fetch(X,Y)},Q)}canSubmit(){if(!this.lastScore)return{allowed:!1,reason:"waiting_for_score",score:null};if(this.lastScore.bot_score>=this.config.actionThreshold)return{allowed:!1,reason:"high_bot_score",score:this.lastScore.bot_score};return{allowed:!0,score:this.lastScore.bot_score}}async triggerChallenge(Q="high"){if(this.challengeManagerPromise)await this.challengeManagerPromise;if(!this.challengeManager){this.log("Challenge not enabled");return}this.challengeManager.blockFormsUntilSolved(Q)}async disconnect(){if(this.socket)await this.socket.leaveChannel(),this.socket.disconnect(),this.socket=null}startSendInterval(){this.stopSendInterval(),this.sendTimer=setInterval(()=>{this.sendSignal()},this.config.sendInterval)}stopSendInterval(){if(this.sendTimer)clearInterval(this.sendTimer),this.sendTimer=null}registerBeforeUnload(){this.boundBeforeUnload=()=>{this.handleBeforeUnload()},this.boundVisibilityChange=()=>{if(document.visibilityState==="hidden")this.handleBeforeUnload()},window.addEventListener("beforeunload",this.boundBeforeUnload),document.addEventListener("visibilitychange",this.boundVisibilityChange)}unregisterBeforeUnload(){if(this.boundBeforeUnload)window.removeEventListener("beforeunload",this.boundBeforeUnload),this.boundBeforeUnload=null;if(this.boundVisibilityChange)document.removeEventListener("visibilitychange",this.boundVisibilityChange),this.boundVisibilityChange=null}handleBeforeUnload(){if(!this.isRunning||!this.socket)return;try{let Q=this.buildPayload();if(this.socket.isReady())this.socket.sendSignal(Q).catch(()=>{})}catch{}}handleFormSubmit(){if(!this.isRunning)return;if(K.markFirstSubmitAttempt(this.lastScore!==null),this.log("Form submitted, flushing signals via beacon"),this.log("Had score before submit:",this.lastScore!==null),this.updateFormStatus("completed"),!this.sessionId){this.log("No session ID yet, cannot send beacon");return}let Q=this.buildPayload();if(!this.sendViaBeacon(Q))this.sendSignal().catch((Y)=>{this.log("Failed to flush signals on form submit",Y)});else this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush()}sendViaBeacon(Q){if(!navigator.sendBeacon)return this.log("sendBeacon not available"),!1;try{let X=new URL(this.config.endpoint),Y=`${X.protocol==="wss:"?"https:":"http:"}//${X.host}/api/signal`,Z=JSON.stringify({session_id:this.sessionId,api_key:this.config.apiKey,payload:Q,form_status:this.formSubmissionStatus}),$=new Blob([Z],{type:"application/json"}),J=navigator.sendBeacon(Y,$);return this.log("Beacon sent:",J),J}catch(X){return this.log("Beacon send failed:",X),!1}}buildPayload(){this.sequenceNumber++;let Q={session_id:this.sessionId,seq:this.sequenceNumber,mouse:this.mouseCollector.getSignal(),scroll:this.scrollCollector.getSignal(),form:this.formCollector.getSignal(),timestamp:Date.now()};if(!this.hasSentInitial)Q.session=this.getSessionData(),Q.fingerprint=this.fingerprint,Q.browser=this.browserSignal;return Q}getSessionData(){let Q=new URL(window.location.href),X={};Q.searchParams.forEach((Z,$)=>{X[$]=Z});let Y=null;if(document.referrer)try{Y=new URL(document.referrer).hostname}catch{}return{url_path:Q.pathname,url_params:X,referrer_url:document.referrer||null,referrer_domain:Y,user_agent:navigator.userAgent}}generateSessionId(){if(crypto.randomUUID)return crypto.randomUUID();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(Q)=>{let X=Math.random()*16|0;return(Q==="x"?X:X&3|8).toString(16)})}updateFormStatus(Q){if(this.formSubmissionStatus==="challenged"||this.formSubmissionStatus==="flagged"||this.formSubmissionStatus==="blocked"||this.formSubmissionStatus==="completed"){this.log(`Form status already terminal (${this.formSubmissionStatus}), ignoring ${Q}`);return}if(this.formSubmissionStatus=Q,this.log(`Form status updated to: ${Q}`),this.socket?.isReady())this.socket.sendFormStatus(Q).catch((X)=>{this.log("Failed to send form status:",X)})}log(...Q){if(this.config.debug);}}var xQ=V.init.bind(V),CQ=V.getInstance.bind(V),LQ=V.destroy.bind(V),AQ=V;export{f as logPerformanceSummary,kQ as loadHashModule,T as isUsageLimitError,xQ as init,l as getWsProtocol,g as getPerformanceSummary,P as getPerformanceMetrics,CQ as getInstance,LQ as destroy,AQ as default,q as DEFAULT_CONFIG,V as BotSigged};
40
+ `,document.body.appendChild(this.loadingOverlay)}hideLoading(){if(this.loadingOverlay)this.loadingOverlay.remove(),this.loadingOverlay=null}notifyReady(Q){this.isReady=!0,this.hasScore=!0,this.currentScore=Q,[...this.pendingSubmissions].forEach((Z)=>{this.releaseSubmission(Z,!1)}),[...this.pendingRequests].forEach((Z)=>{this.releaseRequest(Z)}),this.hideLoading()}blockAllPending(Q){[...this.pendingSubmissions].forEach((Y)=>{this.config.onBlock?.(Y.form,Q),this.releaseSubmission(Y,!0)})}getStatus(){return{mode:this.config.mode,isReady:this.isReady,hasScore:this.hasScore,pendingCount:this.pendingSubmissions.length,protectedFormCount:this.protectedForms.size}}waitUntilReady(){if(this.hasScore)return Promise.resolve({score:this.currentScore,timedOut:!1});return new Promise((Q)=>{let X=performance.now(),Y=()=>{if(this.hasScore){Q({score:this.currentScore,timedOut:!1});return}if(performance.now()-X>=this.config.maxHoldTime){Q({score:null,timedOut:!0});return}setTimeout(Y,50)};Y()})}withProtection(Q){return async(...X)=>{let Y=performance.now()-this.startTime;if(P().markFirstSubmitAttempt(this.hasScore),this.config.mode==="blockInstant"&&Y<this.config.minTimeBeforeSubmit)throw this.config.onBlock?.(document.createElement("form"),"instant_submission"),Error("Submission blocked: too fast");if(this.config.mode==="holdUntilReady"&&!this.hasScore){if(this.config.showLoadingUI)this.showLoading(document.createElement("form"));let{timedOut:Z}=await this.waitUntilReady();if(this.config.showLoadingUI)this.hideLoading()}return Q(...X)}}protectedFetch(){return this.withProtection(async(Q,X)=>{return fetch(Q,X)})}setMode(Q){if(this.config.mode=Q,Q==="none")[...this.pendingSubmissions].forEach((Y)=>this.releaseSubmission(Y,!1))}setMaxHoldTime(Q){this.config.maxHoldTime=Q}canSubmit(){let Q=performance.now()-this.startTime;if(this.config.mode==="blockInstant"&&Q<this.config.minTimeBeforeSubmit)return{allowed:!1,reason:"too_fast",score:this.currentScore};if(this.config.mode==="holdUntilReady"&&!this.hasScore)return{allowed:!1,reason:"waiting_for_score",score:null};return{allowed:!0,score:this.currentScore}}destroy(){if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;if(this.originalFetch)window.fetch=this.originalFetch,this.originalFetch=null;if(this.originalXHROpen)XMLHttpRequest.prototype.open=this.originalXHROpen,this.originalXHROpen=null;if(this.originalXHRSend)XMLHttpRequest.prototype.send=this.originalXHRSend,this.originalXHRSend=null;this.hideLoading(),this.pendingSubmissions=[],this.pendingRequests=[],this.protectedForms.clear()}}var v={suspicious:40,bot:70},w={name:"_bsid",riskName:"_bsrisk",path:"/",sameSite:"Strict"};function u(Q){if(!Q)return null;if(Q===!0)return{...w};return{...w,...Q}}function a(Q){if(Q>=v.bot)return"bot";if(Q>=v.suspicious)return"suspicious";return"human"}class M{config;sessionIdGetter;sessionCookieSet=!1;currentRiskTier=null;constructor(Q,X){this.config={...w,...Q},this.sessionIdGetter=X}buildCookieString(Q,X){let Y=this.config.path||w.path,Z=this.config.sameSite||w.sameSite,$=this.config.secure??location.protocol==="https:",J=[`${encodeURIComponent(Q)}=${encodeURIComponent(X)}`,`Path=${Y}`,`SameSite=${Z}`];if($||Z==="None")J.push("Secure");return J.join("; ")}deleteCookie(Q){let X=this.config.path||w.path;document.cookie=`${encodeURIComponent(Q)}=; Path=${X}; Max-Age=0`}setSessionCookie(){if(this.sessionCookieSet)return;let Q=this.sessionIdGetter();if(!Q)return;let X=this.config.name||w.name;document.cookie=this.buildCookieString(X,Q),this.sessionCookieSet=!0}updateRiskTier(Q){let X=a(Q);if(X===this.currentRiskTier)return!1;let Y=this.config.riskName||w.riskName;document.cookie=this.buildCookieString(Y,X);let Z=this.currentRiskTier;return this.currentRiskTier=X,!0}removeCookies(){let Q=this.config.name||w.name,X=this.config.riskName||w.riskName;if(this.sessionCookieSet)this.deleteCookie(Q),this.sessionCookieSet=!1;if(this.currentRiskTier!==null)this.deleteCookie(X),this.currentRiskTier=null}setCookie(){this.setSessionCookie()}removeCookie(){this.removeCookies()}isSessionCookieSet(){return this.sessionCookieSet}getCurrentRiskTier(){return this.currentRiskTier}getSessionCookieName(){return this.config.name||w.name}getRiskCookieName(){return this.config.riskName||w.riskName}}var G={name:"X-BotSigged-ID"};function m(Q){if(!Q)return null;if(Q===!0)return{...G};return{...G,...Q}}class E{config;sessionIdGetter;started=!1;originalFetch=null;originalXHROpen=null;originalXHRSend=null;originalXHRSetRequestHeader=null;xhrInjectionMap=new WeakMap;constructor(Q,X){this.config={...G,...Q},this.sessionIdGetter=X}start(){if(this.started)return;this.started=!0,this.patchFetch(),this.patchXHR()}stop(){if(!this.started)return;if(this.originalFetch)window.fetch=this.originalFetch,this.originalFetch=null;if(this.originalXHROpen)XMLHttpRequest.prototype.open=this.originalXHROpen,this.originalXHROpen=null;if(this.originalXHRSend)XMLHttpRequest.prototype.send=this.originalXHRSend,this.originalXHRSend=null;if(this.originalXHRSetRequestHeader)XMLHttpRequest.prototype.setRequestHeader=this.originalXHRSetRequestHeader,this.originalXHRSetRequestHeader=null;this.started=!1}isSameOrigin(Q){try{let X;if(Q instanceof Request)X=new URL(Q.url,window.location.origin);else if(Q instanceof URL)X=Q;else X=new URL(Q,window.location.origin);return X.origin===window.location.origin}catch{return!0}}patchFetch(){this.originalFetch=window.fetch.bind(window);let Q=this,X=this.config.name||G.name;window.fetch=function(Y,Z){if(!Q.isSameOrigin(Y))return Q.originalFetch(Y,Z);let $=Q.sessionIdGetter();if(!$)return Q.originalFetch(Y,Z);let J=new Headers(Z?.headers);if(!J.has(X))J.set(X,$);return Q.originalFetch(Y,{...Z,headers:J})}}patchXHR(){this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send,this.originalXHRSetRequestHeader=XMLHttpRequest.prototype.setRequestHeader;let Q=this,X=this.config.name||G.name;XMLHttpRequest.prototype.open=function(Y,Z,$=!0,J,z){let W=Q.isSameOrigin(Z);return Q.xhrInjectionMap.set(this,W),Q.originalXHROpen.call(this,Y,Z,$,J,z)},XMLHttpRequest.prototype.send=function(Y){if(Q.xhrInjectionMap.get(this)){let Z=Q.sessionIdGetter();if(Z)try{Q.originalXHRSetRequestHeader.call(this,X,Z)}catch{}}return Q.originalXHRSend.call(this,Y)}}getHeaderName(){return this.config.name||G.name}isStarted(){return this.started}}var R={selector:"form",inputName:"_bsid"};function d(Q){if(!Q)return null;if(Q===!0)return{...R};return{...R,...Q}}class I{config;sessionIdGetter;observer=null;started=!1;constructor(Q,X){this.config={...R,...Q},this.sessionIdGetter=X}start(){if(this.started)return;this.started=!0;let Q=()=>{this.setupExistingForms(),this.setupObserver()};if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",Q,{once:!0});else Q()}stop(){if(!this.started)return;if(this.observer)this.observer.disconnect(),this.observer=null;let Q=this.config.selector||R.selector,X=this.config.inputName||R.inputName;document.querySelectorAll(`${Q}[data-bs-inject-setup]`).forEach((Y)=>{if(Y instanceof HTMLFormElement)Y.removeEventListener("submit",this.handleSubmit,{capture:!0});Y.removeAttribute("data-bs-inject-setup");let Z=Y.querySelector(`input[name="${X}"][data-bs-injected]`);if(Z)Z.remove()}),this.started=!1}setupExistingForms(){let Q=this.config.selector||R.selector;document.querySelectorAll(Q).forEach((X)=>{if(X instanceof HTMLFormElement)this.setupForm(X)})}setupObserver(){if(!document.body)return;let Q=this.config.selector||R.selector;this.observer=new MutationObserver((X)=>{X.forEach((Y)=>{Y.addedNodes.forEach((Z)=>{if(Z instanceof HTMLFormElement&&Z.matches(Q))this.setupForm(Z);if(Z instanceof HTMLElement)Z.querySelectorAll(Q).forEach(($)=>{if($ instanceof HTMLFormElement)this.setupForm($)})})})}),this.observer.observe(document.body,{childList:!0,subtree:!0})}setupForm(Q){if(Q.hasAttribute("data-bs-inject-setup"))return;Q.setAttribute("data-bs-inject-setup","true"),Q.addEventListener("submit",this.handleSubmit,{capture:!0})}handleSubmit=(Q)=>{let X=Q.currentTarget;this.injectInput(X)};injectInput(Q){let X=this.config.inputName||R.inputName,Y=Q.querySelector(`input[name="${X}"]`);if(Y){if(Y.hasAttribute("data-bs-injected"))Y.value=this.sessionIdGetter();return}let Z=document.createElement("input");Z.type="hidden",Z.name=X,Z.value=this.sessionIdGetter(),Z.setAttribute("data-bs-injected","true"),Q.appendChild(Z)}getConfig(){return{...this.config}}isStarted(){return this.started}}async function kQ(){return await import("./hash-q46pgar4.js")}class V{static instance=null;static init(Q){if(V.instance)return V.instance;return V.instance=new V(Q),V.instance}static getInstance(){return V.instance}static async destroy(){if(V.instance)await V.instance.stop(),V.instance=null}config;mouseCollector;scrollCollector;formCollector;browserCollector;fingerprintGenerator;socket=null;sessionId;sequenceNumber=0;isRunning=!1;sendTimer=null;fingerprint=null;browserSignal=null;lastScore=null;hasSentInitial=!1;boundBeforeUnload=null;boundVisibilityChange=null;hashModule=null;formBlocked=!1;formObserver=null;highScoreTriggeredLevels=new Set;challengeManager=null;challengeManagerPromise=null;formProtectionManager=null;formSubmissionStatus="no_submission";cookieManager=null;headerInjector=null;formInjector=null;serverConfig=null;connectionState="disconnected";reconnectTimer=null;readyPromise;readyResolver=null;constructor(Q){if(K.markConstructorStart(),!Q.apiKey)throw Error("BotSigged: apiKey is required");if(this.config=h(Q),this.sessionId=this.generateSessionId(),this.readyPromise=new Promise(($)=>{this.readyResolver=$}),this.mouseCollector=new k({sampleRate:this.config.mouseSampleRate,maxBufferSize:this.config.maxBufferSize}),this.scrollCollector=new x({maxBufferSize:Math.floor(this.config.maxBufferSize/3)}),this.formCollector=new C({maxKeyEvents:this.config.maxBufferSize,onSubmit:()=>this.handleFormSubmit()}),this.browserCollector=new L,this.fingerprintGenerator=new D,this.config.hashVerification.enabled)this.initializeHashModule();if(this.config.action==="challenge"||this.config.challenge.enabled)this.challengeManagerPromise=this.initializeChallengeManager();if(this.config.formProtection.mode!=="none")this.formProtectionManager=new b({mode:this.config.formProtection.mode,minTimeBeforeSubmit:this.config.formProtection.minTimeBeforeSubmit,maxHoldTime:this.config.formProtection.maxHoldTime,showLoadingUI:this.config.formProtection.showLoadingUI,loadingMessage:this.config.formProtection.loadingMessage,onHold:($)=>{this.updateFormStatus("challenged"),this.config.formProtection.onHold?.($)},onRelease:($,J)=>{if(!J)this.updateFormStatus("completed");this.config.formProtection.onRelease?.($,J)},onBlock:($,J)=>{this.updateFormStatus("blocked"),this.config.formProtection.onBlock?.($,J)},flushAndWaitForScore:()=>this.sendSignalAndGetScore()}),this.log("Form protection enabled:",this.config.formProtection.mode);else this.log("Form protection disabled (mode='none')");let X=u(this.config.cookie);if(X)this.cookieManager=new M(X,()=>this.sessionId),this.log("Cookie manager enabled:",X.name);let Y=m(this.config.headers);if(Y)this.headerInjector=new E(Y,()=>this.sessionId),this.headerInjector.start(),this.log("Header injector enabled:",Y.name);let Z=d(this.config.formInject);if(Z)this.formInjector=new I(Z,()=>this.sessionId),this.formInjector.start(),this.log("Form injector enabled:",Z.inputName);if(this.config.autoStart)if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",()=>this.start());else this.start();K.markConstructorEnd(),this.log("Constructor completed in",(K.getTimings().constructorEnd??0)-(K.getTimings().constructorStart??0),"ms")}async initializeHashModule(){try{let{initHashModule:Q}=await import("./hash-q46pgar4.js");this.hashModule=await Q({preferWasm:this.config.hashVerification.preferWasm,onWasmLoaded:()=>{this.log("WASM hash module loaded"),this.config.hashVerification.onWasmLoaded?.()},onFallback:(X)=>{this.log("Using JS hash fallback:",X),this.config.hashVerification.onWasmFallback?.(X)}})}catch(Q){this.log("Failed to initialize hash module",Q)}}async initializeChallengeManager(){try{let{ChallengeManager:Q}=await import("./challenge-de2gm02a.js");this.challengeManager=new Q(this.config.challenge,this.config.debug),this.log("Challenge manager loaded")}catch(Q){this.log("Failed to initialize challenge manager",Q)}}async start(){if(this.isRunning){this.log("Already running");return}K.markStartCalled(),this.log("Starting BotSigged SDK"),this.isRunning=!0,this.connectionState="connecting";try{this.browserSignal=this.browserCollector.collect(),K.markFormCollectorStart(),this.mouseCollector.start(),this.scrollCollector.start(),this.formCollector.start(),K.markFormCollectorReady(),this.log("Collectors started in",(K.getTimings().formCollectorReady??0)-(K.getTimings().formCollectorStart??0),"ms"),K.markFingerprintStart(),K.markWsConnectStart();let[Q]=await Promise.all([this.fingerprintGenerator.generate(),this.connectWithRetry()]);this.fingerprint=Q,K.markFingerprintEnd(),this.log("Fingerprint generated in",(K.getTimings().fingerprintEnd??0)-(K.getTimings().fingerprintStart??0),"ms"),await this.joinChannel(),this.connectionState="connected",this.readyResolver?.(),K.markSdkReady(),this.startSendInterval(),this.registerBeforeUnload();let X=K.getSummary();if(this.log("SDK started successfully"),this.log("Total startup time:",X.totalStartupMs,"ms"),this.log("Time to first score:",X.timeToFirstScoreMs,"ms"),this.log("Vulnerability window:",X.vulnerabilityWindowMs,"ms"),this.config.debug)K.logSummary()}catch(Q){let X=Q instanceof Error?Q:Error(String(Q));this.log("Failed to start",X),this.handleConnectionFailure(X)}}async stop(){if(!this.isRunning)return;if(this.log("Stopping BotSigged SDK"),this.formProtectionManager)this.formProtectionManager.destroy(),this.formProtectionManager=null;if(this.cookieManager)this.cookieManager.removeCookies(),this.cookieManager=null;if(this.headerInjector)this.headerInjector.stop(),this.headerInjector=null;if(this.formInjector)this.formInjector.stop(),this.formInjector=null;if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;this.unregisterBeforeUnload(),this.mouseCollector.stop(),this.scrollCollector.stop(),this.formCollector.stop(),this.stopSendInterval(),await this.sendSignal(),await this.disconnect(),this.isRunning=!1,this.log("SDK stopped")}async sendSignal(){if(!this.socket?.isReady()){this.log("Cannot send signal: not connected");return}let Q=this.buildPayload(),X=Q.seq;this.log("Sending signal seq:",X),K.markSignalSent(X);try{let Y=await this.socket.sendSignal(Q);K.markSignalResponseReceived(X);let Z=K.getTimings().signalRoundtrips||[],$=Z[Z.length-1];if($)this.log("Signal roundtrip:",$.roundtripMs,"ms");if(Y.bot_score!==void 0){let J={bot_score:Y.bot_score,classification:Y.classification||"unknown",triggered_rules:Y.triggered_rules||[]};this.lastScore=J,this.config.onScoreUpdate?.(J),this.handleScoreUpdate(J)}this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush(),this.hasSentInitial=!0}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));this.log("Failed to send signal",Z),this.config.onError?.(Z)}}async sendSignalAndGetScore(){if(!this.socket?.isReady())return this.log("Cannot send signal: not connected"),null;let Q=this.buildPayload(),X=Q.seq;this.log("Sending signal for form scoring, seq:",X);try{let Y=await this.socket.sendSignal(Q);if(Y.bot_score!==void 0){let Z={bot_score:Y.bot_score,classification:Y.classification||"unknown",triggered_rules:Y.triggered_rules||[]};return this.lastScore=Z,this.config.onScoreUpdate?.(Z),this.handleScoreUpdate(Z),this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush(),this.hasSentInitial=!0,Z.bot_score}return this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush(),this.hasSentInitial=!0,null}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));return this.log("Failed to send signal for form scoring",Z),this.config.onError?.(Z),null}}getSessionId(){return this.sessionId}getFingerprint(){return this.fingerprint}getFormSubmissionStatus(){return this.formSubmissionStatus}getLastScore(){return this.lastScore}isConnected(){return this.socket?.isReady()??!1}whenReady(){if(this.connectionState==="connected")return Promise.resolve();return this.readyPromise}getConnectionState(){return this.connectionState}getServerConfig(){return this.serverConfig}async identify(Q){let{accountId:X}=Q;if(!X||typeof X!=="string")throw Error("BotSigged: accountId is required and must be a string");if(X.length>255)throw Error("BotSigged: accountId must be 255 characters or less");this.log("Identifying account:",X),await this.whenReady();try{let Y=await this.socket.sendEvent("identify",{account_id:X,timestamp:Date.now()});if(Y.identified)this.log("Account identified successfully");else throw Error(Y.reason?.toString()||"Failed to identify account")}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));throw this.log("Failed to identify account:",Z),this.config.onError?.(Z),Z}}isDegraded(){return this.connectionState==="degraded"||this.connectionState==="failed"}getCurrentSignals(){return{mouse:this.mouseCollector.getSignal(),scroll:this.scrollCollector.getSignal(),form:this.formCollector.getSignal(),browser:this.browserSignal}}getBufferSizes(){return{mouse:this.mouseCollector.getBufferSize(),scroll:this.scrollCollector.getBufferSize(),form:this.formCollector.getBufferSize()}}resetSignals(){this.mouseCollector.reset(),this.scrollCollector.reset(),this.formCollector.reset(),this.browserCollector.reset(),this.sequenceNumber=0,this.hasSentInitial=!1}async connectSocket(){this.socket=new A({endpoint:this.config.endpoint,apiKey:this.config.apiKey,debug:this.config.debug,onConnectionChange:(Q)=>{this.config.onConnectionChange?.(Q==="connected")},onError:(Q)=>{this.config.onError?.(Q)}}),await this.socket.connect(),K.markWsConnectEnd(),this.log("WebSocket connected in",(K.getTimings().wsConnectEnd??0)-(K.getTimings().wsConnectStart??0),"ms")}async connectWithRetry(){let X=[1000,2000,4000];for(let Y=0;Y<3;Y++)try{await this.connectSocket();return}catch(Z){if(this.log(`Connection attempt ${Y+1} failed:`,Z),Y<2)await this.sleep(X[Y]);else throw Z}}sleep(Q){return new Promise((X)=>setTimeout(X,Q))}handleConnectionFailure(Q){this.connectionState="failed";let X=this.config.fallbackMode||"degraded";switch(this.log("Connection failed, applying fallback mode:",X),X){case"open":if(this.connectionState="degraded",this.formProtectionManager)this.formProtectionManager.setMode("none"),this.formProtectionManager.notifyReady(0);break;case"closed":this.blockFormsUntilConnected(),this.scheduleReconnect();break;case"cached":let Y=this.loadCachedConfig();if(Y)this.applyServerConfig(Y),this.connectionState="degraded";else this.applyFallbackConfig();this.scheduleReconnect();break;case"degraded":default:this.applyFallbackConfig(),this.connectionState="degraded",this.scheduleReconnect();break}this.config.onError?.(Q),this.config.onConnectionChange?.(!1)}applyFallbackConfig(){if(this.log("Applying fallback config"),this.serverConfig=F,this.formProtectionManager&&this.serverConfig.form_protection_mode)this.formProtectionManager.setMode(this.serverConfig.form_protection_mode);this.config.onServerConfig?.(this.serverConfig,"fallback")}blockFormsUntilConnected(){if(this.formProtectionManager)this.formProtectionManager.setMode("holdUntilReady"),this.formProtectionManager.setMaxHoldTime(30000)}scheduleReconnect(){if(this.reconnectTimer)clearTimeout(this.reconnectTimer);this.reconnectTimer=setTimeout(()=>{this.attemptReconnect()},5000)}async attemptReconnect(){this.log("Attempting reconnection..."),this.connectionState="connecting";try{if(await this.connectWithRetry(),!this.fingerprint)this.fingerprint=await this.fingerprintGenerator.generate();if(await this.joinChannel(),this.connectionState="connected",this.readyResolver?.(),this.log("Reconnection successful"),!this.sendTimer)this.startSendInterval()}catch(Q){this.log("Reconnection failed:",Q),this.connectionState="failed"}}cacheServerConfig(Q){try{localStorage.setItem(`botsigged_config_${this.config.apiKey}`,JSON.stringify({config:Q,timestamp:Date.now()}))}catch{}}loadCachedConfig(){try{let Q=localStorage.getItem(`botsigged_config_${this.config.apiKey}`);if(!Q)return null;let{config:X,timestamp:Y}=JSON.parse(Q);if(Date.now()-Y>86400000)return localStorage.removeItem(`botsigged_config_${this.config.apiKey}`),null;return X}catch{return null}}applyServerConfig(Q){if(this.log("Applying server config:",Q),this.serverConfig=Q,this.formProtectionManager&&Q.form_protection_mode)this.formProtectionManager.setMode(Q.form_protection_mode);if(Q.action&&Q.action!=="none")this.applyServerAction(Q.action,Q.challenge);this.cacheServerConfig(Q),this.config.onServerConfig?.(Q,"server")}async applyServerAction(Q,X){switch(this.log("Applying server action:",Q),Q){case"block":if(this.updateFormStatus("blocked"),!this.formBlocked)this.blockForms();break;case"challenge":if(this.updateFormStatus("challenged"),!this.challengeManager&&!this.challengeManagerPromise)this.log("Lazily loading challenge manager for server-requested challenge"),this.challengeManagerPromise=this.initializeChallengeManager();if(this.challengeManagerPromise)await this.challengeManagerPromise;if(this.challengeManager){let Y=X?.difficulty?.bot??16,Z=Y>=18?"critical":Y>=16?"high":"medium";this.challengeManager.blockFormsUntilSolved(Z)}else this.log("Challenge requested but challenge manager failed to load");break;case"flag":this.updateFormStatus("flagged"),this.log("Session flagged by server");break;case"none":default:break}}handleServerAction(Q){this.log("Received server action:",Q),this.config.onServerAction?.(Q);let X=Q.challenge?{difficulty:{suspicious:Q.challenge.difficulty,bot:Q.challenge.difficulty},timeout_ms:Q.challenge.timeout_ms}:void 0;this.applyServerAction(Q.type,X)}async joinChannel(){if(!this.socket)throw Error("WebSocket not initialized");K.markChannelJoinStart();let Q;try{Q=await this.socket.joinChannel(this.sessionId,this.fingerprint,this.getSessionData(),this.browserSignal,{onScoreUpdate:(X)=>{this.lastScore=X,this.config.onScoreUpdate?.(X),this.handleScoreUpdate(X)},onError:(X)=>{this.config.onError?.(X)},onAction:(X)=>{this.handleServerAction(X)}},this.config.accountId)}catch(X){if(T(X)){if(this.log("Usage limit exceeded:",X),this.config.onUsageLimitExceeded)this.config.onUsageLimitExceeded(X);else this.config.onError?.(Error(`Usage limit exceeded: ${X.current_usage}/${X.limit} verifications (${X.plan_name} plan). Please upgrade your plan.`));return}throw X}if(K.markChannelJoinEnd(),this.log("Channel joined in",(K.getTimings().channelJoinEnd??0)-(K.getTimings().channelJoinStart??0),"ms"),Q.config){let X=Q.config;this.applyServerConfig(X)}if(Q.initial_score!==void 0){K.markInitialScoreReceived();let X={bot_score:Q.initial_score,classification:Q.classification||"unknown",triggered_rules:Q.triggered_rules||[]};if(this.lastScore=X,this.config.onScoreUpdate?.(X),this.handleScoreUpdate(X),this.formProtectionManager)this.formProtectionManager.notifyReady(X.bot_score);if(this.cookieManager)this.cookieManager.setCookie();this.log("Initial score received:",X.bot_score,"in",(K.getTimings().initialScoreReceived??0)-(K.getTimings().startCalled??0),"ms from start")}}handleScoreUpdate(Q){if(this.cookieManager)this.cookieManager.updateRiskTier(Q.bot_score);let X=this.getBotScoreLevel(Q.bot_score),Y=Q.bot_score>=this.config.actionThreshold;if(this.shouldTriggerAlert(X)){let Z={score:Q.bot_score,level:X,scoreUpdate:Q,sessionId:this.sessionId,fingerprintHash:this.fingerprint?.hash};if(Y&&!this.highScoreTriggeredLevels.has(X))this.executeAction(Z);this.config.onHighBotScore?.(Z),this.highScoreTriggeredLevels.add(X)}}getBotScoreLevel(Q){let X=this.config.botScoreThresholds;if(Q>=X.critical)return"critical";if(Q>=X.high)return"high";if(Q>=X.medium)return"medium";return"low"}shouldTriggerAlert(Q){if(this.highScoreTriggeredLevels.has(Q))return!1;let X=["low","medium","high","critical"],Y=this.config.minAlertLevel,Z=X.indexOf(Q),$=X.indexOf(Y);return Z>=$}async executeAction(Q){let X=this.config.action;switch(this.log(`Executing action '${X}' for score ${Q.score}`),X){case"challenge":if(this.challengeManagerPromise)await this.challengeManagerPromise;if(this.challengeManager)this.challengeManager.blockFormsUntilSolved(Q.level);break;case"block":if(!this.formBlocked)this.blockForms();break;case"none":default:break}}blockForms(){if(this.formBlocked)return;this.formBlocked=!0,document.querySelectorAll("form").forEach((Q)=>{Q.addEventListener("submit",this.blockFormSubmit,!0)}),this.formObserver=new MutationObserver((Q)=>{Q.forEach((X)=>{X.addedNodes.forEach((Y)=>{if(Y instanceof HTMLFormElement)Y.addEventListener("submit",this.blockFormSubmit,!0);if(Y instanceof HTMLElement)Y.querySelectorAll("form").forEach((Z)=>{Z.addEventListener("submit",this.blockFormSubmit,!0)})})})}),this.formObserver.observe(document.body,{childList:!0,subtree:!0}),this.log("Forms blocked due to high bot score")}blockFormSubmit=(Q)=>{Q.preventDefault(),Q.stopPropagation(),this.log("Form submission blocked due to high bot score");return};isFormsBlocked(){return this.formBlocked}unblockForms(){if(!this.formBlocked)return;if(this.formObserver)this.formObserver.disconnect(),this.formObserver=null;document.querySelectorAll("form").forEach((Q)=>{Q.removeEventListener("submit",this.blockFormSubmit,!0)}),this.formBlocked=!1,this.log("Forms unblocked")}getHashModule(){return this.hashModule}createSignature(Q){let X=this.config.hashVerification.secret;if(!X)return this.log("Cannot create signature: no secret configured"),null;return createSignature(Q,X)}verifySignature(Q,X){let Y=this.config.hashVerification.secret;if(!Y)return this.log("Cannot verify signature: no secret configured"),!1;return verifySignature(Q,X,Y)}isChallengeSolving(){return this.challengeManager?.isSolving()??!1}isChallengeSolved(){return this.challengeManager?.isSolved()??!1}getPerformanceSummary(){return K.getSummary()}logPerformance(){K.logSummary()}getPerformanceReport(){return K.getReport()}async waitUntilReady(){if(this.lastScore)return{score:this.lastScore.bot_score,timedOut:!1};if(this.formProtectionManager)return this.formProtectionManager.waitUntilReady();return new Promise((Q)=>{let X=performance.now(),Y=5000,Z=()=>{if(this.lastScore){Q({score:this.lastScore.bot_score,timedOut:!1});return}if(performance.now()-X>=5000){Q({score:null,timedOut:!0});return}setTimeout(Z,50)};Z()})}withProtection(Q,X={}){let Y=X.blockThreshold??this.config.actionThreshold;return async(...Z)=>{let{score:$,timedOut:J}=await this.waitUntilReady();if(K.markFirstSubmitAttempt($!==null),$!==null&&$>=Y)throw this.log(`Blocking submission: score ${$} >= threshold ${Y}`),Error(`Submission blocked: bot score ${$} exceeds threshold`);if(J)this.log("Warning: submitting without detection score (timed out)");return Q(...Z)}}protectedFetch(Q={}){return this.withProtection(async(X,Y)=>{return fetch(X,Y)},Q)}canSubmit(){if(!this.lastScore)return{allowed:!1,reason:"waiting_for_score",score:null};if(this.lastScore.bot_score>=this.config.actionThreshold)return{allowed:!1,reason:"high_bot_score",score:this.lastScore.bot_score};return{allowed:!0,score:this.lastScore.bot_score}}async triggerChallenge(Q="high"){if(this.challengeManagerPromise)await this.challengeManagerPromise;if(!this.challengeManager){this.log("Challenge not enabled");return}this.challengeManager.blockFormsUntilSolved(Q)}async disconnect(){if(this.socket)await this.socket.leaveChannel(),this.socket.disconnect(),this.socket=null}startSendInterval(){this.stopSendInterval(),this.sendTimer=setInterval(()=>{this.sendSignal()},this.config.sendInterval)}stopSendInterval(){if(this.sendTimer)clearInterval(this.sendTimer),this.sendTimer=null}registerBeforeUnload(){this.boundBeforeUnload=()=>{this.handleBeforeUnload()},this.boundVisibilityChange=()=>{if(document.visibilityState==="hidden")this.handleBeforeUnload()},window.addEventListener("beforeunload",this.boundBeforeUnload),document.addEventListener("visibilitychange",this.boundVisibilityChange)}unregisterBeforeUnload(){if(this.boundBeforeUnload)window.removeEventListener("beforeunload",this.boundBeforeUnload),this.boundBeforeUnload=null;if(this.boundVisibilityChange)document.removeEventListener("visibilitychange",this.boundVisibilityChange),this.boundVisibilityChange=null}handleBeforeUnload(){if(!this.isRunning||!this.socket)return;try{let Q=this.buildPayload();if(this.socket.isReady())this.socket.sendSignal(Q).catch(()=>{})}catch{}}handleFormSubmit(){if(!this.isRunning)return;if(K.markFirstSubmitAttempt(this.lastScore!==null),this.log("Form submitted, flushing signals via beacon"),this.log("Had score before submit:",this.lastScore!==null),this.updateFormStatus("completed"),!this.sessionId){this.log("No session ID yet, cannot send beacon");return}let Q=this.buildPayload();if(!this.sendViaBeacon(Q))this.sendSignal().catch((Y)=>{this.log("Failed to flush signals on form submit",Y)});else this.mouseCollector.flush(),this.scrollCollector.flush(),this.formCollector.flush()}sendViaBeacon(Q){if(!navigator.sendBeacon)return this.log("sendBeacon not available"),!1;try{let X=new URL(this.config.endpoint),Y=`${X.protocol==="wss:"?"https:":"http:"}//${X.host}/api/signal`,Z=JSON.stringify({session_id:this.sessionId,api_key:this.config.apiKey,payload:Q,form_status:this.formSubmissionStatus}),$=new Blob([Z],{type:"application/json"}),J=navigator.sendBeacon(Y,$);return this.log("Beacon sent:",J),J}catch(X){return this.log("Beacon send failed:",X),!1}}buildPayload(){this.sequenceNumber++;let Q={session_id:this.sessionId,seq:this.sequenceNumber,mouse:this.mouseCollector.getSignal(),scroll:this.scrollCollector.getSignal(),form:this.formCollector.getSignal(),timestamp:Date.now()};if(!this.hasSentInitial)Q.session=this.getSessionData(),Q.fingerprint=this.fingerprint,Q.browser=this.browserSignal;return Q}getSessionData(){let Q=new URL(window.location.href),X={};Q.searchParams.forEach((Z,$)=>{X[$]=Z});let Y=null;if(document.referrer)try{Y=new URL(document.referrer).hostname}catch{}return{url_path:Q.pathname,url_params:X,referrer_url:document.referrer||null,referrer_domain:Y,user_agent:navigator.userAgent}}generateSessionId(){if(crypto.randomUUID)return crypto.randomUUID();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(Q)=>{let X=Math.random()*16|0;return(Q==="x"?X:X&3|8).toString(16)})}updateFormStatus(Q){if(this.formSubmissionStatus==="challenged"||this.formSubmissionStatus==="flagged"||this.formSubmissionStatus==="blocked"||this.formSubmissionStatus==="completed"){this.log(`Form status already terminal (${this.formSubmissionStatus}), ignoring ${Q}`);return}if(this.formSubmissionStatus=Q,this.log(`Form status updated to: ${Q}`),this.socket?.isReady())this.socket.sendFormStatus(Q).catch((X)=>{this.log("Failed to send form status:",X)})}log(...Q){if(this.config.debug);}}var xQ=V.init.bind(V),CQ=V.getInstance.bind(V),LQ=V.destroy.bind(V),AQ=V;export{f as logPerformanceSummary,kQ as loadHashModule,T as isUsageLimitError,xQ as init,l as getWsProtocol,g as getPerformanceSummary,P as getPerformanceMetrics,CQ as getInstance,LQ as destroy,AQ as default,q as DEFAULT_CONFIG,V as BotSigged};
41
41
 
42
42
  //# debugId=519093D43B349D7264756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botsigged/sdk",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "BotSigged SDK - Real-time bot detection via WebSocket",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -1,333 +0,0 @@
1
- import {
2
- getHash
3
- } from "./hash-gtpm69df.js";
4
-
5
- // src/challenge-ui.ts
6
- class ChallengeOverlay {
7
- overlay = null;
8
- messageEl = null;
9
- progressEl = null;
10
- config;
11
- constructor(config) {
12
- this.config = config;
13
- }
14
- show() {
15
- if (!this.config.enabled || this.overlay)
16
- return;
17
- this.overlay = document.createElement("div");
18
- this.overlay.id = "botsigged-challenge-overlay";
19
- this.overlay.style.cssText = `
20
- position: fixed;
21
- top: 0;
22
- left: 0;
23
- width: 100%;
24
- height: 100%;
25
- background: ${this.config.backgroundColor};
26
- display: flex;
27
- flex-direction: column;
28
- align-items: center;
29
- justify-content: center;
30
- z-index: ${this.config.zIndex};
31
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
32
- `;
33
- const spinner = document.createElement("div");
34
- spinner.style.cssText = `
35
- width: 48px;
36
- height: 48px;
37
- border: 4px solid ${this.config.textColor}33;
38
- border-top-color: ${this.config.spinnerColor};
39
- border-radius: 50%;
40
- animation: botsigged-spin 1s linear infinite;
41
- margin-bottom: 20px;
42
- `;
43
- this.messageEl = document.createElement("span");
44
- this.messageEl.textContent = this.config.message;
45
- this.messageEl.style.cssText = `
46
- color: ${this.config.textColor};
47
- font-size: 18px;
48
- font-weight: 500;
49
- margin-bottom: 12px;
50
- `;
51
- const progressContainer = document.createElement("div");
52
- progressContainer.style.cssText = `
53
- width: 200px;
54
- height: 4px;
55
- background: ${this.config.textColor}33;
56
- border-radius: 2px;
57
- overflow: hidden;
58
- `;
59
- this.progressEl = document.createElement("div");
60
- this.progressEl.style.cssText = `
61
- width: 0%;
62
- height: 100%;
63
- background: ${this.config.spinnerColor};
64
- border-radius: 2px;
65
- transition: width 0.1s ease-out;
66
- `;
67
- progressContainer.appendChild(this.progressEl);
68
- const style = document.createElement("style");
69
- style.textContent = `
70
- @keyframes botsigged-spin {
71
- to { transform: rotate(360deg); }
72
- }
73
- `;
74
- document.head.appendChild(style);
75
- this.overlay.appendChild(spinner);
76
- this.overlay.appendChild(this.messageEl);
77
- this.overlay.appendChild(progressContainer);
78
- document.body.appendChild(this.overlay);
79
- }
80
- setProgress(progress) {
81
- if (this.progressEl) {
82
- const percent = Math.min(100, Math.max(0, progress * 100));
83
- this.progressEl.style.width = `${percent}%`;
84
- }
85
- }
86
- showSuccess() {
87
- if (this.messageEl) {
88
- this.messageEl.textContent = this.config.successMessage;
89
- }
90
- if (this.progressEl) {
91
- this.progressEl.style.width = "100%";
92
- }
93
- }
94
- hide() {
95
- if (this.overlay) {
96
- this.overlay.remove();
97
- this.overlay = null;
98
- this.messageEl = null;
99
- this.progressEl = null;
100
- }
101
- }
102
- isVisible() {
103
- return this.overlay !== null;
104
- }
105
- }
106
-
107
- // src/challenge.ts
108
- function generateChallengePrefix() {
109
- const prefix = new Uint8Array(16);
110
- if (typeof crypto !== "undefined" && crypto.getRandomValues) {
111
- crypto.getRandomValues(prefix);
112
- } else {
113
- for (let i = 0;i < 16; i++) {
114
- prefix[i] = Math.floor(Math.random() * 256);
115
- }
116
- }
117
- return prefix;
118
- }
119
- function countLeadingZeroBits(value) {
120
- if (value === 0)
121
- return 32;
122
- let count = 0;
123
- if ((value & 4294901760) === 0) {
124
- count += 16;
125
- value <<= 16;
126
- }
127
- if ((value & 4278190080) === 0) {
128
- count += 8;
129
- value <<= 8;
130
- }
131
- if ((value & 4026531840) === 0) {
132
- count += 4;
133
- value <<= 4;
134
- }
135
- if ((value & 3221225472) === 0) {
136
- count += 2;
137
- value <<= 2;
138
- }
139
- if ((value & 2147483648) === 0) {
140
- count += 1;
141
- }
142
- return count;
143
- }
144
- function solvePoWChunkJS(prefix, difficulty, chunkSize, startNonce) {
145
- const hashModule = getHash();
146
- const buffer = new Uint8Array(prefix.length + 4);
147
- buffer.set(prefix);
148
- let nonce = startNonce;
149
- let iterations = 0;
150
- while (iterations < chunkSize) {
151
- buffer[prefix.length] = nonce & 255;
152
- buffer[prefix.length + 1] = nonce >>> 8 & 255;
153
- buffer[prefix.length + 2] = nonce >>> 16 & 255;
154
- buffer[prefix.length + 3] = nonce >>> 24 & 255;
155
- const hash = hashModule.xxHash32(buffer, 0);
156
- iterations++;
157
- if (countLeadingZeroBits(hash) >= difficulty) {
158
- return { nonce, found: true, iterations };
159
- }
160
- nonce = nonce + 1 >>> 0;
161
- }
162
- return { nonce, found: false, iterations };
163
- }
164
-
165
- class ChallengeManager {
166
- config;
167
- overlay;
168
- solving = false;
169
- solved = false;
170
- pendingForms = new Map;
171
- formHandler = null;
172
- formObserver = null;
173
- resubmitting = false;
174
- debug;
175
- constructor(config, debug = false) {
176
- this.config = config;
177
- this.debug = debug;
178
- this.overlay = new ChallengeOverlay(config.ui);
179
- }
180
- getDifficultyForLevel(level) {
181
- const difficulty = this.config.difficulty;
182
- switch (level) {
183
- case "critical":
184
- return difficulty.critical;
185
- case "high":
186
- return difficulty.high;
187
- case "medium":
188
- return difficulty.medium;
189
- default:
190
- return 0;
191
- }
192
- }
193
- shouldChallenge(level) {
194
- if (!this.config.enabled || this.solved)
195
- return false;
196
- const levelOrder = ["low", "medium", "high", "critical"];
197
- const levelIndex = levelOrder.indexOf(level);
198
- const minIndex = levelOrder.indexOf(this.config.minLevel);
199
- return levelIndex >= minIndex;
200
- }
201
- blockFormsUntilSolved(level) {
202
- if (this.formHandler)
203
- return;
204
- this.formHandler = (e) => {
205
- if (this.solved || this.resubmitting)
206
- return;
207
- e.preventDefault();
208
- e.stopPropagation();
209
- const form = e.target;
210
- if (!this.pendingForms.has(form)) {
211
- this.pendingForms.set(form, e);
212
- }
213
- if (!this.solving) {
214
- this.startChallenge(level);
215
- }
216
- };
217
- document.querySelectorAll("form").forEach((form) => {
218
- form.addEventListener("submit", this.formHandler, true);
219
- });
220
- this.formObserver = new MutationObserver((mutations) => {
221
- mutations.forEach((mutation) => {
222
- mutation.addedNodes.forEach((node) => {
223
- if (node instanceof HTMLFormElement && this.formHandler) {
224
- node.addEventListener("submit", this.formHandler, true);
225
- }
226
- if (node instanceof HTMLElement && this.formHandler) {
227
- node.querySelectorAll("form").forEach((form) => {
228
- form.addEventListener("submit", this.formHandler, true);
229
- });
230
- }
231
- });
232
- });
233
- });
234
- this.formObserver.observe(document.body, { childList: true, subtree: true });
235
- this.log("Forms blocked, challenge required");
236
- }
237
- async startChallenge(level) {
238
- if (this.solving || this.solved)
239
- return;
240
- this.solving = true;
241
- const difficulty = this.getDifficultyForLevel(level);
242
- const prefix = generateChallengePrefix();
243
- const startTime = performance.now();
244
- this.log(`Starting challenge: difficulty=${difficulty}, level=${level}`);
245
- this.config.onChallengeStart?.(level, difficulty);
246
- this.overlay.show();
247
- const estimatedIterations = 1 << difficulty;
248
- let nonce = 0;
249
- let totalIterations = 0;
250
- let result;
251
- do {
252
- await new Promise((resolve) => setTimeout(resolve, 0));
253
- result = solvePoWChunkJS(prefix, difficulty, this.config.chunkSize, nonce);
254
- totalIterations += result.iterations;
255
- nonce = result.nonce + 1;
256
- const progress = Math.min(1, totalIterations / estimatedIterations);
257
- this.overlay.setProgress(progress);
258
- this.config.onChallengeProgress?.(progress, totalIterations);
259
- } while (!result.found);
260
- const solveTime = performance.now() - startTime;
261
- this.log(`Challenge solved: nonce=${result.nonce}, iterations=${totalIterations}, time=${solveTime.toFixed(0)}ms`);
262
- this.overlay.showSuccess();
263
- await new Promise((resolve) => setTimeout(resolve, 500));
264
- this.overlay.hide();
265
- this.solved = true;
266
- this.solving = false;
267
- const event = {
268
- solveTimeMs: solveTime,
269
- iterations: totalIterations,
270
- difficulty,
271
- level,
272
- nonce: result.nonce
273
- };
274
- this.config.onChallengeComplete?.(event);
275
- this.unblockForms();
276
- }
277
- unblockForms() {
278
- if (this.formObserver) {
279
- this.formObserver.disconnect();
280
- this.formObserver = null;
281
- }
282
- if (this.formHandler) {
283
- document.querySelectorAll("form").forEach((form) => {
284
- form.removeEventListener("submit", this.formHandler, true);
285
- });
286
- this.formHandler = null;
287
- }
288
- this.log("Forms unblocked");
289
- this.resubmitting = true;
290
- this.pendingForms.forEach((_, form) => {
291
- this.log("Resubmitting pending form");
292
- if (form.requestSubmit) {
293
- form.requestSubmit();
294
- } else {
295
- form.submit();
296
- }
297
- });
298
- this.pendingForms.clear();
299
- this.resubmitting = false;
300
- }
301
- isSolving() {
302
- return this.solving;
303
- }
304
- isSolved() {
305
- return this.solved;
306
- }
307
- reset() {
308
- if (this.formObserver) {
309
- this.formObserver.disconnect();
310
- this.formObserver = null;
311
- }
312
- if (this.formHandler) {
313
- document.querySelectorAll("form").forEach((form) => {
314
- form.removeEventListener("submit", this.formHandler, true);
315
- });
316
- this.formHandler = null;
317
- }
318
- this.solved = false;
319
- this.solving = false;
320
- this.resubmitting = false;
321
- this.pendingForms.clear();
322
- }
323
- log(...args) {
324
- if (this.debug) {
325
- console.log("[BotSigged:Challenge]", ...args);
326
- }
327
- }
328
- }
329
- export {
330
- ChallengeManager
331
- };
332
-
333
- //# debugId=B0255CA1E0DDDD3364756E2164756E21
@@ -1,300 +0,0 @@
1
- var __create = Object.create;
2
- var __getProtoOf = Object.getPrototypeOf;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __toESM = (mod, isNodeMode, target) => {
7
- target = mod != null ? __create(__getProtoOf(mod)) : {};
8
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
- for (let key of __getOwnPropNames(mod))
10
- if (!__hasOwnProp.call(to, key))
11
- __defProp(to, key, {
12
- get: () => mod[key],
13
- enumerable: true
14
- });
15
- return to;
16
- };
17
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
18
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
19
- }) : x)(function(x) {
20
- if (typeof require !== "undefined")
21
- return require.apply(this, arguments);
22
- throw Error('Dynamic require of "' + x + '" is not supported');
23
- });
24
-
25
- // src/wasm/hash.wasm.base64.ts
26
- var wasmBinaryBase64 = "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";
27
- var hash_wasm_base64_default = wasmBinaryBase64;
28
-
29
- // src/wasm/hash-wasm.ts
30
- var wasmInstance = null;
31
- var loadPromise = null;
32
- function base64ToBytes(base64) {
33
- const binaryString = atob(base64);
34
- const bytes = new Uint8Array(binaryString.length);
35
- for (let i = 0;i < binaryString.length; i++) {
36
- bytes[i] = binaryString.charCodeAt(i);
37
- }
38
- return bytes;
39
- }
40
- async function loadHashModule() {
41
- if (loadPromise) {
42
- return loadPromise;
43
- }
44
- loadPromise = (async () => {
45
- try {
46
- const wasmBytes = base64ToBytes(hash_wasm_base64_default);
47
- const wasmModule = await WebAssembly.compile(wasmBytes);
48
- const instance = await WebAssembly.instantiate(wasmModule, {
49
- env: {
50
- abort: (_msg, _file, line, col) => {
51
- console.error(`WASM abort at ${line}:${col}`);
52
- }
53
- }
54
- });
55
- wasmInstance = instance.exports;
56
- return createHashModule(wasmInstance);
57
- } catch (error) {
58
- loadPromise = null;
59
- throw error;
60
- }
61
- })();
62
- return loadPromise;
63
- }
64
- function isHashModuleLoaded() {
65
- return wasmInstance !== null;
66
- }
67
- function createHashModule(wasm) {
68
- function writeBytes(data) {
69
- const ptr = wasm.__new(data.length, 1);
70
- const view = new Uint8Array(wasm.memory.buffer, ptr, data.length);
71
- view.set(data);
72
- return ptr;
73
- }
74
- function writeString(str) {
75
- const buf = new Uint16Array(str.length);
76
- for (let i = 0;i < str.length; i++) {
77
- buf[i] = str.charCodeAt(i);
78
- }
79
- const ptr = wasm.__new(buf.length * 2, 2);
80
- const mem = new Uint16Array(wasm.memory.buffer, ptr, buf.length);
81
- mem.set(buf);
82
- return ptr;
83
- }
84
- function readString(ptr, maxLength = 1024) {
85
- const memory = new Uint8Array(wasm.memory.buffer);
86
- const memoryLength = memory.length;
87
- if (ptr < 0 || ptr >= memoryLength) {
88
- return "";
89
- }
90
- let end = ptr;
91
- const limit = Math.min(ptr + maxLength, memoryLength);
92
- while (end < limit && memory[end] !== 0) {
93
- end++;
94
- }
95
- const bytes = memory.slice(ptr, end);
96
- return new TextDecoder().decode(bytes);
97
- }
98
- return {
99
- xxHash32(data, seed = 0) {
100
- const ptr = writeBytes(data);
101
- try {
102
- return wasm.xxHash32(ptr, seed);
103
- } finally {
104
- wasm.__unpin(ptr);
105
- }
106
- },
107
- hashString(str, seed = 0) {
108
- const ptr = writeString(str);
109
- try {
110
- return wasm.hashString(ptr, seed);
111
- } finally {
112
- wasm.__unpin(ptr);
113
- }
114
- },
115
- hashStringToHex(str, seed = 0) {
116
- const ptr = writeString(str);
117
- try {
118
- const resultPtr = wasm.hashStringToHex(ptr, seed);
119
- return readString(resultPtr);
120
- } finally {
121
- wasm.__unpin(ptr);
122
- }
123
- },
124
- verifyHash(data, expectedHash, seed = 0) {
125
- const ptr = writeBytes(data);
126
- try {
127
- return wasm.verifyHash(ptr, expectedHash, seed);
128
- } finally {
129
- wasm.__unpin(ptr);
130
- }
131
- },
132
- verifyStringHash(str, expectedHash, seed = 0) {
133
- const ptr = writeString(str);
134
- try {
135
- return wasm.verifyStringHash(ptr, expectedHash, seed);
136
- } finally {
137
- wasm.__unpin(ptr);
138
- }
139
- }
140
- };
141
- }
142
- function createFallbackHashModule() {
143
- const textEncoder = new TextEncoder;
144
- function xxHash32Impl(data, seed = 0) {
145
- const PRIME32_1 = 2654435761;
146
- const PRIME32_2 = 2246822519;
147
- const PRIME32_3 = 3266489917;
148
- const PRIME32_4 = 668265263;
149
- const PRIME32_5 = 374761393;
150
- const rotl32 = (x, r) => (x << r | x >>> 32 - r) >>> 0;
151
- const readU32 = (arr, offset) => (arr[offset] | arr[offset + 1] << 8 | arr[offset + 2] << 16 | arr[offset + 3] << 24) >>> 0;
152
- const len = data.length;
153
- let h32;
154
- let index = 0;
155
- if (len >= 16) {
156
- const limit = len - 16;
157
- let v1 = seed + PRIME32_1 + PRIME32_2 >>> 0;
158
- let v2 = seed + PRIME32_2 >>> 0;
159
- let v3 = seed >>> 0;
160
- let v4 = seed - PRIME32_1 >>> 0;
161
- while (index <= limit) {
162
- v1 = Math.imul(rotl32(v1 + Math.imul(readU32(data, index), PRIME32_2) >>> 0, 13), PRIME32_1) >>> 0;
163
- index += 4;
164
- v2 = Math.imul(rotl32(v2 + Math.imul(readU32(data, index), PRIME32_2) >>> 0, 13), PRIME32_1) >>> 0;
165
- index += 4;
166
- v3 = Math.imul(rotl32(v3 + Math.imul(readU32(data, index), PRIME32_2) >>> 0, 13), PRIME32_1) >>> 0;
167
- index += 4;
168
- v4 = Math.imul(rotl32(v4 + Math.imul(readU32(data, index), PRIME32_2) >>> 0, 13), PRIME32_1) >>> 0;
169
- index += 4;
170
- }
171
- h32 = rotl32(v1, 1) + rotl32(v2, 7) + rotl32(v3, 12) + rotl32(v4, 18) >>> 0;
172
- } else {
173
- h32 = seed + PRIME32_5 >>> 0;
174
- }
175
- h32 = h32 + len >>> 0;
176
- while (index <= len - 4) {
177
- h32 = Math.imul(rotl32(h32 + Math.imul(readU32(data, index), PRIME32_3) >>> 0, 17), PRIME32_4) >>> 0;
178
- index += 4;
179
- }
180
- while (index < len) {
181
- h32 = Math.imul(rotl32(h32 + Math.imul(data[index], PRIME32_5) >>> 0, 11), PRIME32_1) >>> 0;
182
- index++;
183
- }
184
- h32 ^= h32 >>> 15;
185
- h32 = Math.imul(h32, PRIME32_2) >>> 0;
186
- h32 ^= h32 >>> 13;
187
- h32 = Math.imul(h32, PRIME32_3) >>> 0;
188
- h32 ^= h32 >>> 16;
189
- return h32 >>> 0;
190
- }
191
- function toHex(value) {
192
- return (value >>> 0).toString(16).padStart(8, "0");
193
- }
194
- return {
195
- xxHash32: xxHash32Impl,
196
- hashString(str, seed = 0) {
197
- return xxHash32Impl(textEncoder.encode(str), seed);
198
- },
199
- hashStringToHex(str, seed = 0) {
200
- return toHex(xxHash32Impl(textEncoder.encode(str), seed));
201
- },
202
- verifyHash(data, expectedHash, seed = 0) {
203
- return xxHash32Impl(data, seed) === expectedHash;
204
- },
205
- verifyStringHash(str, expectedHash, seed = 0) {
206
- return xxHash32Impl(textEncoder.encode(str), seed) === expectedHash;
207
- }
208
- };
209
- }
210
-
211
- // src/hash.ts
212
- var hashModule = null;
213
- var initPromise = null;
214
- var useWasm = true;
215
- async function initHashModule(config = {}) {
216
- const { preferWasm = true, onWasmLoaded, onFallback } = config;
217
- if (hashModule) {
218
- return hashModule;
219
- }
220
- if (initPromise) {
221
- return initPromise;
222
- }
223
- initPromise = (async () => {
224
- if (preferWasm) {
225
- try {
226
- hashModule = await loadHashModule();
227
- useWasm = true;
228
- onWasmLoaded?.();
229
- return hashModule;
230
- } catch (error) {
231
- const reason = error instanceof Error ? error.message : "Unknown error";
232
- onFallback?.(reason);
233
- }
234
- } else {
235
- onFallback?.("WASM disabled by configuration");
236
- }
237
- hashModule = createFallbackHashModule();
238
- useWasm = false;
239
- return hashModule;
240
- })();
241
- return initPromise;
242
- }
243
- function getHash() {
244
- if (hashModule) {
245
- return hashModule;
246
- }
247
- hashModule = createFallbackHashModule();
248
- useWasm = false;
249
- return hashModule;
250
- }
251
- function isUsingWasm() {
252
- return useWasm && isHashModuleLoaded();
253
- }
254
- function hash(data, seed = 0) {
255
- const module = getHash();
256
- if (typeof data === "string") {
257
- return module.hashString(data, seed);
258
- }
259
- return module.xxHash32(data, seed);
260
- }
261
- function hashToHex(data, seed = 0) {
262
- const module = getHash();
263
- if (typeof data === "string") {
264
- return module.hashStringToHex(data, seed);
265
- }
266
- return module.xxHash32(data, seed).toString(16).padStart(8, "0");
267
- }
268
- function verify(data, expectedHash, seed = 0) {
269
- const module = getHash();
270
- const expected = typeof expectedHash === "string" ? parseInt(expectedHash, 16) : expectedHash;
271
- if (typeof data === "string") {
272
- return module.verifyStringHash(data, expected, seed);
273
- }
274
- return module.verifyHash(data, expected, seed);
275
- }
276
- function createSignature(data, secret) {
277
- const module = getHash();
278
- const secretHash = module.hashString(secret, 0);
279
- const dataHash = module.hashString(data, secretHash);
280
- return dataHash.toString(16).padStart(8, "0");
281
- }
282
- function verifySignature(data, signature, secret) {
283
- return createSignature(data, secret) === signature;
284
- }
285
- export {
286
- verifySignature,
287
- verify,
288
- loadHashModule,
289
- isUsingWasm,
290
- isHashModuleLoaded,
291
- initHashModule,
292
- hashToHex,
293
- hash,
294
- getHash,
295
- createSignature,
296
- createFallbackHashModule
297
- };
298
- export { __toESM, __require, getHash, hashToHex };
299
-
300
- //# debugId=18EFA41CA1DEC13A64756E2164756E21