@mui/x-telemetry
Version:
MUI X Telemetry.
93 lines (91 loc) • 3.79 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _interopRequireWildcard2 = _interopRequireDefault(require("@babel/runtime/helpers/interopRequireWildcard"));
var _context = _interopRequireDefault(require("../context"));
var _windowStorage = require("./window-storage");
function generateId(length) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
let counter = 0;
while (counter < length) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}
function pick(obj, keys) {
return keys.reduce((acc, key) => {
acc[key] = obj[key];
return acc;
}, {});
}
const getBrowserFingerprint = typeof window === 'undefined' || process.env.NODE_ENV === 'test' ? () => undefined : async () => {
const fingerprintLCKey = 'fingerprint';
try {
const existingFingerprint = (0, _windowStorage.getWindowStorageItem)('localStorage', fingerprintLCKey);
if (existingFingerprint) {
return JSON.parse(existingFingerprint);
}
const FingerprintJS = await Promise.resolve().then(() => (0, _interopRequireWildcard2.default)(require('@fingerprintjs/fingerprintjs')));
const fp = await FingerprintJS.load({
monitoring: false
});
const fpResult = await fp.get();
const components = (0, _extends2.default)({}, fpResult.components);
delete components.cookiesEnabled;
const fullHash = FingerprintJS.hashComponents(components);
const coreHash = FingerprintJS.hashComponents((0, _extends2.default)({}, pick(components, ['fonts', 'audio', 'languages', 'deviceMemory', 'timezone', 'sessionStorage', 'localStorage', 'indexedDB', 'openDatabase', 'platform', 'canvas', 'vendor', 'vendorFlavors', 'colorGamut', 'forcedColors', 'monochrome', 'contrast', 'reducedMotion', 'math', 'videoCard', 'architecture'])));
const result = {
fullHash,
coreHash
};
(0, _windowStorage.setWindowStorageItem)('localStorage', fingerprintLCKey, JSON.stringify(result));
return result;
} catch (_) {
return null;
}
};
function getAnonymousId() {
const localStorageKey = 'anonymous_id';
const existingAnonymousId = (0, _windowStorage.getWindowStorageItem)('localStorage', localStorageKey);
if (existingAnonymousId) {
return existingAnonymousId;
}
const generated = `anid_${generateId(32)}`;
if ((0, _windowStorage.setWindowStorageItem)('localStorage', localStorageKey, generated)) {
return generated;
}
return '';
}
function getSessionId() {
const localStorageKey = 'session_id';
const existingSessionId = (0, _windowStorage.getWindowStorageItem)('sessionStorage', localStorageKey);
if (existingSessionId) {
return existingSessionId;
}
const generated = `sesid_${generateId(32)}`;
if ((0, _windowStorage.setWindowStorageItem)('sessionStorage', localStorageKey, generated)) {
return generated;
}
return `sestp_${generateId(32)}`;
}
async function getTelemetryContext() {
_context.default.traits.sessionId = getSessionId();
// Initialize the context if it hasn't been initialized yet
// (e.g. postinstall not run)
if (!_context.default.config.isInitialized) {
_context.default.traits.anonymousId = getAnonymousId();
_context.default.config.isInitialized = true;
}
if (!_context.default.traits.fingerprint) {
_context.default.traits.fingerprint = await getBrowserFingerprint();
}
return _context.default;
}
var _default = exports.default = getTelemetryContext;