UNPKG

woothee

Version:

User-Agent string parser (js implementation)

203 lines (150 loc) 5 kB
/* HEADER BEGIN */ var dataset = require('./dataset') , browser = require('./browser') , os = require('./os') , mobilephone = require('./mobilephone') , crawler = require('./crawler') , appliance = require('./appliance') , misc = require('./misc') , package_info = require('./../package.json'); /* HEADER END */ var version = exports.VERSION = package_info.version; var parse = exports.parse = function(userAgent) { return fillResult(execParse(userAgent)); }; var isCrawler = exports.isCrawler = function(userAgent) { return !!userAgent && userAgent !== '-' && tryCrawler(userAgent, {}); }; function execParse(userAgent) { var result = {}; if (! userAgent || userAgent === '-') return result; if (tryCrawler(userAgent, result)) return result; if (tryBrowser(userAgent, result)) { if (tryOS(userAgent, result)) return result; else return result; } if (tryMobilePhone(userAgent, result)) return result; if (tryAppliance(userAgent, result)) return result; if (tryMisc(userAgent, result)) return result; // browser unknown, check os only if (tryOS(userAgent, result)) return result; if (tryRareCases(userAgent, result)) return result; return result; }; function tryCrawler(userAgent, result) { if (crawler.challengeGoogle(userAgent, result)) return true; if (crawler.challengeCrawlers(userAgent, result)) return true; return false; } function tryBrowser(userAgent, result) { if (browser.challengeMSIE(userAgent, result)) return true; if (browser.challengeVivaldi(userAgent, result)) return true; if (browser.challengeYandexBrowser(userAgent, result)) return true; if (browser.challengeSafariChrome(userAgent, result)) return true; if (browser.challengeFirefox(userAgent, result)) return true; if (browser.challengeOpera(userAgent, result)) return true; if (browser.challengeWebview(userAgent, result)) return true; return false; } function tryOS(userAgent, result) { if (os.challengeWindows(userAgent, result)) return true; // OSX PC and iOS devices (strict check) if (os.challengeOSX(userAgent, result)) return true; // Linux PC and Android if (os.challengeLinux(userAgent, result)) return true; // all useragents matches /(iPhone|iPad|iPod|Android|BlackBerry)/ if (os.challengeSmartPhone(userAgent, result)) return true; // mobile phones like KDDI-.* if (os.challengeMobilePhone(userAgent, result)) return true; // Nintendo DSi/Wii with Opera if (os.challengeAppliance(userAgent, result)) return true; if (os.challengeMisc(userAgent, result)) return true; return false; } function tryMobilePhone(userAgent, result) { if (mobilephone.challengeDocomo(userAgent, result)) return true; if (mobilephone.challengeAu(userAgent, result)) return true; if (mobilephone.challengeSoftbank(userAgent, result)) return true; if (mobilephone.challengeWillcom(userAgent, result)) return true; if (mobilephone.challengeMisc(userAgent, result)) return true; return false; } function tryAppliance(userAgent, result) { if (appliance.challengePlaystation(userAgent, result)) return true; if (appliance.challengeNintendo(userAgent, result)) return true; if (appliance.challengeDigitalTV(userAgent, result)) return true; return false; } function tryMisc(userAgent, result) { if (misc.challengeDesktopTools(userAgent, result)) return true; return false; } function tryRareCases(userAgent, result) { if (misc.challengeSmartPhonePatterns(userAgent, result)) return true; if (browser.challengeSleipnir(userAgent, result)) return true; if (misc.challengeHTTPLibrary(userAgent, result)) return true; if (misc.challengeMaybeRSSReader(userAgent, result)) return true; if (crawler.challengeMaybeCrawler(userAgent, result)) return true; return false; } var filled = {}; filled[dataset.ATTRIBUTE_NAME] = dataset.VALUE_UNKNOWN; filled[dataset.ATTRIBUTE_CATEGORY] = dataset.VALUE_UNKNOWN; filled[dataset.ATTRIBUTE_OS] = dataset.VALUE_UNKNOWN; filled[dataset.ATTRIBUTE_OS_VERSION] = dataset.VALUE_UNKNOWN; filled[dataset.ATTRIBUTE_VERSION] = dataset.VALUE_UNKNOWN; filled[dataset.ATTRIBUTE_VENDOR] = dataset.VALUE_UNKNOWN; function fillResult(result) { if (! result[dataset.ATTRIBUTE_NAME]) result[dataset.ATTRIBUTE_NAME] = dataset.VALUE_UNKNOWN; if (! result[dataset.ATTRIBUTE_CATEGORY]) result[dataset.ATTRIBUTE_CATEGORY] = dataset.VALUE_UNKNOWN; if (! result[dataset.ATTRIBUTE_OS]) result[dataset.ATTRIBUTE_OS] = dataset.VALUE_UNKNOWN; if (! result[dataset.ATTRIBUTE_OS_VERSION]) result[dataset.ATTRIBUTE_OS_VERSION] = dataset.VALUE_UNKNOWN; if (! result[dataset.ATTRIBUTE_VERSION]) result[dataset.ATTRIBUTE_VERSION] = dataset.VALUE_UNKNOWN; if (! result[dataset.ATTRIBUTE_VENDOR]) result[dataset.ATTRIBUTE_VENDOR] = dataset.VALUE_UNKNOWN; return result; };