taglib-wasm
Version:
TagLib for TypeScript platforms: Deno, Node.js, Bun, Electron, browsers, and Cloudflare Workers
138 lines (137 loc) • 3.81 kB
JavaScript
function hasWASISupport() {
if (typeof Deno !== "undefined") {
return true;
}
const globalAny = globalThis;
if (typeof globalAny.process !== "undefined" && globalAny.process.versions?.node) {
const [major] = globalAny.process.versions.node.split(".").map(Number);
return major >= 16;
}
return false;
}
function isBrowser() {
return typeof window !== "undefined" && typeof document !== "undefined";
}
function isWebWorker() {
const globalAny = globalThis;
return typeof globalAny.WorkerGlobalScope !== "undefined" && typeof globalAny.self !== "undefined" && globalAny.self instanceof globalAny.WorkerGlobalScope;
}
function isCloudflareWorker() {
const globalAny = globalThis;
return typeof caches !== "undefined" && typeof Request !== "undefined" && typeof addEventListener === "function" && typeof Deno === "undefined" && typeof globalAny.process === "undefined";
}
function isNode() {
const globalAny = globalThis;
return typeof globalAny.process !== "undefined" && globalAny.process.versions?.node !== void 0;
}
function isDeno() {
return typeof Deno !== "undefined";
}
function detectRuntime() {
if (isDeno() && hasWASISupport()) {
return {
environment: "deno-wasi",
wasmType: "wasi",
supportsFilesystem: true,
supportsStreaming: true,
performanceTier: 1
};
}
if (isNode() && hasWASISupport()) {
return {
environment: "node-wasi",
wasmType: "wasi",
supportsFilesystem: true,
supportsStreaming: true,
performanceTier: 1
};
}
if (isBrowser()) {
return {
environment: "browser",
wasmType: "emscripten",
supportsFilesystem: false,
supportsStreaming: true,
performanceTier: 2
};
}
if (isWebWorker()) {
return {
environment: "worker",
wasmType: "emscripten",
supportsFilesystem: false,
supportsStreaming: true,
performanceTier: 2
};
}
if (isCloudflareWorker()) {
return {
environment: "cloudflare",
wasmType: "emscripten",
supportsFilesystem: false,
supportsStreaming: false,
// Limited streaming capabilities
performanceTier: 3
};
}
if (isNode()) {
return {
environment: "node-emscripten",
wasmType: "emscripten",
supportsFilesystem: true,
supportsStreaming: true,
performanceTier: 3
};
}
return {
environment: "browser",
// Default assumption
wasmType: "emscripten",
supportsFilesystem: false,
supportsStreaming: true,
performanceTier: 3
};
}
function getEnvironmentDescription(env) {
switch (env) {
case "deno-wasi":
return "Deno with WASI (optimal filesystem performance)";
case "node-wasi":
return "Node.js with WASI (high performance)";
case "browser":
return "Browser with Emscripten (web compatibility)";
case "worker":
return "Web Worker with Emscripten";
case "cloudflare":
return "Cloudflare Workers (limited streaming)";
case "node-emscripten":
return "Node.js with Emscripten (fallback mode)";
default:
return "Unknown environment";
}
}
function canLoadWasmType(wasmType) {
const result = detectRuntime();
if (wasmType === "wasi") {
return result.environment === "deno-wasi" || result.environment === "node-wasi";
}
return true;
}
function _forceRuntime(result) {
globalThis.__taglib_wasm_runtime_override = result;
}
function _clearRuntimeOverride() {
delete globalThis.__taglib_wasm_runtime_override;
}
function _getDetectionResult() {
const override = globalThis.__taglib_wasm_runtime_override;
return override || detectRuntime();
}
export {
_clearRuntimeOverride,
_forceRuntime,
_getDetectionResult,
canLoadWasmType,
detectRuntime,
getEnvironmentDescription
};