Spaces:
Running
Running
File size: 1,416 Bytes
de03c4e | 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 | import { useCallback, useEffect, useRef, useState } from "react";
import * as Comlink from "comlink";
import type { PyodideBackend } from "./PyodideBackend.ts";
export default function usePyodideBackend() {
const backendRef = useRef<Comlink.Remote<PyodideBackend> | null>(null);
const workerRef = useRef<Worker | null>(null);
const [isReady, setIsReady] = useState<boolean>(false);
useEffect(() => {
const worker = new Worker(
new URL("./pyodide.worker.ts", import.meta.url),
{ type: "module" }
);
const backend = Comlink.wrap<PyodideBackend>(worker);
backendRef.current = backend;
workerRef.current = worker;
(async () => {
try {
await backend.init();
console.log("Pyodide intialized")
setIsReady(true);
} catch (error) {
console.error("Failed to initialize Pyodide backend:", error);
}
})();
return () => {
if (backendRef.current) {
backendRef.current[Comlink.releaseProxy]();
backendRef.current = null;
}
workerRef.current?.terminate();
workerRef.current = null;
setIsReady(false);
};
}, []);
const getBackend = useCallback((): Comlink.Remote<PyodideBackend> => {
if (!backendRef.current) {
throw new Error("Pyodide backend is not ready");
}
return backendRef.current;
}, []);
return { getBackend, backendReady: isReady };
} |