UNPKG

@sumsub/fisherman

Version:

The Sumsub Fisherman is a powerful tool that helps developers integrate fraud detection capabilities into their applications. With Fisherman, you can easily identify and prevent fraudulent activities within your system, providing a safer and more secure e

2 lines (1 loc) 15.7 kB
(function(w,I){typeof exports=="object"&&typeof module<"u"?I(exports,require("fingerprintjs2"),require("detectincognitojs")):typeof define=="function"&&define.amd?define(["exports","fingerprintjs2","detectincognitojs"],I):(w=typeof globalThis<"u"?globalThis:w||self,I(w.SumsubFisherman={},w.Fingerprint2,w.detectIncognito))})(this,function(w,I,be){"use strict";var ve;function J(){return Date.now()}function Ee(){return new Date().toISOString()}const Ie="crypto"in window&&"randomUUID"in window.crypto;function Te(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const n=Math.random()*16|0;return(e==="x"?n:n&3|8).toString(16)})}function Se(){return Ie?crypto.randomUUID():Te()}const xe={type:"InvalidToken",message:"Token is invalid, make sure you generate a new one each time, because the old ones are invalidated upon usage"};async function De(e,n,t,r,i){const a=await fetch(`${t}${r}`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json","X-Access-Token":n,"X-Client-Id":"fisherman"}});i(a.status,e)}async function Re({payload:e,token:n,baseUrl:t,path:r}){return fetch(`${t}${r}`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json","X-Access-Token":n,"X-Client-Id":"fisherman"}})}const Ae=2e3,Ue=atob("aHR0cHM6Ly9jb2NrcGl0LnN1bXN1Yi5jb20="),Y=`/resources/bhv/evts/${Math.random().toString(36).substring(0,8)}`,Q="/resources/di/req";let E,q,Z,U,h,$,B,F=Y,K=Q;function Oe(e){E=e,k(E.token)}function ke(e){e&&(F=e)}function Pe(e){e&&(K=e)}function Ne(){ee(),Z=void 0,k(void 0),q=void 0,F=Y,K=Q}async function O(e,n){return await Le(je(e,{fpRequestId:n==null?void 0:n.fpRequestId,fpVisitorId:n==null?void 0:n.fpVisitorId,fpSimulation:n==null?void 0:n.fpSimulation},n==null?void 0:n.behavioralDataEnabled))}function je(e,n={},t=!0){e.capturedAt=Ee();const r=Se(),i="deviceFingerprint"in e||!t,a={id:r,predecessorEventId:q,deviceSessionId:Z,...n,[i?"initData":"interactionData"]:e};return q=r,a}async function Le(e,n){h===void 0&&(h=[]),!$&&e.initData?($=!0,h.unshift(e)):h.push(e),$&&(B||(B=setTimeout(ne,Ae)))}function ee(){h=void 0,B=void 0}async function ne(){if(h!=null&&h.length&&U){const e=[...h];ee(),await De(e,U,C(),F,qe)}}function C(){return E.baseUrl!==void 0?E.baseUrl:Ue}async function Me(){if(E.accessTokenUpdateHandler){const e=await E.accessTokenUpdateHandler();k(e)}}async function _e(e){await Me(),h===void 0&&(h=[]),h.unshift(...e),await ne()}async function qe(e,n){e===401&&(E.accessTokenUpdateHandler?await _e(n):k(void 0),E.onError&&E.onError(xe))}async function te(e){if(U)return Re({payload:e,token:U,baseUrl:C(),path:K})}function k(e){U=e}const re="focus";let L,ie=0;function $e(){L=()=>{ie++,O({event:"focus",count:ie})},window.addEventListener(re,L)}function Be(){L&&window.removeEventListener(re,L)}function Fe(e){if(e.target instanceof Element){const n=e.target,t=n.getAttribute("type"),r=t?`[${t}]`:"",i=n.id?`#${n.id}`:"";return`${n.tagName}${r}${i}`}}const Ke=["Alt","Control","Meta","Shift","Enter","Tab","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","End","Home","Backspace","Delete","Escape"];function Ce(e){if(Ke.includes(e))return e}function oe(e){return e instanceof Element}const D=typeof window.WeakMap=="function"?new WeakMap:void 0;function Ve(e){return D==null?void 0:D.get(e)}function He(e,n){D==null||D.set(e,n)}const Ge=["type","autocomplete","autofocus","placeholder","aria-label"];function Xe(e){const n=e.parentNode,t=e.tagName;if(n){const r=Array.from(n.childNodes).filter(i=>oe(i)&&t===i.tagName);if(r.length>1){const i=r.indexOf(e);if(i>-1)return`:nth-of-type(${i+1})`}}return""}function We(e){const n=e.id?`#${e.id}`:"",t=Xe(e),r=Ge.map(i=>{if(e.hasAttribute(i)){const a=e.getAttribute(i);return`[${a?`${i}="${a}"`:i}]`}}).filter(Boolean).join("");return e.tagName+n+t+r}function ze(e){const n=[e];let t=e;for(;t.parentElement;){const i=t.parentElement;n.push(i),t=i}const r=n.reverse().map(We).join(" > ");return I.x64hash128(r,31)}function Je(e){if(oe(e.target)){const n=e.target;let t=Ve(n);return t||(t=ze(n),He(n,t)),t}}const ae=["keydown","keyup"],ce=["mousemove","mousedown"],se=["paste","focusin","change",...ce,...ae];let m,v;function ue(){m=new Map,v=[]}function Ye(e){let n;return e.type==="change"&&(v&&(v==null?void 0:v.length)>0&&(n=v),ue()),n}function Qe({key:e}){m&&m.get(e)===void 0&&m.set(e,J())}function Ze({key:e}){const n=m==null?void 0:m.get(e);if(m&&n){v===void 0&&(v=[]),m.delete(e);const t={start:n,end:J()},r=Ce(e);r&&(t.key=r),v.push(t)}}function V(e){const n=e.type;if(n==="keydown"?Qe(e):n==="keyup"&&Ze(e),!ae.includes(n)){const t={event:n,trusted:e.isTrusted,el:Fe(e),elUid:Je(e),cadence:Ye(e)};O(t)}ce.includes(n)&&document.removeEventListener(n,V)}function en(){ue(),se.forEach(e=>document.addEventListener(e,V))}function nn(){se.forEach(e=>document.removeEventListener(e,V)),m=void 0,v=void 0}const de="deviceorientation";let R;function tn(e){const n=e.alpha!==null?e.alpha:0,t=e.beta!==null?e.beta:0,r=e.gamma!==null?e.gamma:0,i=Math.abs(t)>Math.abs(r)?"portrait":"landscape";return{alpha:n,beta:t,gamma:r,orientation:i}}async function rn(){if(!R){const e="DeviceOrientationEvent"in window;return e&&(R=n=>{O({event:"orientation",orientation:tn(n)}),fe()},window.addEventListener(de,R)),{supported:e}}}function fe(){R&&(window.removeEventListener(de,R),R=void 0)}const on="not available",an=["userAgent","webdriver","language","colorDepth","deviceMemory","pixelRatio","hardwareConcurrency","timezoneOffset","timezone","sessionStorage","localStorage","indexedDb","openDatabase","platform","doNotTrack","plugins","canvas","webgl","webglVendorAndRenderer","adBlock","hasLiedOs","hasLiedBrowser","touchSupport","fonts","audio"],H=200,cn=(e,n)=>{switch(e){case"touchSupport":return fn(n);case"plugins":return dn(n);case"webgl":case"canvas":return ln(n);default:return sn(n)}},sn=e=>typeof e=="string"?le(e):Array.isArray(e)?un(e):e,le=e=>e.length>H?pe(e):e,un=e=>((e==null?void 0:e.length)>H&&e.splice(0,H),e.map(n=>typeof n=="string"?le(n):n)),dn=e=>{if(Array.isArray(e)&&e.length>0)return e.map(n=>Array.isArray(n)?n[0]:"")},fn=e=>{if((e==null?void 0:e.length)===3)try{return{maxTouchPoints:Number(e[0]),touchEvent:!!e[1],touchStart:!!e[2]}}catch{return}},pe=e=>I.x64hash128(e,31),ln=e=>{if(e)return pe(e.toString())},pn=500;async function ge(e){const n=await hn(),t=[];n.forEach(({key:r,value:i})=>{if(t.push(i),an.includes(r)&&i!==on){const a=cn(r,i);a!==void 0&&(e[r]=a)}}),e.deviceFingerprint=I.x64hash128(t.join(""),31)}async function gn(e){return new Promise((n,t)=>{typeof window.requestIdleCallback=="function"?requestIdleCallback(async()=>{n(await ge(e))}):setTimeout(async()=>{n(await ge(e))},pn)})}function hn(){return new Promise(e=>I.get(e))}function P(){return navigator instanceof window.Navigator}async function yn(e){var n;return!!(P()&&typeof((n=navigator.permissions)==null?void 0:n.query)=="function"&&(await navigator.permissions.query({name:e})).state==="granted")}async function wn(){return new Promise(e=>{navigator.geolocation.getCurrentPosition(n=>{const t=n.coords.latitude,r=n.coords.longitude;e(`${t}:${r}`)},()=>{e("unknown")})})}async function mn(){const e=await yn("geolocation"),n={permissionGranted:e};return P()&&e&&navigator.geolocation&&(n.location=await wn()),n}async function vn(){if(P()&&"getBattery"in navigator&&typeof navigator.getBattery=="function"){const e=await navigator.getBattery();if(e)return{level:e.level,charging:e.charging}}}async function bn(){var e;if(P()&&typeof((e=navigator.mediaDevices)==null?void 0:e.enumerateDevices)=="function")return(await navigator.mediaDevices.enumerateDevices()).map(({kind:t,label:r,deviceId:i,groupId:a})=>({kind:t,label:r||void 0,deviceId:i||void 0,groupId:a||void 0}))}function En(){let e;try{throw"a"}catch(n){try{n.toSource(),e=!0}catch{e=!1}}return e}const In="notDetected";async function Tn(){try{return await be()}catch{return{browserName:In}}}async function Sn(){var f;const e={},{width:n,height:t,availWidth:r,availHeight:i}=window.screen;e.width=n,e.height=t,e.availableWidth=r,e.availableHeight=i,await gn(e);const a=await Tn();if(e.browser=a.browserName,e.incognito=a.isPrivate,P()&&"userAgentData"in navigator){const c=navigator.userAgentData;e.mobile=c==null?void 0:c.mobile}(f=navigator.languages)!=null&&f.length&&(e.languages=[...navigator.languages]),e.geolocation=await mn();const o=await vn();o&&(e.battery=o);const u=await bn();u&&(e.mediaDevices=u);const d=await rn();d&&(e.orientation=d),e.oscpu=navigator.oscpu,e.productSub=navigator.productSub,e.evalLength=eval.toString().length,e.errFirefox=En(),O(e)}const he="navigate";let N,G;const xn=typeof((ve=window.navigation)==null?void 0:ve.addEventListener)=="function";function Dn(){var e;xn&&(N=()=>{const n=An();n!==G&&(G=n,O({event:"urlchanged"}))},(e=window.navigation)==null||e.addEventListener(he,N))}function Rn(){var e;N&&((e=window.navigation)==null||e.removeEventListener(he,N),N=void 0,G=void 0)}function An(){return window.location.href}var M=function(){return M=Object.assign||function(n){for(var t,r=1,i=arguments.length;r<i;r++){t=arguments[r];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a])}return n},M.apply(this,arguments)};function Un(e,n){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&n.indexOf(r)<0&&(t[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,r=Object.getOwnPropertySymbols(e);i<r.length;i++)n.indexOf(r[i])<0&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(t[r[i]]=e[r[i]]);return t}function On(e,n,t){if(t||arguments.length===2)for(var r=0,i=n.length,a;r<i;r++)(a||!(r in n))&&(a||(a=Array.prototype.slice.call(n,0,r)),a[r]=n[r]);return e.concat(a||Array.prototype.slice.call(n))}typeof SuppressedError=="function"&&SuppressedError;function kn(e,n){return function(t,r){return Object.prototype.hasOwnProperty.call(t,r)}(e,n)?e[n]:void 0}function Pn(e,n,t,r){var i,a=document,o="securitypolicyviolation",u=function(f){var c=new URL(e,location.href),s=f.blockedURI;s!==c.href&&s!==c.protocol.slice(0,-1)&&s!==c.origin||(i=f,d())};a.addEventListener(o,u);var d=function(){return a.removeEventListener(o,u)};return Promise.resolve().then(n).then(function(f){return d(),f},function(f){return new Promise(function(c){var s=new MessageChannel;s.port1.onmessage=function(){return c()},s.port2.postMessage(null)}).then(function(){if(d(),i)return t(i);throw f})})}var ye="Blocked by CSP",we="The endpoint parameter is not a valid URL",Nn="API key required",jn="3.11.8",X="Failed to load the JS script of the agent",W="9319";function Ln(e,n){var t,r,i,a,o,u,d,f=[],c=(t=function(g){var p=On([],g,!0);return{current:function(){return p[0]},postpone:function(){var l=p.shift();l!==void 0&&p.push(l)},exclude:function(){p.shift()}}}(e),a=100,o=3e3,u=0,r=function(){return Math.random()*Math.min(o,a*Math.pow(2,u++))},i=new Set,[t.current(),function(g,p){var l,y=p instanceof Error?p.message:"";if(y===ye||y===we)t.exclude(),l=0;else if(y===W)t.exclude();else if(y===X){var A=Date.now()-g.getTime()<50,x=t.current();x&&A&&!i.has(x)&&(i.add(x),l=0),t.postpone()}else t.postpone();var j=t.current();return j===void 0?void 0:[j,l??g.getTime()+r()-Date.now()]}]),s=c[0],T=c[1];if(s===void 0)return Promise.reject(new TypeError("The list of script URL patterns is empty"));var S=function(g){var p=new Date,l=function(A){return f.push({url:g,startedAt:p,finishedAt:new Date,error:A})},y=n(g);return y.then(function(){return l()},l),y.catch(function(A){if(d!=null||(d=A),f.length>=5)throw d;var x=T(p,A);if(!x)throw d;var j,Jn=x[0],Yn=x[1];return(j=Yn,new Promise(function(Qn){return setTimeout(Qn,j)})).then(function(){return S(Jn)})})};return S(s).then(function(g){return[g,f]})}var Mn="https://fpnpmcdn.net/v<version>/<apiKey>/loader_v<loaderVersion>.js";function _n(e){var n;e.scriptUrlPattern;var t=e.token,r=e.apiKey,i=r===void 0?t:r,a=Un(e,["scriptUrlPattern","token","apiKey"]),o=(n=kn(e,"scriptUrlPattern"))!==null&&n!==void 0?n:Mn,u=function(){var c=[],s=function(){c.push({time:new Date,state:document.visibilityState})},T=function(S,g,p,l){return S.addEventListener(g,p,l),function(){return S.removeEventListener(g,p,l)}}(document,"visibilitychange",s);return s(),[c,T]}(),d=u[0],f=u[1];return Promise.resolve().then(function(){if(!i||typeof i!="string")throw new Error(Nn);var c=function(s,T){return(Array.isArray(s)?s:[s]).map(function(S){return function(g,p){var l=encodeURIComponent;return g.replace(/<[^<>]+>/g,function(y){return y==="<version>"?"3":y==="<apiKey>"?l(p):y==="<loaderVersion>"?l(jn):y})}(String(S),T)})}(o,i);return Ln(c,qn)}).catch(function(c){throw f(),function(s){return s instanceof Error&&s.message===W?new Error(X):s}(c)}).then(function(c){var s=c[0],T=c[1];return f(),s.load(M(M({},a),{ldi:{attempts:T,visibilityStates:d}}))})}function qn(e){return Pn(e,function(){return function(n){return new Promise(function(t,r){if(function(u){if(URL.prototype)try{return new URL(u,location.href),!1}catch(d){if(d instanceof Error&&d.name==="TypeError")return!0;throw d}}(n))throw new Error(we);var i=document.createElement("script"),a=function(){var u;return(u=i.parentNode)===null||u===void 0?void 0:u.removeChild(i)},o=document.head||document.getElementsByTagName("head")[0];i.onload=function(){a(),t()},i.onerror=function(){a(),r(new Error(X))},i.async=!0,i.src=n,o.appendChild(i)})}(e)},function(){throw new Error(ye)}).then($n)}function $n(){var e=window,n="__fpjs_p_l_b",t=e[n];if(function(r,i){var a,o=(a=Object.getOwnPropertyDescriptor)===null||a===void 0?void 0:a.call(Object,r,i);o!=null&&o.configurable?delete r[i]:o&&!o.writable||(r[i]=void 0)}(e,n),typeof(t==null?void 0:t.load)!="function")throw new Error(W);return t}var Bn={load:_n};async function Fn(e,n){const t=`${n}/resources/di/info`;return fetch(t,{headers:{"Content-Type":"application/json","X-Access-Token":e,"X-Client-Id":"fisherman"}}).then(r=>{if(r.status!==204)return r.json()})}const Kn="https://fpmetrics.sumsub.com";let _,b;async function Cn(e,n){let t=!1,r=!1,i,a;try{const o=await Fn(e,C()),u=(o==null?void 0:o.fpUrl)||Kn;r=!!(o!=null&&o.bhvEnabled),i=o==null?void 0:o.evRelUrl,a=o==null?void 0:o.fpReqRelUrl,o!=null&&o.fpKey&&(_=await Bn.load({apiKey:o.fpKey,scriptUrlPattern:`${u}/web/v<version>/<apiKey>/loader_v<loaderVersion>.js`,endpoint:u,region:"eu",remoteControlDetection:!0})),n?b={enabled:!0,conf:n}:o!=null&&o.simulation&&(b=o.simulation),t=!!(o!=null&&o.fpKey||b)}catch(o){console.log(o.message)}return{isDeviceIntelligenceEnabled:t,behavioralDataEnabled:r,eventsRelUrl:i,fpReqRelUrl:a}}async function Vn(e){if(b)return await Hn();let n,t;try{if(!_)throw new Error("Device Intelligence feature is not enabled");const r=await _.get({timeout:3e4,linkedId:e==null?void 0:e.linkedId});n=r.visitorId,t=r.requestId,await te({fpVisitorId:n,fpRequestId:t})}catch{console.log("Device Intelligence feature is not enabled")}return{visitorId:n}}async function Hn(){var t,r;const e={visitorId:(t=b==null?void 0:b.conf)==null?void 0:t.visitorId};if(!b)return e;const n={...b};if(!((r=n.conf)!=null&&r.requestId)){const i=`simulated-${Math.random().toString(36).substring(2,10)}`;n.conf={...n.conf,requestId:i}}try{await te({fpSimulation:n})}catch{console.error("Simulation error")}return e}const Gn=()=>{_=void 0,b=void 0};let z,me=!1;async function Xn(e){let n=!1;if(!z){z=!0,Oe(e);const t=await Cn(e.token,e.simulationConfig);n=t.isDeviceIntelligenceEnabled,me=t.behavioralDataEnabled,ke(t.eventsRelUrl),Pe(t.fpReqRelUrl),me&&(await Sn(),$e(),Dn(),en())}return{isDeviceIntelligenceEnabled:n,async fingerprint(t){return Vn(t)}}}function Wn(){fe(),Be(),Rn(),nn(),Ne(),Gn(),z=!1}function zn(e){k(e)}w.destroy=Wn,w.init=Xn,w.updateAccessToken=zn,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});