yjz-web-sdk 1.0.9-beta.2 → 1.0.9-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,8 +9,14 @@ export declare enum VideoCodecType {
9
9
  }
10
10
  export declare function isDecoderSupported(codec: VideoCodecType): Promise<boolean>;
11
11
  export declare function isEncoderSupported(codec: VideoCodecType): Promise<boolean>;
12
- export declare const isMobileDevice: () => boolean;
13
- export declare const isWebGPUSupported: () => boolean;
14
- export declare const isWebGLSupported: (canvas?: HTMLCanvasElement) => boolean;
12
+ export declare const isWebGPUSupported: () => Promise<boolean>;
15
13
  export declare const isWebGL2Supported: (canvas?: HTMLCanvasElement) => boolean;
14
+ export declare const isWebGL1Supported: (canvas?: HTMLCanvasElement) => boolean;
16
15
  export declare const isCanvas2DSupported: (canvas?: HTMLCanvasElement) => boolean;
16
+ export declare const detectRenderingCapabilities: () => Promise<{
17
+ webgpu: boolean;
18
+ webgl2: boolean;
19
+ webgl1: boolean;
20
+ canvas2d: boolean;
21
+ best: string;
22
+ }>;
@@ -15716,28 +15716,130 @@ async function isDecoderSupported(codec) {
15716
15716
  }
15717
15717
  }
15718
15718
  const isMobileDevice = () => {
15719
- return navigator.userAgent.includes("Mobile") || navigator.userAgent.includes("Android") || navigator.userAgent.includes("iPhone") || navigator.userAgent.includes("iPad");
15719
+ if (typeof navigator === "undefined")
15720
+ return true;
15721
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS|OPiOS/i.test(navigator.userAgent) || "ontouchstart" in window;
15720
15722
  };
