1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | function some(arr, callback) {
|
10 | var length = arr.length;
|
11 |
|
12 | for (var i = 0; i < length; ++i) {
|
13 | if (callback(arr[i], i)) {
|
14 | return true;
|
15 | }
|
16 | }
|
17 |
|
18 | return false;
|
19 | }
|
20 | function find(arr, callback) {
|
21 | var length = arr.length;
|
22 |
|
23 | for (var i = 0; i < length; ++i) {
|
24 | if (callback(arr[i], i)) {
|
25 | return arr[i];
|
26 | }
|
27 | }
|
28 |
|
29 | return null;
|
30 | }
|
31 | function getUserAgent(agent) {
|
32 | var userAgent = agent;
|
33 |
|
34 | if (typeof userAgent === "undefined") {
|
35 | if (typeof navigator === "undefined" || !navigator) {
|
36 | return "";
|
37 | }
|
38 |
|
39 | userAgent = navigator.userAgent || "";
|
40 | }
|
41 |
|
42 | return userAgent.toLowerCase();
|
43 | }
|
44 | function execRegExp(pattern, text) {
|
45 | try {
|
46 | return new RegExp(pattern, "g").exec(text);
|
47 | } catch (e) {
|
48 | return null;
|
49 | }
|
50 | }
|
51 | function hasUserAgentData() {
|
52 | if (typeof navigator === "undefined" || !navigator || !navigator.userAgentData) {
|
53 | return false;
|
54 | }
|
55 |
|
56 | var userAgentData = navigator.userAgentData;
|
57 | var brands = userAgentData.brands || userAgentData.uaList;
|
58 | return !!(brands && brands.length);
|
59 | }
|
60 | function findVersion(versionTest, userAgent) {
|
61 | var result = execRegExp("(" + versionTest + ")((?:\\/|\\s|:)([0-9|\\.|_]+))", userAgent);
|
62 | return result ? result[3] : "";
|
63 | }
|
64 | function convertVersion(text) {
|
65 | return text.replace(/_/g, ".");
|
66 | }
|
67 | function findPreset(presets, userAgent) {
|
68 | var userPreset = null;
|
69 | var version = "-1";
|
70 | some(presets, function (preset) {
|
71 | var result = execRegExp("(" + preset.test + ")((?:\\/|\\s|:)([0-9|\\.|_]+))?", userAgent);
|
72 |
|
73 | if (!result || preset.brand) {
|
74 | return false;
|
75 | }
|
76 |
|
77 | userPreset = preset;
|
78 | version = result[3] || "-1";
|
79 |
|
80 | if (preset.versionAlias) {
|
81 | version = preset.versionAlias;
|
82 | } else if (preset.versionTest) {
|
83 | version = findVersion(preset.versionTest.toLowerCase(), userAgent) || version;
|
84 | }
|
85 |
|
86 | version = convertVersion(version);
|
87 | return true;
|
88 | });
|
89 | return {
|
90 | preset: userPreset,
|
91 | version: version
|
92 | };
|
93 | }
|
94 | function findPresetBrand(presets, brands) {
|
95 | var brandInfo = {
|
96 | brand: "",
|
97 | version: "-1"
|
98 | };
|
99 | some(presets, function (preset) {
|
100 | var result = findBrand(brands, preset);
|
101 |
|
102 | if (!result) {
|
103 | return false;
|
104 | }
|
105 |
|
106 | brandInfo.brand = preset.id;
|
107 | brandInfo.version = preset.versionAlias || result.version;
|
108 | return brandInfo.version !== "-1";
|
109 | });
|
110 | return brandInfo;
|
111 | }
|
112 | function findBrand(brands, preset) {
|
113 | return find(brands, function (_a) {
|
114 | var brand = _a.brand;
|
115 | return execRegExp("" + preset.test, brand.toLowerCase());
|
116 | });
|
117 | }
|
118 |
|
119 | var BROWSER_PRESETS = [{
|
120 | test: "phantomjs",
|
121 | id: "phantomjs"
|
122 | }, {
|
123 | test: "whale",
|
124 | id: "whale"
|
125 | }, {
|
126 | test: "edgios|edge|edg",
|
127 | id: "edge"
|
128 | }, {
|
129 | test: "msie|trident|windows phone",
|
130 | id: "ie",
|
131 | versionTest: "iemobile|msie|rv"
|
132 | }, {
|
133 | test: "miuibrowser",
|
134 | id: "miui browser"
|
135 | }, {
|
136 | test: "samsungbrowser",
|
137 | id: "samsung internet"
|
138 | }, {
|
139 | test: "samsung",
|
140 | id: "samsung internet",
|
141 | versionTest: "version"
|
142 | }, {
|
143 | test: "chrome|crios",
|
144 | id: "chrome"
|
145 | }, {
|
146 | test: "firefox|fxios",
|
147 | id: "firefox"
|
148 | }, {
|
149 | test: "android",
|
150 | id: "android browser",
|
151 | versionTest: "version"
|
152 | }, {
|
153 | test: "safari|iphone|ipad|ipod",
|
154 | id: "safari",
|
155 | versionTest: "version"
|
156 | }];
|
157 |
|
158 | var CHROMIUM_PRESETS = [{
|
159 | test: "(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\schrome)",
|
160 | id: "chrome",
|
161 | versionTest: "chrome"
|
162 | }, {
|
163 | test: "chromium",
|
164 | id: "chrome"
|
165 | }, {
|
166 | test: "whale",
|
167 | id: "chrome",
|
168 | versionAlias: "-1",
|
169 | brand: true
|
170 | }];
|
171 | var WEBKIT_PRESETS = [{
|
172 | test: "applewebkit",
|
173 | id: "webkit",
|
174 | versionTest: "applewebkit|safari"
|
175 | }];
|
176 | var WEBVIEW_PRESETS = [{
|
177 | test: "(?=(iphone|ipad))(?!(.*version))",
|
178 | id: "webview"
|
179 | }, {
|
180 | test: "(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))",
|
181 | id: "webview"
|
182 | }, {
|
183 |
|
184 | test: "webview",
|
185 | id: "webview"
|
186 | }];
|
187 | var OS_PRESETS = [{
|
188 | test: "windows phone",
|
189 | id: "windows phone"
|
190 | }, {
|
191 | test: "windows 2000",
|
192 | id: "window",
|
193 | versionAlias: "5.0"
|
194 | }, {
|
195 | test: "windows nt",
|
196 | id: "window"
|
197 | }, {
|
198 | test: "iphone|ipad|ipod",
|
199 | id: "ios",
|
200 | versionTest: "iphone os|cpu os"
|
201 | }, {
|
202 | test: "mac os x",
|
203 | id: "mac"
|
204 | }, {
|
205 | test: "android",
|
206 | id: "android"
|
207 | }, {
|
208 | test: "tizen",
|
209 | id: "tizen"
|
210 | }, {
|
211 | test: "webos|web0s",
|
212 | id: "webos"
|
213 | }];
|
214 |
|
215 | function parseUserAgentData(osData) {
|
216 | var userAgentData = navigator.userAgentData;
|
217 | var brands = (userAgentData.uaList || userAgentData.brands).slice();
|
218 | var isMobile = userAgentData.mobile || false;
|
219 | var firstBrand = brands[0];
|
220 | var browser = {
|
221 | name: firstBrand.brand,
|
222 | version: firstBrand.version,
|
223 | majorVersion: -1,
|
224 | webkit: false,
|
225 | webkitVersion: "-1",
|
226 | chromium: false,
|
227 | chromiumVersion: "-1",
|
228 | webview: !!findPresetBrand(WEBVIEW_PRESETS, brands).brand
|
229 | };
|
230 | var os = {
|
231 | name: "unknown",
|
232 | version: "-1",
|
233 | majorVersion: -1
|
234 | };
|
235 | browser.webkit = !browser.chromium && some(WEBKIT_PRESETS, function (preset) {
|
236 | return findBrand(brands, preset);
|
237 | });
|
238 | var chromiumBrand = findPresetBrand(CHROMIUM_PRESETS, brands);
|
239 | browser.chromium = !!chromiumBrand.brand;
|
240 | browser.chromiumVersion = chromiumBrand.version;
|
241 |
|
242 | if (!browser.chromium) {
|
243 | var webkitBrand = findPresetBrand(WEBKIT_PRESETS, brands);
|
244 | browser.webkit = !!webkitBrand.brand;
|
245 | browser.webkitVersion = webkitBrand.version;
|
246 | }
|
247 |
|
248 | if (osData) {
|
249 | var platform_1 = osData.platform.toLowerCase();
|
250 | var result = find(OS_PRESETS, function (preset) {
|
251 | return new RegExp("" + preset.test, "g").exec(platform_1);
|
252 | });
|
253 | os.name = result ? result.id : platform_1;
|
254 | os.version = osData.platformVersion;
|
255 | }
|
256 |
|
257 | var browserBrand = findPresetBrand(BROWSER_PRESETS, brands);
|
258 |
|
259 | if (browserBrand.brand) {
|
260 | browser.name = browserBrand.brand;
|
261 | browser.version = osData ? osData.uaFullVersion : browserBrand.version;
|
262 | }
|
263 |
|
264 | if (navigator.platform === "Linux armv8l") {
|
265 | os.name = "android";
|
266 | } else if (browser.webkit) {
|
267 | os.name = isMobile ? "ios" : "mac";
|
268 | }
|
269 |
|
270 | if (os.name === "ios" && browser.webview) {
|
271 | browser.version = "-1";
|
272 | }
|
273 |
|
274 | os.version = convertVersion(os.version);
|
275 | browser.version = convertVersion(browser.version);
|
276 | os.majorVersion = parseInt(os.version, 10);
|
277 | browser.majorVersion = parseInt(browser.version, 10);
|
278 | return {
|
279 | browser: browser,
|
280 | os: os,
|
281 | isMobile: isMobile,
|
282 | isHints: true
|
283 | };
|
284 | }
|
285 |
|
286 | function parseUserAgent(userAgent) {
|
287 | var nextAgent = getUserAgent(userAgent);
|
288 | var isMobile = !!/mobi/g.exec(nextAgent);
|
289 | var browser = {
|
290 | name: "unknown",
|
291 | version: "-1",
|
292 | majorVersion: -1,
|
293 | webview: !!findPreset(WEBVIEW_PRESETS, nextAgent).preset,
|
294 | chromium: false,
|
295 | chromiumVersion: "-1",
|
296 | webkit: false,
|
297 | webkitVersion: "-1"
|
298 | };
|
299 | var os = {
|
300 | name: "unknown",
|
301 | version: "-1",
|
302 | majorVersion: -1
|
303 | };
|
304 |
|
305 | var _a = findPreset(BROWSER_PRESETS, nextAgent),
|
306 | browserPreset = _a.preset,
|
307 | browserVersion = _a.version;
|
308 |
|
309 | var _b = findPreset(OS_PRESETS, nextAgent),
|
310 | osPreset = _b.preset,
|
311 | osVersion = _b.version;
|
312 |
|
313 | var chromiumPreset = findPreset(CHROMIUM_PRESETS, nextAgent);
|
314 | browser.chromium = !!chromiumPreset.preset;
|
315 | browser.chromiumVersion = chromiumPreset.version;
|
316 |
|
317 | if (!browser.chromium) {
|
318 | var webkitPreset = findPreset(WEBKIT_PRESETS, nextAgent);
|
319 | browser.webkit = !!webkitPreset.preset;
|
320 | browser.webkitVersion = webkitPreset.version;
|
321 | }
|
322 |
|
323 | if (osPreset) {
|
324 | os.name = osPreset.id;
|
325 | os.version = osVersion;
|
326 | os.majorVersion = parseInt(osVersion, 10);
|
327 | }
|
328 |
|
329 | if (browserPreset) {
|
330 | browser.name = browserPreset.id;
|
331 | browser.version = browserVersion;
|
332 |
|
333 | if (browser.webview && os.name === "ios" && browser.name !== "safari") {
|
334 | browser.webview = false;
|
335 | }
|
336 | }
|
337 |
|
338 | browser.majorVersion = parseInt(browser.version, 10);
|
339 | return {
|
340 | browser: browser,
|
341 | os: os,
|
342 | isMobile: isMobile,
|
343 | isHints: false
|
344 | };
|
345 | }
|
346 |
|
347 |
|
348 |
|
349 |
|
350 |
|
351 |
|
352 |
|
353 |
|
354 |
|
355 |
|
356 |
|
357 |
|
358 |
|
359 |
|
360 |
|
361 |
|
362 |
|
363 |
|
364 |
|
365 |
|
366 |
|
367 |
|
368 | function getAccurateAgent(callback) {
|
369 | if (hasUserAgentData()) {
|
370 | return navigator.userAgentData.getHighEntropyValues(["architecture", "model", "platform", "platformVersion", "uaFullVersion"]).then(function (info) {
|
371 | var agentInfo = parseUserAgentData(info);
|
372 | callback && callback(agentInfo);
|
373 | return agentInfo;
|
374 | });
|
375 | }
|
376 |
|
377 | callback && callback(agent());
|
378 |
|
379 | if (typeof Promise === "undefined" || !Promise) {
|
380 | return null;
|
381 | }
|
382 |
|
383 | return Promise.resolve(agent());
|
384 | }
|
385 |
|
386 |
|
387 |
|
388 |
|
389 |
|
390 |
|
391 |
|
392 |
|
393 |
|
394 |
|
395 |
|
396 |
|
397 | function agent(userAgent) {
|
398 | if (typeof userAgent === "undefined" && hasUserAgentData()) {
|
399 | return parseUserAgentData();
|
400 | } else {
|
401 | return parseUserAgent(userAgent);
|
402 | }
|
403 | }
|
404 |
|
405 | export default agent;
|
406 | export { getAccurateAgent };
|
407 |
|