@egjs/view3d
Version:
Fast & Customizable glTF 3D model viewer, packed with full of features!
71 lines (62 loc) • 1.74 kB
text/typescript
/*
* Copyright (c) 2020 NAVER Corp.
* egjs projects are licensed under the MIT license
*/
/**
* Check whether View3D can be initialized without any issues.
* View3D supports browsers with es6+ support.
* @param {object} [features={}] Features to test
* @returns {boolean} A boolean value indicating whether View3D is avilable
*/
const isAvailable = ({
webGL = true,
fetch = true,
stream = true,
wasm = true
}: Partial<{
webGL: boolean;
fetch: boolean;
stream: boolean;
wasm: boolean;
}> = {}) => {
if (webGL) {
const webglAvailable = checkWebGLAvailability();
if (!webglAvailable) return false;
}
if (fetch) {
const fetchAvailable = window && window.fetch;
if (!fetchAvailable) return false;
}
if (stream) {
const streamAvailable = window && window.ReadableStream;
if (!streamAvailable) return false;
}
if (wasm) {
const wasmAvailable = checkWASMAvailability();
if (!wasmAvailable) return false;
}
return true;
};
const checkWebGLAvailability = () => {
try {
const canvas = document.createElement("canvas");
return !!window.WebGLRenderingContext &&
!!(canvas.getContext("webgl") || canvas.getContext("experimental-webgl"));
} catch (e) {
return false;
}
};
const checkWASMAvailability = () => {
try {
if (typeof WebAssembly === "object"
&& typeof WebAssembly.instantiate === "function") {
const wasmModule = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));
if (wasmModule instanceof WebAssembly.Module) {
return new WebAssembly.Instance(wasmModule) instanceof WebAssembly.Instance;
}
}
} catch (e) {
return false;
}
};
export default isAvailable;