15721
- const isWebGPUSupported = () => {
15723
+ let _webgpuChecked = false;
15724
+ let _webgpuSupported = false;
15725
+ const isWebGPUSupported = async () => {
15722
15726
  var _a;
15723
- if (isMobileDevice())
15727
+ if (_webgpuChecked)
15728
+ return _webgpuSupported;
15729
+ if (isMobileDevice()) {
15730
+ _webgpuSupported = false;
15731
+ _webgpuChecked = true;
15724
15732
  return false;
15725
- return "gpu" in navigator && typeof ((_a = navigator.gpu) == null ? void 0 : _a.requestAdapter) === "function";
15726
- };
15727
- const isWebGLSupported = (canvas) => {
15728
- canvas = canvas ?? document.createElement("canvas");
15729
- const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
15730
- return !!gl;
15733
+ }
15734
+ if (!("gpu" in navigator) || typeof ((_a = navigator.gpu) == null ? void 0 : _a.requestAdapter) !== "function") {
15735
+ _webgpuSupported = false;
15736
+ _webgpuChecked = true;
15737
+ return false;
15738
+ }
15739
+ try {
15740
+ const adapter = await navigator.gpu.requestAdapter();
15741
+ _webgpuSupported = !!adapter;
15742
+ } catch (e) {
15743
+ console.warn("[WebGPU] detection failed:", e);
15744
+ _webgpuSupported = false;
15745
+ } finally {
15746
+ _webgpuChecked = true;
15747
+ }
15748
+ return _webgpuSupported;
15731
15749
  };
15750
+ let _webgl2Checked = false;
15751
+ let _webgl2Supported = false;
15732
15752
  const isWebGL2Supported = (canvas) => {
15733
- canvas = canvas ?? document.createElement("canvas");
15734
- const gl2 = canvas.getContext("webgl2");
15735
- return !!gl2;
15753
+ if (_webgl2Checked)
15754
+ return _webgl2Supported;
15755
+ const testCanvas = document.createElement("canvas");
15756
+ const contextNames = ["webgl2", "experimental-webgl2"];
15757
+ let gl = null;
15758
+ for (const name of contextNames) {
15759
+ try {
15760
+ gl = testCanvas.getContext(name);
15761
+ if (gl)
15762
+ break;
15763
+ } catch (_) {
15764
+ }
15765
+ }
15766
+ _webgl2Supported = !!gl;
15767
+ _webgl2Checked = true;
15768
+ return _webgl2Supported;
15736
15769
  };
15770
+ let _webgl1Checked = false;
15771
+ let _webgl1Supported = false;
15772
+ const isWebGL1Supported = (canvas) => {
15773
+ if (_webgl1Checked)
15774
+ return _webgl1Supported;
15775
+ const testCanvas = document.createElement("canvas");
15776
+ const contextNames = [
15777
+ "webgl",
15778
+ "experimental-webgl",
15779
+ "webkit-3d",
15780
+ "moz-webgl"
15781
+ ];
15782
+ let gl = null;
15783
+ for (const name of contextNames) {
15784
+ try {
15785
+ gl = testCanvas.getContext(name);
15786
+ if (gl)
15787
+ break;
15788
+ } catch (_) {
15789
+ }
15790
+ }
15791
+ if (gl) {
15792
+ const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
15793
+ if (debugInfo) {
15794
+ const renderer2 = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
15795
+ if (renderer2 && /llvmpipe|software/i.test(renderer2)) {
15796
+ gl = null;
15797
+ }
15798
+ }
15799
+ }
15800
+ _webgl1Supported = !!gl;
15801
+ _webgl1Checked = true;
15802
+ return _webgl1Supported;
15803
+ };
15804
+ let _canvas2dChecked = false;
15805
+ let _canvas2dSupported = false;
15737
15806
  const isCanvas2DSupported = (canvas) => {
15738
- canvas = canvas ?? document.createElement("canvas");
15739
- const ctx = canvas.getContext("2d");
15740
- return !!ctx;
15807
+ if (_canvas2dChecked)
15808
+ return _canvas2dSupported;
15809
+ const testCanvas = document.createElement("canvas");
15810
+ let ctx = null;
15811
+ try {
15812
+ ctx = testCanvas.getContext("2d", {
15813
+ // 防止某些极端隐私模式下返回 null
15814
+ alpha: true,
15815
+ desynchronized: false
15816
+ });
15817
+ } catch (_) {
15818
+ ctx = null;
15819
+ }
15820
+ if (ctx && typeof ctx.fillRect === "function") {
15821
+ _canvas2dSupported = true;
15822
+ } else {
15823
+ _canvas2dSupported = false;
15824
+ }
15825
+ _canvas2dChecked = true;
15826
+ return _canvas2dSupported;
15827
+ };
15828
+ const detectRenderingCapabilities = async () => {
15829
+ const [webgpu, webgl2, webgl1, canvas2d] = await Promise.all([
15830
+ isWebGPUSupported(),
15831
+ Promise.resolve(isWebGL2Supported()),
15832
+ Promise.resolve(isWebGL1Supported()),
15833
+ Promise.resolve(isCanvas2DSupported())
15834
+ ]);
15835
+ return {
15836
+ webgpu,
15837
+ webgl2,
15838
+ webgl1,
15839
+ canvas2d,
15840
+ // 推荐的降级顺序
15841
+ best: webgpu ? "webgpu" : webgl2 ? "webgl2" : webgl1 ? "webgl1" : canvas2d ? "canvas2d" : "none"
15842
+ };
15741
15843
  };
15742
15844
  const _WebGLRenderer = class _WebGLRenderer {
15743
15845
  constructor(type, canvas) {
@@ -17493,24 +17595,26 @@ function useRemoteVideo(videoContainer, remoteVideoElement, audioElement, videoA
17493
17595
  await initRender(video);
17494
17596
  };
17495
17597
  const initRender = async (video) => {
17598
+ const caps = await detectRenderingCapabilities();
17599
+ console.log("caps", caps);
17496
17600
  if (isWebCodec.value) {
17497
- if (isWebGPUSupported()) {
17601
+ if (caps.webgpu) {
17498
17602
  webRenderer.value = new WebGPURenderer(video);
17499
17603
  console.log("支持====>webGpu");
17500
- } else if (isWebGL2Supported()) {
17604
+ } else if (caps.webgl2) {
17501
17605
  webRenderer.value = new WebGLRenderer("webgl2", video);
17502
17606
  console.log("支持====>webgl2");
17503
- } else if (isWebGLSupported()) {
17607
+ } else if (caps.webgl1) {
17504
17608
  webRenderer.value = new WebGLRenderer("webgl", video);
17505
17609
  console.log("支持====>webgl");
17506
- } else if (isCanvas2DSupported()) {
17610
+ } else if (caps.canvas2d) {
17507
17611
  webRenderer.value = new Canvas2DRenderer(video);
17508
17612
  console.log("支持====>Canvas2D");
17509
17613
  } else {
17510
17614
  console.log("error====>不支持");
17511
17615
  }
17512
17616
  } else {
17513
- if (isWebGPUSupported()) {
17617
+ if (caps.webgpu) {
17514
17618
  wasmRenderer.value = new WebGPUDefault8Render(video, {
17515
17619
  renderMode: 0,
17516
17620
  devicePixelRatio: window.devicePixelRatio
@@ -17518,7 +17622,7 @@ function useRemoteVideo(videoContainer, remoteVideoElement, audioElement, videoA
17518
17622
  await wasmRenderer.value.init();
17519
17623
  wasmRenderer.value.viewport(video.offsetWidth, video.offsetHeight);
17520
17624
  console.log("支持====>WebGPUDefault8Render");
17521
- } else if (isWebGL2Supported() || isWebGLSupported()) {
17625
+ } else if (caps.webgl2 || caps.webgl1) {
17522
17626
  wasmRenderer.value = new WebGLDefault8Render(video, {
17523
17627
  renderMode: 0,
17524
17628
  devicePixelRatio: window.devicePixelRatio
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "yjz-web-sdk",
3
3
  "private": false,
4
- "version": "1.0.9-beta.2",
4
+ "version": "1.0.9-beta.3",
5
5
  "type": "module",
6
6
  "description": "针对于亚矩阵项目的云手机投屏和屏幕控制",
7
7
  "license": "Apache-2.0",
8
- "main": "lib/yjz-web-sdk.umd.cjs",
8
+ "main": "lib/yjz-web-sdk.js",
9
9
  "module": "lib/yjz-web-sdk.js",
10
10
  "types": "./lib/index.d.ts",
11
11
  "exports": {
12
12
  ".": {
13
13
  "import": "./lib/yjz-web-sdk.js",
14
- "require": "./lib/yjz-web-sdk.umd.cjs",
14
+ "require": "./lib/yjz-web-sdk.js",
15
15
  "types": [
16
16
  "./lib/index.d.ts"
17
17
  ]