157 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
 | ||
|  | import { VERSION } from "../version.mjs"; | ||
|  | export const isRunningInBrowser = () => { | ||
|  |     return ( | ||
|  |     // @ts-ignore
 | ||
|  |     typeof window !== 'undefined' && | ||
|  |         // @ts-ignore
 | ||
|  |         typeof window.document !== 'undefined' && | ||
|  |         // @ts-ignore
 | ||
|  |         typeof navigator !== 'undefined'); | ||
|  | }; | ||
|  | /** | ||
|  |  * Note this does not detect 'browser'; for that, use getBrowserInfo(). | ||
|  |  */ | ||
|  | function getDetectedPlatform() { | ||
|  |     if (typeof Deno !== 'undefined' && Deno.build != null) { | ||
|  |         return 'deno'; | ||
|  |     } | ||
|  |     if (typeof EdgeRuntime !== 'undefined') { | ||
|  |         return 'edge'; | ||
|  |     } | ||
|  |     if (Object.prototype.toString.call(typeof globalThis.process !== 'undefined' ? globalThis.process : 0) === '[object process]') { | ||
|  |         return 'node'; | ||
|  |     } | ||
|  |     return 'unknown'; | ||
|  | } | ||
|  | const getPlatformProperties = () => { | ||
|  |     const detectedPlatform = getDetectedPlatform(); | ||
|  |     if (detectedPlatform === 'deno') { | ||
|  |         return { | ||
|  |             'X-Stainless-Lang': 'js', | ||
|  |             'X-Stainless-Package-Version': VERSION, | ||
|  |             'X-Stainless-OS': normalizePlatform(Deno.build.os), | ||
|  |             'X-Stainless-Arch': normalizeArch(Deno.build.arch), | ||
|  |             'X-Stainless-Runtime': 'deno', | ||
|  |             'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown', | ||
|  |         }; | ||
|  |     } | ||
|  |     if (typeof EdgeRuntime !== 'undefined') { | ||
|  |         return { | ||
|  |             'X-Stainless-Lang': 'js', | ||
|  |             'X-Stainless-Package-Version': VERSION, | ||
|  |             'X-Stainless-OS': 'Unknown', | ||
|  |             'X-Stainless-Arch': `other:${EdgeRuntime}`, | ||
|  |             'X-Stainless-Runtime': 'edge', | ||
|  |             'X-Stainless-Runtime-Version': globalThis.process.version, | ||
|  |         }; | ||
|  |     } | ||
|  |     // Check if Node.js
 | ||
|  |     if (detectedPlatform === 'node') { | ||
|  |         return { | ||
|  |             'X-Stainless-Lang': 'js', | ||
|  |             'X-Stainless-Package-Version': VERSION, | ||
|  |             'X-Stainless-OS': normalizePlatform(globalThis.process.platform ?? 'unknown'), | ||
|  |             'X-Stainless-Arch': normalizeArch(globalThis.process.arch ?? 'unknown'), | ||
|  |             'X-Stainless-Runtime': 'node', | ||
|  |             'X-Stainless-Runtime-Version': globalThis.process.version ?? 'unknown', | ||
|  |         }; | ||
|  |     } | ||
|  |     const browserInfo = getBrowserInfo(); | ||
|  |     if (browserInfo) { | ||
|  |         return { | ||
|  |             'X-Stainless-Lang': 'js', | ||
|  |             'X-Stainless-Package-Version': VERSION, | ||
|  |             'X-Stainless-OS': 'Unknown', | ||
|  |             'X-Stainless-Arch': 'unknown', | ||
|  |             'X-Stainless-Runtime': `browser:${browserInfo.browser}`, | ||
|  |             'X-Stainless-Runtime-Version': browserInfo.version, | ||
|  |         }; | ||
|  |     } | ||
|  |     // TODO add support for Cloudflare workers, etc.
 | ||
|  |     return { | ||
|  |         'X-Stainless-Lang': 'js', | ||
|  |         'X-Stainless-Package-Version': VERSION, | ||
|  |         'X-Stainless-OS': 'Unknown', | ||
|  |         'X-Stainless-Arch': 'unknown', | ||
|  |         'X-Stainless-Runtime': 'unknown', | ||
|  |         'X-Stainless-Runtime-Version': 'unknown', | ||
|  |     }; | ||
|  | }; | ||
|  | // Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts
 | ||
