162 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.getPlatformHeaders = exports.isRunningInBrowser = void 0;
 | |
| const version_1 = require("../version.js");
 | |
| const isRunningInBrowser = () => {
 | |
|     return (
 | |
|     // @ts-ignore
 | |
|     typeof window !== 'undefined' &&
 | |
|         // @ts-ignore
 | |
|         typeof window.document !== 'undefined' &&
 | |
|         // @ts-ignore
 | |
|         typeof navigator !== 'undefined');
 | |
| };
 | |
| exports.isRunningInBrowser = isRunningInBrowser;
 | |
| /**
 | |
|  * 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_1.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_1.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_1.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_1.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_1.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;
 | |
| const getPlatformHeaders = () => {
 | |
|     return (_platformHeaders ?? (_platformHeaders = getPlatformProperties()));
 | |
| };
 | |
| exports.getPlatformHeaders = getPlatformHeaders;
 | |
| //# sourceMappingURL=detect-platform.js.map
 |