@fingerprintjs/fingerprintjs
Advanced tools
Comparing version 3.0.0-beta.2 to 3.0.0-beta.3
/** | ||
* FingerprintJS v3.0.0-beta.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.0-beta.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -246,3 +246,3 @@ * | ||
var version = "3.0.0-beta.2"; | ||
var version = "3.0.0-beta.3"; | ||
@@ -526,3 +526,5 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
const plugins = []; | ||
for (const plugin of navigator.plugins) { | ||
// Safari 10 doesn't support iterating navigator.plugins with for...of | ||
for (let i = 0; i < navigator.plugins.length; ++i) { | ||
const plugin = navigator.plugins[i]; | ||
if (!plugin) { | ||
@@ -658,14 +660,97 @@ continue; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$2 = window; | ||
const n$2 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$2, | ||
'msLaunchUri' in n$2, | ||
'msSaveBlob' in n$2, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$2, | ||
'mediaSession' in n$2, | ||
n$2.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$2, | ||
'BatteryManager' in w$2, | ||
'webkitMediaStream' in w$2, | ||
'webkitSpeechGrammar' in w$2, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$2, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$2, | ||
'mozInnerScreenX' in w$2, | ||
'CSSMozDocumentRule' in w$2, | ||
'CanvasCaptureMediaStream' in w$2, | ||
]) >= 4; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return countTruthy([ | ||
!('MediaSettingsRange' in w$2), | ||
!('PhotoCapabilities' in w$2), | ||
'RTCEncodedAudioFrame' in w$2, | ||
('' + w$2.Intl) === '[object Intl]', | ||
]) >= 2; | ||
} | ||
const n$3 = navigator; | ||
function getLanguages() { | ||
const result = []; | ||
const language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
const language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$2.languages)) { | ||
result.push(n$2.languages); | ||
if (Array.isArray(n$3.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
} | ||
} | ||
else if (typeof n$2.languages === 'string') { | ||
const languages = n$2.languages; | ||
else if (typeof n$3.languages === 'string') { | ||
const languages = n$3.languages; | ||
if (languages) { | ||
@@ -686,7 +771,7 @@ result.push(languages.split(',')); | ||
const w$2 = window; | ||
const w$3 = window; | ||
function getScreenResolution() { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$2.screen.width), toInt(w$2.screen.height)]; | ||
const dimensions = [toInt(w$3.screen.width), toInt(w$3.screen.height)]; | ||
dimensions.sort().reverse(); | ||
@@ -696,8 +781,8 @@ return dimensions; | ||
const w$3 = window; | ||
const w$4 = window; | ||
function getAvailableScreenResolution() { | ||
if (w$3.screen.availWidth && w$3.screen.availHeight) { | ||
if (w$4.screen.availWidth && w$4.screen.availHeight) { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$3.screen.availWidth), toInt(w$3.screen.availHeight)]; | ||
const dimensions = [toInt(w$4.screen.availWidth), toInt(w$4.screen.availHeight)]; | ||
dimensions.sort().reverse(); | ||
@@ -724,7 +809,7 @@ return dimensions; | ||
const w$4 = window; | ||
const w$5 = window; | ||
function getTimezone() { | ||
var _a; | ||
if ((_a = w$4.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$4.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
if ((_a = w$5.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$5.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
} | ||
@@ -755,68 +840,2 @@ return undefined; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$5 = window; | ||
const n$3 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$5, | ||
'msLaunchUri' in n$3, | ||
'msSaveBlob' in n$3, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$3, | ||
'mediaSession' in n$3, | ||
n$3.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$5, | ||
'BatteryManager' in w$5, | ||
'webkitMediaStream' in w$5, | ||
'webkitSpeechGrammar' in w$5, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$5; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$3, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$5, | ||
'mozInnerScreenX' in w$5, | ||
'CSSMozDocumentRule' in w$5, | ||
'CanvasCaptureMediaStream' in w$5, | ||
]) >= 4; | ||
} | ||
function getIndexedDB() { | ||
@@ -967,3 +986,3 @@ // IE and Edge don't allow accessing indexedDB in private mode, therefore IE and Edge will have different | ||
catch (error) { | ||
result = { error: 'message' in error ? error : { message: error } }; | ||
result = error && typeof error === 'object' && 'message' in error ? { error } : { error: { message: error } }; | ||
} | ||
@@ -1023,3 +1042,3 @@ nextTimestamp = Date.now(); | ||
/** | ||
* The class isn't exported to not expose the constructor. | ||
* The class isn't exported from the index file to not expose the constructor. | ||
* The hiding gives more freedom for future non-breaking updates. | ||
@@ -1054,2 +1073,5 @@ */ | ||
return tslib.__awaiter(this, void 0, void 0, function* () { | ||
// A delay is required to ensure consistent entropy components. | ||
// See https://github.com/fingerprintjs/fingerprintjs/issues/254 | ||
// and https://github.com/fingerprintjs/fingerprintjs/issues/307 | ||
yield requestIdleCallbackIfAvailable(delayFallback); | ||
@@ -1056,0 +1078,0 @@ return new OpenAgent(); |
/** | ||
* FingerprintJS v3.0.0-beta.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.0-beta.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -4,0 +4,0 @@ * |
/** | ||
* FingerprintJS v3.0.0-beta.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.0-beta.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -242,3 +242,3 @@ * | ||
var version = "3.0.0-beta.2"; | ||
var version = "3.0.0-beta.3"; | ||
@@ -522,3 +522,5 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
const plugins = []; | ||
for (const plugin of navigator.plugins) { | ||
// Safari 10 doesn't support iterating navigator.plugins with for...of | ||
for (let i = 0; i < navigator.plugins.length; ++i) { | ||
const plugin = navigator.plugins[i]; | ||
if (!plugin) { | ||
@@ -654,14 +656,97 @@ continue; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$2 = window; | ||
const n$2 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$2, | ||
'msLaunchUri' in n$2, | ||
'msSaveBlob' in n$2, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$2, | ||
'mediaSession' in n$2, | ||
n$2.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$2, | ||
'BatteryManager' in w$2, | ||
'webkitMediaStream' in w$2, | ||
'webkitSpeechGrammar' in w$2, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$2, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$2, | ||
'mozInnerScreenX' in w$2, | ||
'CSSMozDocumentRule' in w$2, | ||
'CanvasCaptureMediaStream' in w$2, | ||
]) >= 4; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return countTruthy([ | ||
!('MediaSettingsRange' in w$2), | ||
!('PhotoCapabilities' in w$2), | ||
'RTCEncodedAudioFrame' in w$2, | ||
('' + w$2.Intl) === '[object Intl]', | ||
]) >= 2; | ||
} | ||
const n$3 = navigator; | ||
function getLanguages() { | ||
const result = []; | ||
const language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
const language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$2.languages)) { | ||
result.push(n$2.languages); | ||
if (Array.isArray(n$3.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
} | ||
} | ||
else if (typeof n$2.languages === 'string') { | ||
const languages = n$2.languages; | ||
else if (typeof n$3.languages === 'string') { | ||
const languages = n$3.languages; | ||
if (languages) { | ||
@@ -682,7 +767,7 @@ result.push(languages.split(',')); | ||
const w$2 = window; | ||
const w$3 = window; | ||
function getScreenResolution() { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$2.screen.width), toInt(w$2.screen.height)]; | ||
const dimensions = [toInt(w$3.screen.width), toInt(w$3.screen.height)]; | ||
dimensions.sort().reverse(); | ||
@@ -692,8 +777,8 @@ return dimensions; | ||
const w$3 = window; | ||
const w$4 = window; | ||
function getAvailableScreenResolution() { | ||
if (w$3.screen.availWidth && w$3.screen.availHeight) { | ||
if (w$4.screen.availWidth && w$4.screen.availHeight) { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$3.screen.availWidth), toInt(w$3.screen.availHeight)]; | ||
const dimensions = [toInt(w$4.screen.availWidth), toInt(w$4.screen.availHeight)]; | ||
dimensions.sort().reverse(); | ||
@@ -720,7 +805,7 @@ return dimensions; | ||
const w$4 = window; | ||
const w$5 = window; | ||
function getTimezone() { | ||
var _a; | ||
if ((_a = w$4.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$4.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
if ((_a = w$5.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$5.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
} | ||
@@ -751,68 +836,2 @@ return undefined; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$5 = window; | ||
const n$3 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$5, | ||
'msLaunchUri' in n$3, | ||
'msSaveBlob' in n$3, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$3, | ||
'mediaSession' in n$3, | ||
n$3.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$5, | ||
'BatteryManager' in w$5, | ||
'webkitMediaStream' in w$5, | ||
'webkitSpeechGrammar' in w$5, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$5; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$3, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$5, | ||
'mozInnerScreenX' in w$5, | ||
'CSSMozDocumentRule' in w$5, | ||
'CanvasCaptureMediaStream' in w$5, | ||
]) >= 4; | ||
} | ||
function getIndexedDB() { | ||
@@ -963,3 +982,3 @@ // IE and Edge don't allow accessing indexedDB in private mode, therefore IE and Edge will have different | ||
catch (error) { | ||
result = { error: 'message' in error ? error : { message: error } }; | ||
result = error && typeof error === 'object' && 'message' in error ? { error } : { error: { message: error } }; | ||
} | ||
@@ -1019,3 +1038,3 @@ nextTimestamp = Date.now(); | ||
/** | ||
* The class isn't exported to not expose the constructor. | ||
* The class isn't exported from the index file to not expose the constructor. | ||
* The hiding gives more freedom for future non-breaking updates. | ||
@@ -1050,2 +1069,5 @@ */ | ||
return __awaiter(this, void 0, void 0, function* () { | ||
// A delay is required to ensure consistent entropy components. | ||
// See https://github.com/fingerprintjs/fingerprintjs/issues/254 | ||
// and https://github.com/fingerprintjs/fingerprintjs/issues/307 | ||
yield requestIdleCallbackIfAvailable(delayFallback); | ||
@@ -1052,0 +1074,0 @@ return new OpenAgent(); |
190
dist/fp.js
/** | ||
* FingerprintJS v3.0.0-beta.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.0-beta.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -268,3 +268,3 @@ * | ||
var version = "3.0.0-beta.2"; | ||
var version = "3.0.0-beta.3"; | ||
@@ -548,3 +548,5 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
const plugins = []; | ||
for (const plugin of navigator.plugins) { | ||
// Safari 10 doesn't support iterating navigator.plugins with for...of | ||
for (let i = 0; i < navigator.plugins.length; ++i) { | ||
const plugin = navigator.plugins[i]; | ||
if (!plugin) { | ||
@@ -680,14 +682,97 @@ continue; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$2 = window; | ||
const n$2 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$2, | ||
'msLaunchUri' in n$2, | ||
'msSaveBlob' in n$2, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$2, | ||
'mediaSession' in n$2, | ||
n$2.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$2, | ||
'BatteryManager' in w$2, | ||
'webkitMediaStream' in w$2, | ||
'webkitSpeechGrammar' in w$2, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$2, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$2, | ||
'mozInnerScreenX' in w$2, | ||
'CSSMozDocumentRule' in w$2, | ||
'CanvasCaptureMediaStream' in w$2, | ||
]) >= 4; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return countTruthy([ | ||
!('MediaSettingsRange' in w$2), | ||
!('PhotoCapabilities' in w$2), | ||
'RTCEncodedAudioFrame' in w$2, | ||
('' + w$2.Intl) === '[object Intl]', | ||
]) >= 2; | ||
} | ||
const n$3 = navigator; | ||
function getLanguages() { | ||
const result = []; | ||
const language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
const language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$2.languages)) { | ||
result.push(n$2.languages); | ||
if (Array.isArray(n$3.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
} | ||
} | ||
else if (typeof n$2.languages === 'string') { | ||
const languages = n$2.languages; | ||
else if (typeof n$3.languages === 'string') { | ||
const languages = n$3.languages; | ||
if (languages) { | ||
@@ -708,7 +793,7 @@ result.push(languages.split(',')); | ||
const w$2 = window; | ||
const w$3 = window; | ||
function getScreenResolution() { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$2.screen.width), toInt(w$2.screen.height)]; | ||
const dimensions = [toInt(w$3.screen.width), toInt(w$3.screen.height)]; | ||
dimensions.sort().reverse(); | ||
@@ -718,8 +803,8 @@ return dimensions; | ||
const w$3 = window; | ||
const w$4 = window; | ||
function getAvailableScreenResolution() { | ||
if (w$3.screen.availWidth && w$3.screen.availHeight) { | ||
if (w$4.screen.availWidth && w$4.screen.availHeight) { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$3.screen.availWidth), toInt(w$3.screen.availHeight)]; | ||
const dimensions = [toInt(w$4.screen.availWidth), toInt(w$4.screen.availHeight)]; | ||
dimensions.sort().reverse(); | ||
@@ -746,7 +831,7 @@ return dimensions; | ||
const w$4 = window; | ||
const w$5 = window; | ||
function getTimezone() { | ||
var _a; | ||
if ((_a = w$4.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$4.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
if ((_a = w$5.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$5.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
} | ||
@@ -777,68 +862,2 @@ return undefined; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$5 = window; | ||
const n$3 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$5, | ||
'msLaunchUri' in n$3, | ||
'msSaveBlob' in n$3, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$3, | ||
'mediaSession' in n$3, | ||
n$3.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$5, | ||
'BatteryManager' in w$5, | ||
'webkitMediaStream' in w$5, | ||
'webkitSpeechGrammar' in w$5, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$5; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$3, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$5, | ||
'mozInnerScreenX' in w$5, | ||
'CSSMozDocumentRule' in w$5, | ||
'CanvasCaptureMediaStream' in w$5, | ||
]) >= 4; | ||
} | ||
function getIndexedDB() { | ||
@@ -989,3 +1008,3 @@ // IE and Edge don't allow accessing indexedDB in private mode, therefore IE and Edge will have different | ||
catch (error) { | ||
result = { error: 'message' in error ? error : { message: error } }; | ||
result = error && typeof error === 'object' && 'message' in error ? { error } : { error: { message: error } }; | ||
} | ||
@@ -1045,3 +1064,3 @@ nextTimestamp = Date.now(); | ||
/** | ||
* The class isn't exported to not expose the constructor. | ||
* The class isn't exported from the index file to not expose the constructor. | ||
* The hiding gives more freedom for future non-breaking updates. | ||
@@ -1076,2 +1095,5 @@ */ | ||
return __awaiter(this, void 0, void 0, function* () { | ||
// A delay is required to ensure consistent entropy components. | ||
// See https://github.com/fingerprintjs/fingerprintjs/issues/254 | ||
// and https://github.com/fingerprintjs/fingerprintjs/issues/307 | ||
yield requestIdleCallbackIfAvailable(delayFallback); | ||
@@ -1078,0 +1100,0 @@ return new OpenAgent(); |
/** | ||
* FingerprintJS v3.0.0-beta.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.0-beta.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -9,2 +9,2 @@ * | ||
var FingerprintJS=function(t){"use strict";function e(t,e){t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]],e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]];var n=[0,0,0,0];return n[3]+=t[3]+e[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=t[2]+e[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=t[1]+e[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=t[0]+e[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(t,e){t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]],e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]];var n=[0,0,0,0];return n[3]+=t[3]*e[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=t[2]*e[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=t[3]*e[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=t[1]*e[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=t[2]*e[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=t[3]*e[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=t[0]*e[3]+t[1]*e[2]+t[2]*e[1]+t[3]*e[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function o(t,e){return 32===(e%=64)?[t[1],t[0]]:e<32?[t[0]<<e|t[1]>>>32-e,t[1]<<e|t[0]>>>32-e]:(e-=32,[t[1]<<e|t[0]>>>32-e,t[0]<<e|t[1]>>>32-e])}function r(t,e){return 0===(e%=64)?t:e<32?[t[0]<<e|t[1]>>>32-e,t[1]<<e]:[t[1]<<e-32,0]}function i(t,e){return[t[0]^e[0],t[1]^e[1]]}function a(t){return t=i(t,[0,t[0]>>>1]),t=i(t=n(t,[4283543511,3981806797]),[0,t[0]>>>1]),t=i(t=n(t,[3301882366,444984403]),[0,t[0]>>>1])}function c(t,c){c=c||0;for(var s=(t=t||"").length%16,u=t.length-s,l=[0,c],d=[0,c],f=[0,0],h=[0,0],g=[2277735313,289559509],m=[1291169091,658871167],p=0;p<u;p+=16)f=[255&t.charCodeAt(p+4)|(255&t.charCodeAt(p+5))<<8|(255&t.charCodeAt(p+6))<<16|(255&t.charCodeAt(p+7))<<24,255&t.charCodeAt(p)|(255&t.charCodeAt(p+1))<<8|(255&t.charCodeAt(p+2))<<16|(255&t.charCodeAt(p+3))<<24],h=[255&t.charCodeAt(p+12)|(255&t.charCodeAt(p+13))<<8|(255&t.charCodeAt(p+14))<<16|(255&t.charCodeAt(p+15))<<24,255&t.charCodeAt(p+8)|(255&t.charCodeAt(p+9))<<8|(255&t.charCodeAt(p+10))<<16|(255&t.charCodeAt(p+11))<<24],f=o(f=n(f,g),31),l=e(l=o(l=i(l,f=n(f,m)),27),d),l=e(n(l,[0,5]),[0,1390208809]),h=o(h=n(h,m),33),d=e(d=o(d=i(d,h=n(h,g)),31),l),d=e(n(d,[0,5]),[0,944331445]);switch(f=[0,0],h=[0,0],s){case 15:h=i(h,r([0,t.charCodeAt(p+14)],48));case 14:h=i(h,r([0,t.charCodeAt(p+13)],40));case 13:h=i(h,r([0,t.charCodeAt(p+12)],32));case 12:h=i(h,r([0,t.charCodeAt(p+11)],24));case 11:h=i(h,r([0,t.charCodeAt(p+10)],16));case 10:h=i(h,r([0,t.charCodeAt(p+9)],8));case 9:h=n(h=i(h,[0,t.charCodeAt(p+8)]),m),d=i(d,h=n(h=o(h,33),g));case 8:f=i(f,r([0,t.charCodeAt(p+7)],56));case 7:f=i(f,r([0,t.charCodeAt(p+6)],48));case 6:f=i(f,r([0,t.charCodeAt(p+5)],40));case 5:f=i(f,r([0,t.charCodeAt(p+4)],32));case 4:f=i(f,r([0,t.charCodeAt(p+3)],24));case 3:f=i(f,r([0,t.charCodeAt(p+2)],16));case 2:f=i(f,r([0,t.charCodeAt(p+1)],8));case 1:f=n(f=i(f,[0,t.charCodeAt(p)]),g),l=i(l,f=n(f=o(f,31),m))}return l=e(l=i(l,[0,t.length]),d=i(d,[0,t.length])),d=e(d,l),l=e(l=a(l),d=a(d)),d=e(d,l),("00000000"+(l[0]>>>0).toString(16)).slice(-8)+("00000000"+(l[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}function s(t,e,n,o){return new(n||(n=Promise))((function(r,i){function a(t){try{s(o.next(t))}catch(e){i(e)}}function c(t){try{s(o.throw(t))}catch(e){i(e)}}function s(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}s((o=o.apply(t,e||[])).next())}))}function u(t){return"number"==typeof t?0|t:parseInt(t)}function l(t){return t.reduce(((t,e)=>t+(e?1:0)),0)}const d=navigator,f=window;const h=document,g=["monospace","sans-serif","serif"],m=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],p={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal"};function v(t){return t.toDataURL()}const y=navigator,C=window;const S=navigator;const w=window;const A=window;const b=window;const M=window,T=navigator,k=document;function O(){return l(["msWriteProfilerMark"in M,"msLaunchUri"in T,"msSaveBlob"in T])>=2}const x=document;const P={osCpu:function(){return navigator.oscpu},languages:function(){const t=[],e=S.language||S.userLanguage||S.browserLanguage||S.systemLanguage;if(void 0!==e&&t.push([e]),Array.isArray(S.languages))t.push(S.languages);else if("string"==typeof S.languages){const e=S.languages;e&&t.push(e.split(","))}return t},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){const t=[u(w.screen.width),u(w.screen.height)];return t.sort().reverse(),t},availableScreenResolution:function(){if(A.screen.availWidth&&A.screen.availHeight){const t=[u(A.screen.availWidth),u(A.screen.availHeight)];return t.sort().reverse(),t}},hardwareConcurrency:function(){try{const t=u(navigator.hardwareConcurrency);return isNaN(t)?1:t}catch(t){return 1}},timezoneOffset:function(){return(new Date).getTimezoneOffset()},timezone:function(){var t;if(null===(t=b.Intl)||void 0===t?void 0:t.DateTimeFormat)return(new b.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(t){return!0}},localStorage:function(){try{return!!window.localStorage}catch(t){return!0}},indexedDB:function(){if(!O())try{return!!window.indexedDB}catch(t){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(!navigator.plugins)return;const t=[];for(const e of navigator.plugins){if(!e)continue;const n=[];for(const t of e)n.push({type:t.type,suffixes:t.suffixes});t.push({name:e.name,description:e.description,mimeTypes:n})}return t},canvas:function(){const[t,e]=function(){const t=document.createElement("canvas");return t.width=240,t.height=140,t.style.display="inline",[t,t.getContext("2d")]}();if(!function(t,e){return!(!e||!t.toDataURL)}(t,e))return{winding:!1,data:""};e.rect(0,0,10,10),e.rect(2,2,6,6);const n=!e.isPointInPath(5,5,"evenodd");e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123";const o="Cwm fjordbank 😃 gly";return e.fillText(o,2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText(o,4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),{winding:n,data:v(t)}},touchSupport:function(){let t,e=0;void 0!==y.maxTouchPoints?e=u(y.maxTouchPoints):void 0!==y.msMaxTouchPoints&&(e=y.msMaxTouchPoints);try{document.createEvent("TouchEvent"),t=!0}catch(n){t=!1}return{maxTouchPoints:e,touchEvent:t,touchStart:"ontouchstart"in C}},fonts:function(){const t=h.body,e=h.createElement("div"),n=h.createElement("div"),o={},r={},i=()=>{const t=h.createElement("span");return Object.assign(t.style,p,{position:"absolute",left:"-9999px",fontSize:"48px"}),t.textContent="mmMwWLliI0O&1",t},a=(t,e)=>{const n=i();return n.style.fontFamily=`'${t}',${e}`,n},c=t=>g.some(((e,n)=>t[n].offsetWidth!==o[e]||t[n].offsetHeight!==r[e])),s=g.map((t=>{const n=i();return n.style.fontFamily=t,e.appendChild(n),n}));t.appendChild(e);for(let d=0,f=g.length;d<f;d++)o[g[d]]=s[d].offsetWidth,r[g[d]]=s[d].offsetHeight;const u=(()=>{const t={};for(const e of m)t[e]=g.map((t=>{const o=a(e,t);return n.appendChild(o),o}));return t})();t.appendChild(n);const l=[];for(let d=0,f=m.length;d<f;d++)c(u[m[d]])&&l.push(m[d]);return t.removeChild(n),t.removeChild(e),l},audio:function(){return s(this,void 0,void 0,(function*(){if(d.userAgent.match(/OS 11.+Version\/11.+Safari/))return-1;const t=f.OfflineAudioContext||f.webkitOfflineAudioContext;if(!t)return-2;const e=new t(1,44100,44100),n=e.createOscillator();n.type="triangle",n.frequency.setValueAtTime(1e4,e.currentTime);const o=e.createDynamicsCompressor();for(const[r,i]of[["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]])"function"==typeof o[r].setValueAtTime&&o[r].setValueAtTime(i,e.currentTime);return n.connect(o),o.connect(e.destination),n.start(0),e.startRendering(),new Promise((t=>{const r=setTimeout((()=>{e.oncomplete=()=>{},t(-3)}),1e3);e.oncomplete=e=>{let i;try{clearTimeout(r),i=e.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(((t,e)=>t+Math.abs(e)),0),n.disconnect(),o.disconnect()}catch(a){return void t(-4)}t(i)}}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(t){try{return t.toSource(),!0}catch(e){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{x.cookie="cookietest=1";const t=-1!==x.cookie.indexOf("cookietest=");return x.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",t}catch(t){return!1}}};function I(t,e,n){return s(this,void 0,void 0,(function*(){let o=Date.now();const r={};for(const a of Object.keys(t)){if(function(t,e){for(let n=0,o=t.length;n<o;++n)if(t[n]===e)return!0;return!1}(n,a))continue;let c,s;try{c={value:yield t[a](e)}}catch(i){c={error:"message"in i?i:{message:i}}}s=Date.now(),r[a]=Object.assign(Object.assign({},c),{duration:s-o}),o=s}return r}))}function B(t){let e="";for(const n of Object.keys(t)){const o=t[n],r=o.error?"error":JSON.stringify(o.value);e+=`${e?"|":""}${n.replace(/([:|\\])/g,"\\$1")}:${r}`}return e}function D(t){return JSON.stringify(t,((t,e)=>{var n;return e instanceof Error?Object.assign(Object.assign({},e),{message:e.message,stack:null===(n=e.stack)||void 0===n?void 0:n.split("\n")}):e}),2)}class E{get(t={}){return s(this,void 0,void 0,(function*(){const e=yield I(P,void 0,[]),n=function(t){let e;return{components:t,get visitorId(){return void 0===e&&(e=c(B(this.components))),e},set visitorId(t){e=t}}}(e);return t.debug&&console.log(`Copy the text below to get the debug data:\n\n\`\`\`\nversion: 3.0.0-beta.2\ngetOptions: ${JSON.stringify(t,void 0,2)}\nvisitorId: ${n.visitorId}\ncomponents: ${D(e)}\n\`\`\``),n}))}}const L=c,R=c;return t.componentsToCanonicalString=B,t.componentsToDebugString=D,t.getComponents=I,t.getHash=L,t.isChromium=function(){return l(["userActivation"in T,"mediaSession"in T,0===T.vendor.indexOf("Google"),"BackgroundFetchManager"in M,"BatteryManager"in M,"webkitMediaStream"in M,"webkitSpeechGrammar"in M])>=5},t.isDesktopSafari=function(){return"safari"in M},t.isGecko=function(){var t;return l(["buildID"in T,(null===(t=k.documentElement)||void 0===t?void 0:t.style)&&"MozAppearance"in k.documentElement.style,"MediaRecorderErrorEvent"in M,"mozInnerScreenX"in M,"CSSMozDocumentRule"in M,"CanvasCaptureMediaStream"in M])>=4},t.isIEOrOldEdge=O,t.load=function({delayFallback:t=50}={}){return s(this,void 0,void 0,(function*(){var e;return yield(e=t,new Promise((t=>{window.requestIdleCallback?window.requestIdleCallback((()=>t())):setTimeout(t,e)}))),new E}))},t.murmurX64Hash128=R,t}({}); | ||
var FingerprintJS=function(t){"use strict";function e(t,e){t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]],e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]];var n=[0,0,0,0];return n[3]+=t[3]+e[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=t[2]+e[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=t[1]+e[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=t[0]+e[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(t,e){t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]],e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]];var n=[0,0,0,0];return n[3]+=t[3]*e[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=t[2]*e[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=t[3]*e[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=t[1]*e[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=t[2]*e[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=t[3]*e[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=t[0]*e[3]+t[1]*e[2]+t[2]*e[1]+t[3]*e[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function o(t,e){return 32===(e%=64)?[t[1],t[0]]:e<32?[t[0]<<e|t[1]>>>32-e,t[1]<<e|t[0]>>>32-e]:(e-=32,[t[1]<<e|t[0]>>>32-e,t[0]<<e|t[1]>>>32-e])}function r(t,e){return 0===(e%=64)?t:e<32?[t[0]<<e|t[1]>>>32-e,t[1]<<e]:[t[1]<<e-32,0]}function i(t,e){return[t[0]^e[0],t[1]^e[1]]}function a(t){return t=i(t,[0,t[0]>>>1]),t=i(t=n(t,[4283543511,3981806797]),[0,t[0]>>>1]),t=i(t=n(t,[3301882366,444984403]),[0,t[0]>>>1])}function c(t,c){c=c||0;for(var s=(t=t||"").length%16,u=t.length-s,l=[0,c],d=[0,c],f=[0,0],h=[0,0],g=[2277735313,289559509],m=[1291169091,658871167],p=0;p<u;p+=16)f=[255&t.charCodeAt(p+4)|(255&t.charCodeAt(p+5))<<8|(255&t.charCodeAt(p+6))<<16|(255&t.charCodeAt(p+7))<<24,255&t.charCodeAt(p)|(255&t.charCodeAt(p+1))<<8|(255&t.charCodeAt(p+2))<<16|(255&t.charCodeAt(p+3))<<24],h=[255&t.charCodeAt(p+12)|(255&t.charCodeAt(p+13))<<8|(255&t.charCodeAt(p+14))<<16|(255&t.charCodeAt(p+15))<<24,255&t.charCodeAt(p+8)|(255&t.charCodeAt(p+9))<<8|(255&t.charCodeAt(p+10))<<16|(255&t.charCodeAt(p+11))<<24],f=o(f=n(f,g),31),l=e(l=o(l=i(l,f=n(f,m)),27),d),l=e(n(l,[0,5]),[0,1390208809]),h=o(h=n(h,m),33),d=e(d=o(d=i(d,h=n(h,g)),31),l),d=e(n(d,[0,5]),[0,944331445]);switch(f=[0,0],h=[0,0],s){case 15:h=i(h,r([0,t.charCodeAt(p+14)],48));case 14:h=i(h,r([0,t.charCodeAt(p+13)],40));case 13:h=i(h,r([0,t.charCodeAt(p+12)],32));case 12:h=i(h,r([0,t.charCodeAt(p+11)],24));case 11:h=i(h,r([0,t.charCodeAt(p+10)],16));case 10:h=i(h,r([0,t.charCodeAt(p+9)],8));case 9:h=n(h=i(h,[0,t.charCodeAt(p+8)]),m),d=i(d,h=n(h=o(h,33),g));case 8:f=i(f,r([0,t.charCodeAt(p+7)],56));case 7:f=i(f,r([0,t.charCodeAt(p+6)],48));case 6:f=i(f,r([0,t.charCodeAt(p+5)],40));case 5:f=i(f,r([0,t.charCodeAt(p+4)],32));case 4:f=i(f,r([0,t.charCodeAt(p+3)],24));case 3:f=i(f,r([0,t.charCodeAt(p+2)],16));case 2:f=i(f,r([0,t.charCodeAt(p+1)],8));case 1:f=n(f=i(f,[0,t.charCodeAt(p)]),g),l=i(l,f=n(f=o(f,31),m))}return l=e(l=i(l,[0,t.length]),d=i(d,[0,t.length])),d=e(d,l),l=e(l=a(l),d=a(d)),d=e(d,l),("00000000"+(l[0]>>>0).toString(16)).slice(-8)+("00000000"+(l[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}function s(t,e,n,o){return new(n||(n=Promise))((function(r,i){function a(t){try{s(o.next(t))}catch(e){i(e)}}function c(t){try{s(o.throw(t))}catch(e){i(e)}}function s(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}s((o=o.apply(t,e||[])).next())}))}function u(t){return"number"==typeof t?0|t:parseInt(t)}function l(t){return t.reduce(((t,e)=>t+(e?1:0)),0)}const d=navigator,f=window;const h=document,g=["monospace","sans-serif","serif"],m=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],p={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal"};function v(t){return t.toDataURL()}const y=navigator,C=window;const S=window,w=navigator,A=document;function b(){return l(["msWriteProfilerMark"in S,"msLaunchUri"in w,"msSaveBlob"in w])>=2}function M(){return l(["userActivation"in w,"mediaSession"in w,0===w.vendor.indexOf("Google"),"BackgroundFetchManager"in S,"BatteryManager"in S,"webkitMediaStream"in S,"webkitSpeechGrammar"in S])>=5}const T=navigator;const k=window;const O=window;const P=window;const x=document;const I={osCpu:function(){return navigator.oscpu},languages:function(){const t=[],e=T.language||T.userLanguage||T.browserLanguage||T.systemLanguage;if(void 0!==e&&t.push([e]),Array.isArray(T.languages))M()&&l([!("MediaSettingsRange"in S),!("PhotoCapabilities"in S),"RTCEncodedAudioFrame"in S,""+S.Intl=="[object Intl]"])>=2||t.push(T.languages);else if("string"==typeof T.languages){const e=T.languages;e&&t.push(e.split(","))}return t},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){const t=[u(k.screen.width),u(k.screen.height)];return t.sort().reverse(),t},availableScreenResolution:function(){if(O.screen.availWidth&&O.screen.availHeight){const t=[u(O.screen.availWidth),u(O.screen.availHeight)];return t.sort().reverse(),t}},hardwareConcurrency:function(){try{const t=u(navigator.hardwareConcurrency);return isNaN(t)?1:t}catch(t){return 1}},timezoneOffset:function(){return(new Date).getTimezoneOffset()},timezone:function(){var t;if(null===(t=P.Intl)||void 0===t?void 0:t.DateTimeFormat)return(new P.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(t){return!0}},localStorage:function(){try{return!!window.localStorage}catch(t){return!0}},indexedDB:function(){if(!b())try{return!!window.indexedDB}catch(t){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(!navigator.plugins)return;const t=[];for(let e=0;e<navigator.plugins.length;++e){const n=navigator.plugins[e];if(!n)continue;const o=[];for(const t of n)o.push({type:t.type,suffixes:t.suffixes});t.push({name:n.name,description:n.description,mimeTypes:o})}return t},canvas:function(){const[t,e]=function(){const t=document.createElement("canvas");return t.width=240,t.height=140,t.style.display="inline",[t,t.getContext("2d")]}();if(!function(t,e){return!(!e||!t.toDataURL)}(t,e))return{winding:!1,data:""};e.rect(0,0,10,10),e.rect(2,2,6,6);const n=!e.isPointInPath(5,5,"evenodd");e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123";const o="Cwm fjordbank 😃 gly";return e.fillText(o,2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText(o,4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),{winding:n,data:v(t)}},touchSupport:function(){let t,e=0;void 0!==y.maxTouchPoints?e=u(y.maxTouchPoints):void 0!==y.msMaxTouchPoints&&(e=y.msMaxTouchPoints);try{document.createEvent("TouchEvent"),t=!0}catch(n){t=!1}return{maxTouchPoints:e,touchEvent:t,touchStart:"ontouchstart"in C}},fonts:function(){const t=h.body,e=h.createElement("div"),n=h.createElement("div"),o={},r={},i=()=>{const t=h.createElement("span");return Object.assign(t.style,p,{position:"absolute",left:"-9999px",fontSize:"48px"}),t.textContent="mmMwWLliI0O&1",t},a=(t,e)=>{const n=i();return n.style.fontFamily=`'${t}',${e}`,n},c=t=>g.some(((e,n)=>t[n].offsetWidth!==o[e]||t[n].offsetHeight!==r[e])),s=g.map((t=>{const n=i();return n.style.fontFamily=t,e.appendChild(n),n}));t.appendChild(e);for(let d=0,f=g.length;d<f;d++)o[g[d]]=s[d].offsetWidth,r[g[d]]=s[d].offsetHeight;const u=(()=>{const t={};for(const e of m)t[e]=g.map((t=>{const o=a(e,t);return n.appendChild(o),o}));return t})();t.appendChild(n);const l=[];for(let d=0,f=m.length;d<f;d++)c(u[m[d]])&&l.push(m[d]);return t.removeChild(n),t.removeChild(e),l},audio:function(){return s(this,void 0,void 0,(function*(){if(d.userAgent.match(/OS 11.+Version\/11.+Safari/))return-1;const t=f.OfflineAudioContext||f.webkitOfflineAudioContext;if(!t)return-2;const e=new t(1,44100,44100),n=e.createOscillator();n.type="triangle",n.frequency.setValueAtTime(1e4,e.currentTime);const o=e.createDynamicsCompressor();for(const[r,i]of[["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]])"function"==typeof o[r].setValueAtTime&&o[r].setValueAtTime(i,e.currentTime);return n.connect(o),o.connect(e.destination),n.start(0),e.startRendering(),new Promise((t=>{const r=setTimeout((()=>{e.oncomplete=()=>{},t(-3)}),1e3);e.oncomplete=e=>{let i;try{clearTimeout(r),i=e.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(((t,e)=>t+Math.abs(e)),0),n.disconnect(),o.disconnect()}catch(a){return void t(-4)}t(i)}}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(t){try{return t.toSource(),!0}catch(e){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{x.cookie="cookietest=1";const t=-1!==x.cookie.indexOf("cookietest=");return x.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",t}catch(t){return!1}}};function B(t,e,n){return s(this,void 0,void 0,(function*(){let o=Date.now();const r={};for(const a of Object.keys(t)){if(function(t,e){for(let n=0,o=t.length;n<o;++n)if(t[n]===e)return!0;return!1}(n,a))continue;let c,s;try{c={value:yield t[a](e)}}catch(i){c=i&&"object"==typeof i&&"message"in i?{error:i}:{error:{message:i}}}s=Date.now(),r[a]=Object.assign(Object.assign({},c),{duration:s-o}),o=s}return r}))}function E(t){let e="";for(const n of Object.keys(t)){const o=t[n],r=o.error?"error":JSON.stringify(o.value);e+=`${e?"|":""}${n.replace(/([:|\\])/g,"\\$1")}:${r}`}return e}function D(t){return JSON.stringify(t,((t,e)=>{var n;return e instanceof Error?Object.assign(Object.assign({},e),{message:e.message,stack:null===(n=e.stack)||void 0===n?void 0:n.split("\n")}):e}),2)}class R{get(t={}){return s(this,void 0,void 0,(function*(){const e=yield B(I,void 0,[]),n=function(t){let e;return{components:t,get visitorId(){return void 0===e&&(e=c(E(this.components))),e},set visitorId(t){e=t}}}(e);return t.debug&&console.log(`Copy the text below to get the debug data:\n\n\`\`\`\nversion: 3.0.0-beta.3\ngetOptions: ${JSON.stringify(t,void 0,2)}\nvisitorId: ${n.visitorId}\ncomponents: ${D(e)}\n\`\`\``),n}))}}const L=c,F=c;return t.componentsToCanonicalString=E,t.componentsToDebugString=D,t.getComponents=B,t.getHash=L,t.isChromium=M,t.isDesktopSafari=function(){return"safari"in S},t.isGecko=function(){var t;return l(["buildID"in w,(null===(t=A.documentElement)||void 0===t?void 0:t.style)&&"MozAppearance"in A.documentElement.style,"MediaRecorderErrorEvent"in S,"mozInnerScreenX"in S,"CSSMozDocumentRule"in S,"CanvasCaptureMediaStream"in S])>=4},t.isIEOrOldEdge=b,t.load=function({delayFallback:t=50}={}){return s(this,void 0,void 0,(function*(){var e;return yield(e=t,new Promise((t=>{window.requestIdleCallback?window.requestIdleCallback((()=>t())):setTimeout(t,e)}))),new R}))},t.murmurX64Hash128=F,t}({}); |
/** | ||
* FingerprintJS v3.0.0-beta.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.0-beta.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -271,3 +271,3 @@ * | ||
var version = "3.0.0-beta.2"; | ||
var version = "3.0.0-beta.3"; | ||
@@ -551,3 +551,5 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
const plugins = []; | ||
for (const plugin of navigator.plugins) { | ||
// Safari 10 doesn't support iterating navigator.plugins with for...of | ||
for (let i = 0; i < navigator.plugins.length; ++i) { | ||
const plugin = navigator.plugins[i]; | ||
if (!plugin) { | ||
@@ -683,14 +685,97 @@ continue; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$2 = window; | ||
const n$2 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$2, | ||
'msLaunchUri' in n$2, | ||
'msSaveBlob' in n$2, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$2, | ||
'mediaSession' in n$2, | ||
n$2.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$2, | ||
'BatteryManager' in w$2, | ||
'webkitMediaStream' in w$2, | ||
'webkitSpeechGrammar' in w$2, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$2, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$2, | ||
'mozInnerScreenX' in w$2, | ||
'CSSMozDocumentRule' in w$2, | ||
'CanvasCaptureMediaStream' in w$2, | ||
]) >= 4; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return countTruthy([ | ||
!('MediaSettingsRange' in w$2), | ||
!('PhotoCapabilities' in w$2), | ||
'RTCEncodedAudioFrame' in w$2, | ||
('' + w$2.Intl) === '[object Intl]', | ||
]) >= 2; | ||
} | ||
const n$3 = navigator; | ||
function getLanguages() { | ||
const result = []; | ||
const language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
const language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$2.languages)) { | ||
result.push(n$2.languages); | ||
if (Array.isArray(n$3.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
} | ||
} | ||
else if (typeof n$2.languages === 'string') { | ||
const languages = n$2.languages; | ||
else if (typeof n$3.languages === 'string') { | ||
const languages = n$3.languages; | ||
if (languages) { | ||
@@ -711,7 +796,7 @@ result.push(languages.split(',')); | ||
const w$2 = window; | ||
const w$3 = window; | ||
function getScreenResolution() { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$2.screen.width), toInt(w$2.screen.height)]; | ||
const dimensions = [toInt(w$3.screen.width), toInt(w$3.screen.height)]; | ||
dimensions.sort().reverse(); | ||
@@ -721,8 +806,8 @@ return dimensions; | ||
const w$3 = window; | ||
const w$4 = window; | ||
function getAvailableScreenResolution() { | ||
if (w$3.screen.availWidth && w$3.screen.availHeight) { | ||
if (w$4.screen.availWidth && w$4.screen.availHeight) { | ||
// Some browsers return screen resolution as strings, e.g. "1200", instead of a number, e.g. 1200. | ||
// I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting. | ||
const dimensions = [toInt(w$3.screen.availWidth), toInt(w$3.screen.availHeight)]; | ||
const dimensions = [toInt(w$4.screen.availWidth), toInt(w$4.screen.availHeight)]; | ||
dimensions.sort().reverse(); | ||
@@ -749,7 +834,7 @@ return dimensions; | ||
const w$4 = window; | ||
const w$5 = window; | ||
function getTimezone() { | ||
var _a; | ||
if ((_a = w$4.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$4.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
if ((_a = w$5.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) { | ||
return new w$5.Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
} | ||
@@ -780,68 +865,2 @@ return undefined; | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
const w$5 = window; | ||
const n$3 = navigator; | ||
const d$1 = document; | ||
/** | ||
* Checks whether the browser is Internet Explorer or pre-Chromium Edge without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isIEOrOldEdge() { | ||
// The properties are checked to be in IE 10, IE 11 and Edge 18 and not to be in other browsers | ||
return countTruthy([ | ||
'msWriteProfilerMark' in w$5, | ||
'msLaunchUri' in n$3, | ||
'msSaveBlob' in n$3, | ||
]) >= 2; | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'userActivation' in n$3, | ||
'mediaSession' in n$3, | ||
n$3.vendor.indexOf('Google') === 0, | ||
'BackgroundFetchManager' in w$5, | ||
'BatteryManager' in w$5, | ||
'webkitMediaStream' in w$5, | ||
'webkitSpeechGrammar' in w$5, | ||
]) >= 5; | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$5; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return countTruthy([ | ||
'buildID' in n$3, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$5, | ||
'mozInnerScreenX' in w$5, | ||
'CSSMozDocumentRule' in w$5, | ||
'CanvasCaptureMediaStream' in w$5, | ||
]) >= 4; | ||
} | ||
function getIndexedDB() { | ||
@@ -992,3 +1011,3 @@ // IE and Edge don't allow accessing indexedDB in private mode, therefore IE and Edge will have different | ||
catch (error) { | ||
result = { error: 'message' in error ? error : { message: error } }; | ||
result = error && typeof error === 'object' && 'message' in error ? { error } : { error: { message: error } }; | ||
} | ||
@@ -1048,3 +1067,3 @@ nextTimestamp = Date.now(); | ||
/** | ||
* The class isn't exported to not expose the constructor. | ||
* The class isn't exported from the index file to not expose the constructor. | ||
* The hiding gives more freedom for future non-breaking updates. | ||
@@ -1079,2 +1098,5 @@ */ | ||
return __awaiter(this, void 0, void 0, function* () { | ||
// A delay is required to ensure consistent entropy components. | ||
// See https://github.com/fingerprintjs/fingerprintjs/issues/254 | ||
// and https://github.com/fingerprintjs/fingerprintjs/issues/307 | ||
yield requestIdleCallbackIfAvailable(delayFallback); | ||
@@ -1081,0 +1103,0 @@ return new OpenAgent(); |
/** | ||
* FingerprintJS v3.0.0-beta.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.0-beta.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -9,2 +9,2 @@ * | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FingerprintJS={})}(this,(function(e){"use strict";function t(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function o(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function r(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function i(e,t){return[e[0]^t[0],e[1]^t[1]]}function a(e){return e=i(e,[0,e[0]>>>1]),e=i(e=n(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=i(e=n(e,[3301882366,444984403]),[0,e[0]>>>1])}function c(e,c){c=c||0;for(var s=(e=e||"").length%16,u=e.length-s,l=[0,c],d=[0,c],f=[0,0],h=[0,0],g=[2277735313,289559509],m=[1291169091,658871167],p=0;p<u;p+=16)f=[255&e.charCodeAt(p+4)|(255&e.charCodeAt(p+5))<<8|(255&e.charCodeAt(p+6))<<16|(255&e.charCodeAt(p+7))<<24,255&e.charCodeAt(p)|(255&e.charCodeAt(p+1))<<8|(255&e.charCodeAt(p+2))<<16|(255&e.charCodeAt(p+3))<<24],h=[255&e.charCodeAt(p+12)|(255&e.charCodeAt(p+13))<<8|(255&e.charCodeAt(p+14))<<16|(255&e.charCodeAt(p+15))<<24,255&e.charCodeAt(p+8)|(255&e.charCodeAt(p+9))<<8|(255&e.charCodeAt(p+10))<<16|(255&e.charCodeAt(p+11))<<24],f=o(f=n(f,g),31),l=t(l=o(l=i(l,f=n(f,m)),27),d),l=t(n(l,[0,5]),[0,1390208809]),h=o(h=n(h,m),33),d=t(d=o(d=i(d,h=n(h,g)),31),l),d=t(n(d,[0,5]),[0,944331445]);switch(f=[0,0],h=[0,0],s){case 15:h=i(h,r([0,e.charCodeAt(p+14)],48));case 14:h=i(h,r([0,e.charCodeAt(p+13)],40));case 13:h=i(h,r([0,e.charCodeAt(p+12)],32));case 12:h=i(h,r([0,e.charCodeAt(p+11)],24));case 11:h=i(h,r([0,e.charCodeAt(p+10)],16));case 10:h=i(h,r([0,e.charCodeAt(p+9)],8));case 9:h=n(h=i(h,[0,e.charCodeAt(p+8)]),m),d=i(d,h=n(h=o(h,33),g));case 8:f=i(f,r([0,e.charCodeAt(p+7)],56));case 7:f=i(f,r([0,e.charCodeAt(p+6)],48));case 6:f=i(f,r([0,e.charCodeAt(p+5)],40));case 5:f=i(f,r([0,e.charCodeAt(p+4)],32));case 4:f=i(f,r([0,e.charCodeAt(p+3)],24));case 3:f=i(f,r([0,e.charCodeAt(p+2)],16));case 2:f=i(f,r([0,e.charCodeAt(p+1)],8));case 1:f=n(f=i(f,[0,e.charCodeAt(p)]),g),l=i(l,f=n(f=o(f,31),m))}return l=t(l=i(l,[0,e.length]),d=i(d,[0,e.length])),d=t(d,l),l=t(l=a(l),d=a(d)),d=t(d,l),("00000000"+(l[0]>>>0).toString(16)).slice(-8)+("00000000"+(l[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}function s(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(t){i(t)}}function c(e){try{s(o.throw(e))}catch(t){i(t)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,c)}s((o=o.apply(e,t||[])).next())}))}function u(e){return"number"==typeof e?0|e:parseInt(e)}function l(e){return e.reduce(((e,t)=>e+(t?1:0)),0)}const d=navigator,f=window;const h=document,g=["monospace","sans-serif","serif"],m=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],p={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal"};function v(e){return e.toDataURL()}const y=navigator,C=window;const S=navigator;const w=window;const A=window;const b=window;const M=window,T=navigator,x=document;function O(){return l(["msWriteProfilerMark"in M,"msLaunchUri"in T,"msSaveBlob"in T])>=2}const k=document;const P={osCpu:function(){return navigator.oscpu},languages:function(){const e=[],t=S.language||S.userLanguage||S.browserLanguage||S.systemLanguage;if(void 0!==t&&e.push([t]),Array.isArray(S.languages))e.push(S.languages);else if("string"==typeof S.languages){const t=S.languages;t&&e.push(t.split(","))}return e},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){const e=[u(w.screen.width),u(w.screen.height)];return e.sort().reverse(),e},availableScreenResolution:function(){if(A.screen.availWidth&&A.screen.availHeight){const e=[u(A.screen.availWidth),u(A.screen.availHeight)];return e.sort().reverse(),e}},hardwareConcurrency:function(){try{const e=u(navigator.hardwareConcurrency);return isNaN(e)?1:e}catch(e){return 1}},timezoneOffset:function(){return(new Date).getTimezoneOffset()},timezone:function(){var e;if(null===(e=b.Intl)||void 0===e?void 0:e.DateTimeFormat)return(new b.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!O())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(!navigator.plugins)return;const e=[];for(const t of navigator.plugins){if(!t)continue;const n=[];for(const e of t)n.push({type:e.type,suffixes:e.suffixes});e.push({name:t.name,description:t.description,mimeTypes:n})}return e},canvas:function(){const[e,t]=function(){const e=document.createElement("canvas");return e.width=240,e.height=140,e.style.display="inline",[e,e.getContext("2d")]}();if(!function(e,t){return!(!t||!e.toDataURL)}(e,t))return{winding:!1,data:""};t.rect(0,0,10,10),t.rect(2,2,6,6);const n=!t.isPointInPath(5,5,"evenodd");t.textBaseline="alphabetic",t.fillStyle="#f60",t.fillRect(125,1,62,20),t.fillStyle="#069",t.font="11pt no-real-font-123";const o="Cwm fjordbank 😃 gly";return t.fillText(o,2,15),t.fillStyle="rgba(102, 204, 0, 0.2)",t.font="18pt Arial",t.fillText(o,4,45),t.globalCompositeOperation="multiply",t.fillStyle="rgb(255,0,255)",t.beginPath(),t.arc(50,50,50,0,2*Math.PI,!0),t.closePath(),t.fill(),t.fillStyle="rgb(0,255,255)",t.beginPath(),t.arc(100,50,50,0,2*Math.PI,!0),t.closePath(),t.fill(),t.fillStyle="rgb(255,255,0)",t.beginPath(),t.arc(75,100,50,0,2*Math.PI,!0),t.closePath(),t.fill(),t.fillStyle="rgb(255,0,255)",t.arc(75,75,75,0,2*Math.PI,!0),t.arc(75,75,25,0,2*Math.PI,!0),t.fill("evenodd"),{winding:n,data:v(e)}},touchSupport:function(){let e,t=0;void 0!==y.maxTouchPoints?t=u(y.maxTouchPoints):void 0!==y.msMaxTouchPoints&&(t=y.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(n){e=!1}return{maxTouchPoints:t,touchEvent:e,touchStart:"ontouchstart"in C}},fonts:function(){const e=h.body,t=h.createElement("div"),n=h.createElement("div"),o={},r={},i=()=>{const e=h.createElement("span");return Object.assign(e.style,p,{position:"absolute",left:"-9999px",fontSize:"48px"}),e.textContent="mmMwWLliI0O&1",e},a=(e,t)=>{const n=i();return n.style.fontFamily=`'${e}',${t}`,n},c=e=>g.some(((t,n)=>e[n].offsetWidth!==o[t]||e[n].offsetHeight!==r[t])),s=g.map((e=>{const n=i();return n.style.fontFamily=e,t.appendChild(n),n}));e.appendChild(t);for(let d=0,f=g.length;d<f;d++)o[g[d]]=s[d].offsetWidth,r[g[d]]=s[d].offsetHeight;const u=(()=>{const e={};for(const t of m)e[t]=g.map((e=>{const o=a(t,e);return n.appendChild(o),o}));return e})();e.appendChild(n);const l=[];for(let d=0,f=m.length;d<f;d++)c(u[m[d]])&&l.push(m[d]);return e.removeChild(n),e.removeChild(t),l},audio:function(){return s(this,void 0,void 0,(function*(){if(d.userAgent.match(/OS 11.+Version\/11.+Safari/))return-1;const e=f.OfflineAudioContext||f.webkitOfflineAudioContext;if(!e)return-2;const t=new e(1,44100,44100),n=t.createOscillator();n.type="triangle",n.frequency.setValueAtTime(1e4,t.currentTime);const o=t.createDynamicsCompressor();for(const[r,i]of[["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]])"function"==typeof o[r].setValueAtTime&&o[r].setValueAtTime(i,t.currentTime);return n.connect(o),o.connect(t.destination),n.start(0),t.startRendering(),new Promise((e=>{const r=setTimeout((()=>{t.oncomplete=()=>{},e(-3)}),1e3);t.oncomplete=t=>{let i;try{clearTimeout(r),i=t.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(((e,t)=>e+Math.abs(t)),0),n.disconnect(),o.disconnect()}catch(a){return void e(-4)}e(i)}}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(e){try{return e.toSource(),!0}catch(t){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{k.cookie="cookietest=1";const e=-1!==k.cookie.indexOf("cookietest=");return k.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(e){return!1}}};function I(e,t,n){return s(this,void 0,void 0,(function*(){let o=Date.now();const r={};for(const a of Object.keys(e)){if(function(e,t){for(let n=0,o=e.length;n<o;++n)if(e[n]===t)return!0;return!1}(n,a))continue;let c,s;try{c={value:yield e[a](t)}}catch(i){c={error:"message"in i?i:{message:i}}}s=Date.now(),r[a]=Object.assign(Object.assign({},c),{duration:s-o}),o=s}return r}))}function B(e){let t="";for(const n of Object.keys(e)){const o=e[n],r=o.error?"error":JSON.stringify(o.value);t+=`${t?"|":""}${n.replace(/([:|\\])/g,"\\$1")}:${r}`}return t}function D(e){return JSON.stringify(e,((e,t)=>{var n;return t instanceof Error?Object.assign(Object.assign({},t),{message:t.message,stack:null===(n=t.stack)||void 0===n?void 0:n.split("\n")}):t}),2)}class E{get(e={}){return s(this,void 0,void 0,(function*(){const t=yield I(P,void 0,[]),n=function(e){let t;return{components:e,get visitorId(){return void 0===t&&(t=c(B(this.components))),t},set visitorId(e){t=e}}}(t);return e.debug&&console.log(`Copy the text below to get the debug data:\n\n\`\`\`\nversion: 3.0.0-beta.2\ngetOptions: ${JSON.stringify(e,void 0,2)}\nvisitorId: ${n.visitorId}\ncomponents: ${D(t)}\n\`\`\``),n}))}}const L=c,R=c;e.componentsToCanonicalString=B,e.componentsToDebugString=D,e.getComponents=I,e.getHash=L,e.isChromium=function(){return l(["userActivation"in T,"mediaSession"in T,0===T.vendor.indexOf("Google"),"BackgroundFetchManager"in M,"BatteryManager"in M,"webkitMediaStream"in M,"webkitSpeechGrammar"in M])>=5},e.isDesktopSafari=function(){return"safari"in M},e.isGecko=function(){var e;return l(["buildID"in T,(null===(e=x.documentElement)||void 0===e?void 0:e.style)&&"MozAppearance"in x.documentElement.style,"MediaRecorderErrorEvent"in M,"mozInnerScreenX"in M,"CSSMozDocumentRule"in M,"CanvasCaptureMediaStream"in M])>=4},e.isIEOrOldEdge=O,e.load=function({delayFallback:e=50}={}){return s(this,void 0,void 0,(function*(){var t;return yield(t=e,new Promise((e=>{window.requestIdleCallback?window.requestIdleCallback((()=>e())):setTimeout(e,t)}))),new E}))},e.murmurX64Hash128=R,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FingerprintJS={})}(this,(function(e){"use strict";function t(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function o(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function r(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function i(e,t){return[e[0]^t[0],e[1]^t[1]]}function a(e){return e=i(e,[0,e[0]>>>1]),e=i(e=n(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=i(e=n(e,[3301882366,444984403]),[0,e[0]>>>1])}function c(e,c){c=c||0;for(var s=(e=e||"").length%16,u=e.length-s,l=[0,c],d=[0,c],f=[0,0],h=[0,0],g=[2277735313,289559509],m=[1291169091,658871167],p=0;p<u;p+=16)f=[255&e.charCodeAt(p+4)|(255&e.charCodeAt(p+5))<<8|(255&e.charCodeAt(p+6))<<16|(255&e.charCodeAt(p+7))<<24,255&e.charCodeAt(p)|(255&e.charCodeAt(p+1))<<8|(255&e.charCodeAt(p+2))<<16|(255&e.charCodeAt(p+3))<<24],h=[255&e.charCodeAt(p+12)|(255&e.charCodeAt(p+13))<<8|(255&e.charCodeAt(p+14))<<16|(255&e.charCodeAt(p+15))<<24,255&e.charCodeAt(p+8)|(255&e.charCodeAt(p+9))<<8|(255&e.charCodeAt(p+10))<<16|(255&e.charCodeAt(p+11))<<24],f=o(f=n(f,g),31),l=t(l=o(l=i(l,f=n(f,m)),27),d),l=t(n(l,[0,5]),[0,1390208809]),h=o(h=n(h,m),33),d=t(d=o(d=i(d,h=n(h,g)),31),l),d=t(n(d,[0,5]),[0,944331445]);switch(f=[0,0],h=[0,0],s){case 15:h=i(h,r([0,e.charCodeAt(p+14)],48));case 14:h=i(h,r([0,e.charCodeAt(p+13)],40));case 13:h=i(h,r([0,e.charCodeAt(p+12)],32));case 12:h=i(h,r([0,e.charCodeAt(p+11)],24));case 11:h=i(h,r([0,e.charCodeAt(p+10)],16));case 10:h=i(h,r([0,e.charCodeAt(p+9)],8));case 9:h=n(h=i(h,[0,e.charCodeAt(p+8)]),m),d=i(d,h=n(h=o(h,33),g));case 8:f=i(f,r([0,e.charCodeAt(p+7)],56));case 7:f=i(f,r([0,e.charCodeAt(p+6)],48));case 6:f=i(f,r([0,e.charCodeAt(p+5)],40));case 5:f=i(f,r([0,e.charCodeAt(p+4)],32));case 4:f=i(f,r([0,e.charCodeAt(p+3)],24));case 3:f=i(f,r([0,e.charCodeAt(p+2)],16));case 2:f=i(f,r([0,e.charCodeAt(p+1)],8));case 1:f=n(f=i(f,[0,e.charCodeAt(p)]),g),l=i(l,f=n(f=o(f,31),m))}return l=t(l=i(l,[0,e.length]),d=i(d,[0,e.length])),d=t(d,l),l=t(l=a(l),d=a(d)),d=t(d,l),("00000000"+(l[0]>>>0).toString(16)).slice(-8)+("00000000"+(l[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}function s(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(t){i(t)}}function c(e){try{s(o.throw(e))}catch(t){i(t)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,c)}s((o=o.apply(e,t||[])).next())}))}function u(e){return"number"==typeof e?0|e:parseInt(e)}function l(e){return e.reduce(((e,t)=>e+(t?1:0)),0)}const d=navigator,f=window;const h=document,g=["monospace","sans-serif","serif"],m=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],p={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal"};function v(e){return e.toDataURL()}const y=navigator,C=window;const S=window,w=navigator,A=document;function b(){return l(["msWriteProfilerMark"in S,"msLaunchUri"in w,"msSaveBlob"in w])>=2}function M(){return l(["userActivation"in w,"mediaSession"in w,0===w.vendor.indexOf("Google"),"BackgroundFetchManager"in S,"BatteryManager"in S,"webkitMediaStream"in S,"webkitSpeechGrammar"in S])>=5}const T=navigator;const x=window;const O=window;const k=window;const P=document;const I={osCpu:function(){return navigator.oscpu},languages:function(){const e=[],t=T.language||T.userLanguage||T.browserLanguage||T.systemLanguage;if(void 0!==t&&e.push([t]),Array.isArray(T.languages))M()&&l([!("MediaSettingsRange"in S),!("PhotoCapabilities"in S),"RTCEncodedAudioFrame"in S,""+S.Intl=="[object Intl]"])>=2||e.push(T.languages);else if("string"==typeof T.languages){const t=T.languages;t&&e.push(t.split(","))}return e},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){const e=[u(x.screen.width),u(x.screen.height)];return e.sort().reverse(),e},availableScreenResolution:function(){if(O.screen.availWidth&&O.screen.availHeight){const e=[u(O.screen.availWidth),u(O.screen.availHeight)];return e.sort().reverse(),e}},hardwareConcurrency:function(){try{const e=u(navigator.hardwareConcurrency);return isNaN(e)?1:e}catch(e){return 1}},timezoneOffset:function(){return(new Date).getTimezoneOffset()},timezone:function(){var e;if(null===(e=k.Intl)||void 0===e?void 0:e.DateTimeFormat)return(new k.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!b())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(!navigator.plugins)return;const e=[];for(let t=0;t<navigator.plugins.length;++t){const n=navigator.plugins[t];if(!n)continue;const o=[];for(const e of n)o.push({type:e.type,suffixes:e.suffixes});e.push({name:n.name,description:n.description,mimeTypes:o})}return e},canvas:function(){const[e,t]=function(){const e=document.createElement("canvas");return e.width=240,e.height=140,e.style.display="inline",[e,e.getContext("2d")]}();if(!function(e,t){return!(!t||!e.toDataURL)}(e,t))return{winding:!1,data:""};t.rect(0,0,10,10),t.rect(2,2,6,6);const n=!t.isPointInPath(5,5,"evenodd");t.textBaseline="alphabetic",t.fillStyle="#f60",t.fillRect(125,1,62,20),t.fillStyle="#069",t.font="11pt no-real-font-123";const o="Cwm fjordbank 😃 gly";return t.fillText(o,2,15),t.fillStyle="rgba(102, 204, 0, 0.2)",t.font="18pt Arial",t.fillText(o,4,45),t.globalCompositeOperation="multiply",t.fillStyle="rgb(255,0,255)",t.beginPath(),t.arc(50,50,50,0,2*Math.PI,!0),t.closePath(),t.fill(),t.fillStyle="rgb(0,255,255)",t.beginPath(),t.arc(100,50,50,0,2*Math.PI,!0),t.closePath(),t.fill(),t.fillStyle="rgb(255,255,0)",t.beginPath(),t.arc(75,100,50,0,2*Math.PI,!0),t.closePath(),t.fill(),t.fillStyle="rgb(255,0,255)",t.arc(75,75,75,0,2*Math.PI,!0),t.arc(75,75,25,0,2*Math.PI,!0),t.fill("evenodd"),{winding:n,data:v(e)}},touchSupport:function(){let e,t=0;void 0!==y.maxTouchPoints?t=u(y.maxTouchPoints):void 0!==y.msMaxTouchPoints&&(t=y.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(n){e=!1}return{maxTouchPoints:t,touchEvent:e,touchStart:"ontouchstart"in C}},fonts:function(){const e=h.body,t=h.createElement("div"),n=h.createElement("div"),o={},r={},i=()=>{const e=h.createElement("span");return Object.assign(e.style,p,{position:"absolute",left:"-9999px",fontSize:"48px"}),e.textContent="mmMwWLliI0O&1",e},a=(e,t)=>{const n=i();return n.style.fontFamily=`'${e}',${t}`,n},c=e=>g.some(((t,n)=>e[n].offsetWidth!==o[t]||e[n].offsetHeight!==r[t])),s=g.map((e=>{const n=i();return n.style.fontFamily=e,t.appendChild(n),n}));e.appendChild(t);for(let d=0,f=g.length;d<f;d++)o[g[d]]=s[d].offsetWidth,r[g[d]]=s[d].offsetHeight;const u=(()=>{const e={};for(const t of m)e[t]=g.map((e=>{const o=a(t,e);return n.appendChild(o),o}));return e})();e.appendChild(n);const l=[];for(let d=0,f=m.length;d<f;d++)c(u[m[d]])&&l.push(m[d]);return e.removeChild(n),e.removeChild(t),l},audio:function(){return s(this,void 0,void 0,(function*(){if(d.userAgent.match(/OS 11.+Version\/11.+Safari/))return-1;const e=f.OfflineAudioContext||f.webkitOfflineAudioContext;if(!e)return-2;const t=new e(1,44100,44100),n=t.createOscillator();n.type="triangle",n.frequency.setValueAtTime(1e4,t.currentTime);const o=t.createDynamicsCompressor();for(const[r,i]of[["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]])"function"==typeof o[r].setValueAtTime&&o[r].setValueAtTime(i,t.currentTime);return n.connect(o),o.connect(t.destination),n.start(0),t.startRendering(),new Promise((e=>{const r=setTimeout((()=>{t.oncomplete=()=>{},e(-3)}),1e3);t.oncomplete=t=>{let i;try{clearTimeout(r),i=t.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(((e,t)=>e+Math.abs(t)),0),n.disconnect(),o.disconnect()}catch(a){return void e(-4)}e(i)}}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(e){try{return e.toSource(),!0}catch(t){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{P.cookie="cookietest=1";const e=-1!==P.cookie.indexOf("cookietest=");return P.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(e){return!1}}};function B(e,t,n){return s(this,void 0,void 0,(function*(){let o=Date.now();const r={};for(const a of Object.keys(e)){if(function(e,t){for(let n=0,o=e.length;n<o;++n)if(e[n]===t)return!0;return!1}(n,a))continue;let c,s;try{c={value:yield e[a](t)}}catch(i){c=i&&"object"==typeof i&&"message"in i?{error:i}:{error:{message:i}}}s=Date.now(),r[a]=Object.assign(Object.assign({},c),{duration:s-o}),o=s}return r}))}function E(e){let t="";for(const n of Object.keys(e)){const o=e[n],r=o.error?"error":JSON.stringify(o.value);t+=`${t?"|":""}${n.replace(/([:|\\])/g,"\\$1")}:${r}`}return t}function D(e){return JSON.stringify(e,((e,t)=>{var n;return t instanceof Error?Object.assign(Object.assign({},t),{message:t.message,stack:null===(n=t.stack)||void 0===n?void 0:n.split("\n")}):t}),2)}class R{get(e={}){return s(this,void 0,void 0,(function*(){const t=yield B(I,void 0,[]),n=function(e){let t;return{components:e,get visitorId(){return void 0===t&&(t=c(E(this.components))),t},set visitorId(e){t=e}}}(t);return e.debug&&console.log(`Copy the text below to get the debug data:\n\n\`\`\`\nversion: 3.0.0-beta.3\ngetOptions: ${JSON.stringify(e,void 0,2)}\nvisitorId: ${n.visitorId}\ncomponents: ${D(t)}\n\`\`\``),n}))}}const L=c,F=c;e.componentsToCanonicalString=E,e.componentsToDebugString=D,e.getComponents=B,e.getHash=L,e.isChromium=M,e.isDesktopSafari=function(){return"safari"in S},e.isGecko=function(){var e;return l(["buildID"in w,(null===(e=A.documentElement)||void 0===e?void 0:e.style)&&"MozAppearance"in A.documentElement.style,"MediaRecorderErrorEvent"in S,"mozInnerScreenX"in S,"CSSMozDocumentRule"in S,"CanvasCaptureMediaStream"in S])>=4},e.isIEOrOldEdge=b,e.load=function({delayFallback:e=50}={}){return s(this,void 0,void 0,(function*(){var t;return yield(t=e,new Promise((e=>{window.requestIdleCallback?window.requestIdleCallback((()=>e())):setTimeout(e,t)}))),new R}))},e.murmurX64Hash128=F,Object.defineProperty(e,"__esModule",{value:!0})})); |
{ | ||
"name": "@fingerprintjs/fingerprintjs", | ||
"version": "3.0.0-beta.2", | ||
"version": "3.0.0-beta.3", | ||
"license": "MIT", | ||
@@ -13,3 +13,8 @@ "main": "dist/fp.cjs.js", | ||
"scripts": { | ||
"build": "rimraf dist && rollup -c" | ||
"build": "rimraf dist && rollup -c", | ||
"build:watch": "yarn build --watch", | ||
"playground:start": "cd playground && webpack-dev-server --mode development", | ||
"playground:build": "cd playground && webpack --mode production", | ||
"test:local": "karma start tests/karma.local.config.js --single-run", | ||
"test:browserstack": "karma start tests/karma.browserstack.config.js --single-run" | ||
}, | ||
@@ -23,2 +28,14 @@ "dependencies": { | ||
"@rollup/plugin-typescript": "^6.0.0", | ||
"@types/jasmine": "^3.5.14", | ||
"@types/ua-parser-js": "^0.7.33", | ||
"clean-webpack-plugin": "^3.0.0", | ||
"html-webpack-plugin": "^4.5.0", | ||
"karma": "^5.2.3", | ||
"karma-browserstack-launcher": "^1.6.0", | ||
"karma-chrome-launcher": "^3.1.0", | ||
"karma-firefox-launcher": "^1.3.0", | ||
"karma-jasmine": "^4.0.1", | ||
"karma-spec-reporter": "^0.0.32", | ||
"karma-summary-reporter": "^1.9.0", | ||
"karma-typescript": "^5.2.0", | ||
"rimraf": "^3.0.2", | ||
@@ -29,4 +46,10 @@ "rollup": "^2.28.2", | ||
"rollup-plugin-terser": "^7.0.2", | ||
"typescript": "^4.0.3" | ||
"terser-webpack-plugin": "^4.2.2", | ||
"ts-loader": "^8.0.4", | ||
"typescript": "^4.0.3", | ||
"ua-parser-js": "^0.7.22", | ||
"webpack": "^4.44.2", | ||
"webpack-cli": "^3.3.12", | ||
"webpack-dev-server": "^3.11.0" | ||
} | ||
} |
@@ -7,2 +7,21 @@ # FingerprintJS | ||
### In browser | ||
```html | ||
<script> | ||
function onFingerprintJSLoad(fp) { | ||
fp.get().then(({ visitorId }) => console.log(visitorId)); | ||
} | ||
</script> | ||
<script | ||
async src="https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs@3.0.0-beta.2/dist/fp.min.js" | ||
onload="FingerprintJS.load().then(onFingerprintJSLoad)" | ||
></script> | ||
``` | ||
A simple way to start but not recommended because AdBlock and similar browser extensions often block this URL. | ||
You should at least upload the script to your server. | ||
### Webpack/Rollup/Browserify | ||
```bash | ||
@@ -18,2 +37,3 @@ npm i @fingerprintjs/fingerprintjs | ||
const { visitorId } = await fpjs.get(); | ||
console.log(visitorId); | ||
})(); | ||
@@ -32,3 +52,3 @@ ``` | ||
### How to build | ||
### Development playground | ||
@@ -38,12 +58,61 @@ ```bash | ||
yarn install | ||
yarn playground:start # Add '--port 8765' to change the server port | ||
``` | ||
Then open http://localhost:8080 in a browser. | ||
It's reloaded every time the source code is changed. | ||
To build the playground distribution code (e.g. to upload to a static server), run: | ||
```bash | ||
yarn playground:build | ||
``` | ||
The result will appear at `playground/dist`. | ||
### How to build | ||
To build the distribution files of the library, run: | ||
```bash | ||
yarn build | ||
``` | ||
The files will appear at `dist`. | ||
### How to test | ||
There are automatic tests. | ||
They are run by [Jasmine](https://jasmine.github.io) in real browsers using [Karma](https://karma-runner.github.io). | ||
To run the tests in a browser on your machine, build the project and run: | ||
```bash | ||
yarn test:local --browsers ChromeHeadless | ||
# or to run in Firefox | ||
yarn test:local --browsers FirefoxHeadless | ||
# or to run in both | ||
yarn test:local | ||
``` | ||
To run the tests in browsers on [BrowserStack](https://www.browserstack.com), get a BrowserStack access key and run: | ||
```bash | ||
# For Linux, macOS and WSL (Linux on Windows) | ||
BROWSERSTACK_USERNAME=your-username BROWSERSTACK_ACCESS_KEY=your-key yarn test:browserstack | ||
``` | ||
Or make a PR to this repository, the test will run in BrowserStack automatically. | ||
BrowserStack sessions are unstable, so a session can fail for no reason; | ||
restart the testing when you see no clear errors related to the tests. | ||
Unit test files are located right next to individual module files that they check. | ||
Integration tests are located in the `tests` directory. | ||
### How to publish | ||
1. Bump the version. Changing the number in [package.json](package.json) is enough. | ||
2. Build the project. | ||
3. Run | ||
2. Build and test the project. | ||
3. See what's will get into the NPM package, make sure it contains the distributive files and no excess files. | ||
To see, run `yarn pack`, an archive will appear nearby, open it with any archive browser. | ||
4. Run | ||
```bash | ||
yarn publish --access public # Add '--tag beta' (without the quotes) if you release a beta version | ||
``` |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
193025
0
100
4576
115
27
9