86 lines
2.2 KiB
TypeScript
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
|
|
};
|
|
}
|
|
|