userdnajs
Version:
Community edition of UserDNA JS. A fingerprint generator library for creating unique user identifiers
3 lines (2 loc) • 7.45 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).UserDNACommunity={})}(this,(function(e){"use strict";function n(e){return function(e){let n=0;if(0===e.length)return n.toString(16);for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return Math.abs(n).toString(16)}(e.map((e=>null==e?"null":"object"==typeof e?JSON.stringify(e):String(e))).join("|"))}function t(){try{const e="__test__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}function o(){try{const e="__test__";return sessionStorage.setItem(e,e),sessionStorage.removeItem(e),!0}catch(e){return!1}}const i={getKey:(e="userdna")=>`${e}_userdna_fingerprint`,save:(e,n={})=>{const{storageType:s="localStorage",storagePrefix:r="userdna"}=n,a=i.getKey(r),u=JSON.stringify(e);switch(s){case"localStorage":return function(e,n){if(!t())return!1;try{return localStorage.setItem(e,n),!0}catch(e){return!1}}(a,u);case"sessionStorage":return function(e,n){if(!o())return!1;try{return sessionStorage.setItem(e,n),!0}catch(e){return!1}}(a,u);default:return!1}},get:(e={})=>{const{storageType:n="localStorage",storagePrefix:s="userdna"}=e,r=i.getKey(s);switch(n){case"localStorage":return function(e){if(!t())return null;try{const n=localStorage.getItem(e);return n?JSON.parse(n):null}catch(e){return null}}(r);case"sessionStorage":return function(e){if(!o())return null;try{const n=sessionStorage.getItem(e);return n?JSON.parse(n):null}catch(e){return null}}(r);default:return null}}};function s(){return"undefined"==typeof navigator?null:navigator.doNotTrack?navigator.doNotTrack:"doNotTrack"in window?window.doNotTrack:"msDoNotTrack"in navigator?navigator.msDoNotTrack:null}const r={includeBrowserInfo:!0,includeDeviceInfo:!0,includeScreenInfo:!0,includeTimezone:!0,includeLanguage:!0,includeStorage:!0,storagePrefix:"userdna",storageType:"localStorage",customComponents:[]};class a{constructor(e={}){this.lastResult=null,this.options={...r,...e},this.options.customComponents&&this.options.customComponents.length>2&&(this.options.customComponents=this.options.customComponents.slice(0,2))}async getFingerprint(e={}){if(this.lastResult)return this.lastResult;const t=this.getFromStorage();if(t)return this.lastResult=t,t;const o=await this.collectComponents(),i={id:n(Object.entries(o).map((([e,n])=>null==n?null:"object"==typeof n?JSON.stringify(n):String(n))).filter(Boolean)),components:o,createdAt:Date.now(),fromCache:!1};return"none"!==this.options.storageType&&this.saveToStorage(i),this.lastResult=i,i}async getVisitorId(){return(await this.getFingerprint()).id}async isSameVisitor(e){return(await this.getFingerprint()).id===e}async collectComponents(){const e={};if(this.options.includeBrowserInfo&&(e.browserInfo=function(){if("undefined"==typeof navigator)return{userAgent:"",browserName:"unknown",browserVersion:"unknown",os:"unknown",osVersion:"unknown",device:"unknown",vendor:"unknown",cookiesEnabled:!1,doNotTrack:null};const{userAgent:e}=navigator,n=function(e){var n,t,o,i,s,r;let a="unknown",u="unknown";return e.includes("Edg/")?(a="Edge",u=(null===(n=e.match(/Edg\/([0-9.]+)/))||void 0===n?void 0:n[1])||"unknown"):e.includes("Chrome/")?(a="Chrome",u=(null===(t=e.match(/Chrome\/([0-9.]+)/))||void 0===t?void 0:t[1])||"unknown"):e.includes("Safari/")&&!e.includes("Chrome/")?(a="Safari",u=(null===(o=e.match(/Version\/([0-9.]+)/))||void 0===o?void 0:o[1])||"unknown"):e.includes("Firefox/")?(a="Firefox",u=(null===(i=e.match(/Firefox\/([0-9.]+)/))||void 0===i?void 0:i[1])||"unknown"):e.includes("OPR/")||e.includes("Opera/")?(a="Opera",u=(null===(s=e.match(/(?:OPR|Opera)\/([0-9.]+)/))||void 0===s?void 0:s[1])||"unknown"):e.includes("Trident/")&&(a="Internet Explorer",u=(null===(r=e.match(/rv:([0-9.]+)/))||void 0===r?void 0:r[1])||"unknown"),{name:a,version:u}}(e),t=function(e){var n,t,o,i,s,r;let a="unknown",u="unknown";if(e.includes("Windows"))a="Windows",e.includes("Windows NT 10.0")?u="10":e.includes("Windows NT 6.3")?u="8.1":e.includes("Windows NT 6.2")?u="8":e.includes("Windows NT 6.1")?u="7":e.includes("Windows NT 6.0")?u="Vista":e.includes("Windows NT 5.1")?u="XP":e.includes("Windows NT 5.0")&&(u="2000");else if(e.includes("Macintosh")||e.includes("Mac OS X")){a="macOS";const o=(null===(n=e.match(/Mac OS X (\d+[._]\d+[._]\d+)/))||void 0===n?void 0:n[1])||(null===(t=e.match(/Mac OS X (\d+[._]\d+)/))||void 0===t?void 0:t[1]);o&&(u=o.replace(/_/g,"."))}else/iPhone|iPad|iPod/.test(e)?(a="iOS",u=(null===(i=null===(o=e.match(/OS (\d+[._]\d+[._]?\d*)/))||void 0===o?void 0:o[1])||void 0===i?void 0:i.replace(/_/g,"."))||"unknown"):e.includes("Android")?(a="Android",u=(null===(r=null===(s=e.match(/Android (\d+[._]\d+[._]?\d*)/))||void 0===s?void 0:s[1])||void 0===r?void 0:r.replace(/_/g,"."))||"unknown"):e.includes("Linux")&&(a="Linux");return{name:a,version:u}}(e),o=function(e){return/iPhone|iPod/.test(e)?"iPhone":/iPad/.test(e)?"iPad":/Android/.test(e)?/Mobile/.test(e)?"Android Mobile":"Android Tablet":/Windows Phone/.test(e)?"Windows Phone":/Macintosh|Mac OS X/.test(e)?"Mac":/Windows/.test(e)?"Windows":/Linux/.test(e)?"Linux":"unknown"}(e);return{userAgent:e,browserName:n.name,browserVersion:n.version,os:t.name,osVersion:t.version,device:o,vendor:navigator.vendor||"unknown",cookiesEnabled:navigator.cookieEnabled,doNotTrack:s()}}()),this.options.includeScreenInfo&&(e.screenInfo=function(){if("undefined"==typeof window||!window.screen)return{width:0,height:0,availWidth:0,availHeight:0,colorDepth:0,pixelRatio:1};const{screen:e}=window;return{width:e.width,height:e.height,availWidth:e.availWidth,availHeight:e.availHeight,colorDepth:e.colorDepth,pixelRatio:window.devicePixelRatio||1}}()),this.options.includeTimezone)try{e.timezone=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(n){e.timezone=String((new Date).getTimezoneOffset())}if(this.options.includeLanguage&&(e.language=navigator.language||navigator.userLanguage||navigator.browserLanguage||"unknown"),this.options.includeStorage&&(e.storage={localStorage:i.save({test:!0},{storageType:"localStorage"}),sessionStorage:i.save({test:!0},{storageType:"sessionStorage"}),cookies:!1,indexedDB:"indexedDB"in window}),this.options.customComponents&&this.options.customComponents.length>0){e.custom={};const n=this.options.customComponents.slice(0,2);await Promise.all(n.map((async n=>{try{e.custom[n.name]=await n.getValue()}catch(t){e.custom[n.name]=null}})))}return e}getFromStorage(){if("none"===this.options.storageType)return null;const e=i.get({storageType:this.options.storageType,storagePrefix:this.options.storagePrefix});if(!e||"object"!=typeof e)return null;try{const n=e;return n.id&&n.components&&n.createdAt?(n.fromCache=!0,n):null}catch(e){return null}}saveToStorage(e){"none"!==this.options.storageType&&i.save(e,{storageType:this.options.storageType,storagePrefix:this.options.storagePrefix})}updateOptions(e){this.options={...this.options,...e},this.options.customComponents&&this.options.customComponents.length>2&&(this.options.customComponents=this.options.customComponents.slice(0,2)),this.lastResult=null}getOptions(){return{...this.options}}}function u(e){return new a(e)}const c={createUserDNA:u,FingerprintGenerator:a};e.FingerprintGenerator=a,e.createUserDNA=u,e.default=c,Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=index.umd.min.js.map