|  | function getBrowserInfo() { | ||
|  |     if (typeof navigator === 'undefined' || !navigator) { | ||
|  |         return null; | ||
|  |     } | ||
|  |     // NOTE: The order matters here!
 | ||
|  |     const browserPatterns = [ | ||
|  |         { key: 'edge', pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, | ||
|  |         { key: 'ie', pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, | ||
|  |         { key: 'ie', pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/ }, | ||
|  |         { key: 'chrome', pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, | ||
|  |         { key: 'firefox', pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, | ||
|  |         { key: 'safari', pattern: /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/ }, | ||
|  |     ]; | ||
|  |     // Find the FIRST matching browser
 | ||
|  |     for (const { key, pattern } of browserPatterns) { | ||
|  |         const match = pattern.exec(navigator.userAgent); | ||
|  |         if (match) { | ||
|  |             const major = match[1] || 0; | ||
|  |             const minor = match[2] || 0; | ||
|  |             const patch = match[3] || 0; | ||
|  |             return { browser: key, version: `${major}.${minor}.${patch}` }; | ||
|  |         } | ||
|  |     } | ||
|  |     return null; | ||
|  | } | ||
|  | const normalizeArch = (arch) => { | ||
|  |     // Node docs:
 | ||
|  |     // - https://nodejs.org/api/process.html#processarch
 | ||
|  |     // Deno docs:
 | ||
|  |     // - https://doc.deno.land/deno/stable/~/Deno.build
 | ||
|  |     if (arch === 'x32') | ||
|  |         return 'x32'; | ||
|  |     if (arch === 'x86_64' || arch === 'x64') | ||
|  |         return 'x64'; | ||
|  |     if (arch === 'arm') | ||
|  |         return 'arm'; | ||
|  |     if (arch === 'aarch64' || arch === 'arm64') | ||
|  |         return 'arm64'; | ||
|  |     if (arch) | ||
|  |         return `other:${arch}`; | ||
|  |     return 'unknown'; | ||
|  | }; | ||
|  | const normalizePlatform = (platform) => { | ||
|  |     // Node platforms:
 | ||
|  |     // - https://nodejs.org/api/process.html#processplatform
 | ||
|  |     // Deno platforms:
 | ||
|  |     // - https://doc.deno.land/deno/stable/~/Deno.build
 | ||
|  |     // - https://github.com/denoland/deno/issues/14799
 | ||
|  |     platform = platform.toLowerCase(); | ||
|  |     // NOTE: this iOS check is untested and may not work
 | ||
|  |     // Node does not work natively on IOS, there is a fork at
 | ||
|  |     // https://github.com/nodejs-mobile/nodejs-mobile
 | ||
|  |     // however it is unknown at the time of writing how to detect if it is running
 | ||
|  |     if (platform.includes('ios')) | ||
|  |         return 'iOS'; | ||
|  |     if (platform === 'android') | ||
|  |         return 'Android'; | ||
|  |     if (platform === 'darwin') | ||
|  |         return 'MacOS'; | ||
|  |     if (platform === 'win32') | ||
|  |         return 'Windows'; | ||
|  |     if (platform === 'freebsd') | ||
|  |         return 'FreeBSD'; | ||
|  |     if (platform === 'openbsd') | ||
|  |         return 'OpenBSD'; | ||
|  |     if (platform === 'linux') | ||
|  |         return 'Linux'; | ||
|  |     if (platform) | ||
|  |         return `Other:${platform}`; | ||
|  |     return 'Unknown'; | ||
|  | }; | ||
|  | let _platformHeaders; | ||
|  | export const getPlatformHeaders = () => { | ||
|  |     return (_platformHeaders ?? (_platformHeaders = getPlatformProperties())); | ||
|  | }; | ||
|  | //# sourceMappingURL=detect-platform.mjs.map
 |