From adcde52420e89ea1b336ed5afb985678bbcde08b Mon Sep 17 00:00:00 2001 From: xusd320 Date: Tue, 10 Feb 2026 18:08:37 +0800 Subject: [PATCH] feat(web): add Project.checkCompatibility API --- Cargo.lock | 1 + packages/utoo-web/src/project/Project.ts | 5 +++ .../src/project/checkCompatibility.ts | 42 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 packages/utoo-web/src/project/checkCompatibility.ts diff --git a/Cargo.lock b/Cargo.lock index b3216e04a0..31d066aa3c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8876,6 +8876,7 @@ dependencies = [ "serde_json", "shrink-to-fit", "smallvec", + "thiserror 1.0.69", "tokio", "tokio-util", "tracing", diff --git a/packages/utoo-web/src/project/Project.ts b/packages/utoo-web/src/project/Project.ts index a4fcc13f46..625cee98ad 100644 --- a/packages/utoo-web/src/project/Project.ts +++ b/packages/utoo-web/src/project/Project.ts @@ -16,6 +16,7 @@ import { ServiceWorkerOptions, Stats, } from "../types"; +import { checkCompatibility } from "./checkCompatibility"; import { ForkedProject } from "./ForkedProject"; let ProjectWorker: Worker; @@ -251,4 +252,8 @@ export class Project implements ProjectEndpoint { return new ForkedProject(channel.port1); } + + public static checkCompatibility() { + return checkCompatibility(); + } } diff --git a/packages/utoo-web/src/project/checkCompatibility.ts b/packages/utoo-web/src/project/checkCompatibility.ts new file mode 100644 index 0000000000..0c12a29555 --- /dev/null +++ b/packages/utoo-web/src/project/checkCompatibility.ts @@ -0,0 +1,42 @@ +export function checkCompatibility(): { + compatible: boolean; + minimalVersion: { chrome: number }; + details: { + sharedArrayBuffer: boolean; + atomics: boolean; + worker: boolean; + serviceWorker: boolean; + opfs: boolean; + fileSystemObserver: boolean; + }; + missing: string[]; +} { + const details = { + sharedArrayBuffer: + typeof SharedArrayBuffer !== "undefined" && crossOriginIsolated, + atomics: typeof Atomics !== "undefined", + worker: typeof Worker !== "undefined", + serviceWorker: "serviceWorker" in navigator, + opfs: "storage" in navigator && "getDirectory" in navigator.storage, + fileSystemObserver: "FileSystemObserver" in window, + }; + + const missing: string[] = []; + + if (!details.sharedArrayBuffer) missing.push("SharedArrayBuffer (COOP/COEP)"); + if (!details.atomics) missing.push("Atomics"); + if (!details.worker) missing.push("Worker"); + if (!details.serviceWorker) missing.push("ServiceWorker"); + if (!details.opfs) missing.push("OPFS"); + if (!details.fileSystemObserver) missing.push("FileSystemObserver"); + + const compatible = missing.length === 0; + const minimalVersion = { chrome: 137 }; + + return { + compatible, + minimalVersion, + details, + missing, + }; +}