Re_Backend/src/utils/userAgentParser.ts

86 lines
2.2 KiB
TypeScript

/**
* Parse user agent string to extract device, browser, and OS information
* Simple parser without external dependencies
*/
export interface ParsedUserAgent {
deviceType: 'WEB' | 'MOBILE' | 'TABLET' | 'UNKNOWN';
browser: string;
os: string;
raw: string;
}
/**
* Parse user agent string to extract device, browser, and OS
*/
export function parseUserAgent(userAgent: string | null | undefined): ParsedUserAgent {
if (!userAgent) {
return {
deviceType: 'UNKNOWN',
browser: 'Unknown',
os: 'Unknown',
raw: ''
};
}
const ua = userAgent.toLowerCase();
// Detect device type
let deviceType: 'WEB' | 'MOBILE' | 'TABLET' | 'UNKNOWN' = 'WEB';
if (/tablet|ipad|playbook|silk/i.test(userAgent)) {
deviceType = 'TABLET';
} else if (/mobile|iphone|ipod|android|blackberry|opera|mini|windows\s+phone|palm|iemobile/i.test(userAgent)) {
deviceType = 'MOBILE';
}
// Detect browser
let browser = 'Unknown';
if (ua.includes('edg/')) {
browser = 'Edge';
} else if (ua.includes('chrome/') && !ua.includes('edg/')) {
browser = 'Chrome';
} else if (ua.includes('firefox/')) {
browser = 'Firefox';
} else if (ua.includes('safari/') && !ua.includes('chrome/')) {
browser = 'Safari';
} else if (ua.includes('opera/') || ua.includes('opr/')) {
browser = 'Opera';
} else if (ua.includes('msie') || ua.includes('trident/')) {
browser = 'Internet Explorer';
}
// Detect OS
let os = 'Unknown';
if (ua.includes('windows nt')) {
if (ua.includes('windows nt 10.0')) {
os = 'Windows 10/11';
} else if (ua.includes('windows nt 6.3')) {
os = 'Windows 8.1';
} else if (ua.includes('windows nt 6.2')) {
os = 'Windows 8';
} else if (ua.includes('windows nt 6.1')) {
os = 'Windows 7';
} else {
os = 'Windows';
}
} else if (ua.includes('mac os x') || ua.includes('macintosh')) {
os = 'macOS';
} else if (ua.includes('linux')) {
os = 'Linux';
} else if (ua.includes('android')) {
os = 'Android';
} else if (ua.includes('iphone') || ua.includes('ipad')) {
os = 'iOS';
} else if (ua.includes('ipod')) {
os = 'iOS';
}
return {
deviceType,
browser,
os,
raw: userAgent
};
}