File size: 1,738 Bytes
11d0b50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
export interface BrowserEnvInfo {
  userAgent: string;
  platform: string;
  cpuCores: number;
  memory?: {
    deviceMemory?: number; // GB
  };
  gpu?: {
    vendor?: string;
    renderer?: string;
    webgpuAdapter?: string;
  };
}

export async function getBrowserEnvInfo(): Promise<BrowserEnvInfo> {
  const info: BrowserEnvInfo = {
    userAgent: navigator.userAgent,
    platform: navigator.platform,
    cpuCores: navigator.hardwareConcurrency || 0,
  };

  // Memory info (Chrome only)
  if ('deviceMemory' in navigator) {
    info.memory = {
      deviceMemory: (navigator as any).deviceMemory,
    };
  }

  // GPU info
  const gpu: BrowserEnvInfo['gpu'] = {};

  // Try to get WebGL renderer info
  try {
    const canvas = document.createElement('canvas');
    const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
    if (gl) {
      const debugInfo = (gl as any).getExtension('WEBGL_debug_renderer_info');
      if (debugInfo) {
        gpu.vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
        gpu.renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
      }
    }
  } catch (e) {
    // WebGL not available or blocked
  }

  // Try to get WebGPU adapter info
  if ('gpu' in navigator) {
    try {
      const adapter = await (navigator as any).gpu.requestAdapter();
      if (adapter?.info) {
        gpu.webgpuAdapter = adapter.info.description ||
                            adapter.info.vendor ||
                            'WebGPU Available';
      } else if (adapter) {
        gpu.webgpuAdapter = 'WebGPU Available';
      }
    } catch (e) {
      // WebGPU not available
    }
  }

  if (Object.keys(gpu).length > 0) {
    info.gpu = gpu;
  }

  return info;
}