UNPKG

@snap/camera-kit

Version:
156 lines 5.36 kB
import { memoize } from "../common/memoize"; import { isRecord } from "../common/typeguards"; import environment from "../environment"; import lensCoreWasm from "../lensCoreWasmVersions"; function isNavigatorUAData(value) { return (isRecord(value) && Array.isArray(value["brands"]) && value["brands"].every((brand) => { return isRecord(brand) && typeof brand["brand"] === "string" && typeof brand["version"] === "string"; }) && typeof value["mobile"] === "boolean" && typeof value["platform"] === "string"); } function parseDeviceModel(userAgent) { const userAgentWithModel = userAgent.match(/;[^;]+?;([^\)]+?)\)/); if (userAgentWithModel) { return userAgentWithModel[1].trim(); } const userAgentWithModel2 = userAgent.match(/\(([^;]+);/); if (userAgentWithModel2) { return userAgentWithModel2[1].trim(); } return "unknown"; } function parseOrigin() { var _a, _b, _c; if (location.hostname !== "") return location.hostname; const possibleOrigins = location.ancestorOrigins === undefined && typeof window !== "undefined" ? [window.parent.origin, (_b = (_a = window.top) === null || _a === void 0 ? void 0 : _a.origin) !== null && _b !== void 0 ? _b : ""] : (_c = location.ancestorOrigins) !== null && _c !== void 0 ? _c : []; for (let origin of possibleOrigins) { try { origin = new URL(origin).hostname; if (origin) return origin; } catch (_) { } } return "unknown"; } function parseOSName(userAgent) { const knownPlatforms = new Map([ ["android", "android"], ["linux", "linux"], ["iphone os", "ios"], ["ipad", "ipados"], ["mac os", "macos"], ["macos", "macos"], ["windows", "windows"], ]); const normalizedUserAgent = userAgent.toLowerCase(); for (const [match, platform] of knownPlatforms.entries()) { if (normalizedUserAgent.includes(match)) return platform; } return "unknown"; } function parseOSVersion(userAgent) { const versionMatch = userAgent.match(/\s([\d][\d_.]*[\d])(;|\)|\s)/); if (versionMatch != null) { return versionMatch[1].replace(/_/g, "."); } return ""; } function parseUserAgentData(userAgent) { let brand; if (/Chrome/.test(userAgent)) { const versionMatch = userAgent.match(/Chrome\/([\d.]+)/); brand = { brand: "Chrome", version: versionMatch !== null ? versionMatch[1] : "unknown", }; } else if (/Safari/.test(userAgent)) { let versionMatch = userAgent.match(/Version\/([\d.]+)/); if (versionMatch === null) versionMatch = userAgent.match(/Safari\/([\d.]+)/); brand = { brand: "Safari", version: versionMatch !== null ? versionMatch[1] : "unknown", }; } else { brand = { brand: "Firefox", version: "0", }; } const mobile = false; const platform = parseOSName(userAgent); return { brands: [brand], mobile, platform, }; } function normalizeBrands(brands) { const knownBrands = new Map([ ["Google Chrome", "Chrome"], ["Chrome", "Chrome"], ["Chromium", "Chrome"], ["Firefox", "Firefox"], ["Microsoft Edge", "Chrome"], ["Safari", "Safari"], ]); const normalizedBrands = brands .filter(({ brand }) => knownBrands.has(brand)) .map((brand) => { return { brand: knownBrands.get(brand.brand), version: brand.version, }; }); if (normalizedBrands.length === 0) return [{ brand: "Firefox", version: "0" }]; return normalizedBrands; } function normalizeUserAgentData(userAgentData) { return { brands: normalizeBrands(userAgentData.brands), mobile: userAgentData.mobile, platform: parseOSName(userAgentData.platform), }; } export const getPlatformInfo = memoize(function getPlatformIno() { var _a, _b, _c; const userAgent = navigator.userAgent; const userAgentData = isNavigatorUAData(navigator.userAgentData) ? normalizeUserAgentData(navigator.userAgentData) : parseUserAgentData(userAgent); const osVersion = parseOSVersion(userAgent); const deviceModel = parseDeviceModel(userAgent); const sdkShortVersion = environment.PACKAGE_VERSION.replace(/[-+]\S+$/, ""); const locale = navigator.language; const fullLocale = ((_a = navigator.languages) !== null && _a !== void 0 ? _a : []) .map((lang, index) => { const qvalue = Math.max(0, (10 - index) / 10); return `${lang};q=${qvalue.toFixed(1)}`; }) .join(", ") || locale; return { sdkShortVersion, sdkLongVersion: environment.PACKAGE_VERSION, lensCore: lensCoreWasm, browser: userAgentData.brands[0], osName: userAgentData.platform, osVersion, deviceModel, locale, fullLocale, origin: parseOrigin(), connectionType: (_c = (_b = navigator.connection) === null || _b === void 0 ? void 0 : _b.type) !== null && _c !== void 0 ? _c : "unknown", }; }); //# sourceMappingURL=platformInfo.js.map