@snap/camera-kit
Version:
Camera Kit Web
156 lines • 5.36 kB
JavaScript
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 getPlatformInfo() {
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