(
mode: FuseMountMode,
options: ResolveFuseBackendOptions = {},
)
| 40 | } |
| 41 | |
| 42 | export async function resolveFuseBackend( |
| 43 | mode: FuseMountMode, |
| 44 | options: ResolveFuseBackendOptions = {}, |
| 45 | ): Promise<FUSEBackend> { |
| 46 | const access = options.access ?? defaultAccess; |
| 47 | const platform = options.platform ?? process.platform; |
| 48 | |
| 49 | if (mode === "none") return { kind: "none" }; |
| 50 | if (mode === "shim") return { kind: "shim" }; |
| 51 | |
| 52 | if (mode === "fuse") { |
| 53 | if (platform !== "linux") { |
| 54 | throw new Error(`FUSE_MOUNT=fuse requires linux; got platform ${platform}`); |
| 55 | } |
| 56 | if (!(await canAccess(access, LINUX_FUSE_DEVICE))) { |
| 57 | throw new Error( |
| 58 | `FUSE_MOUNT=fuse is set but ${LINUX_FUSE_DEVICE} is not accessible; set FUSE_MOUNT=shim or FUSE_MOUNT=none to bypass`, |
| 59 | ); |
| 60 | } |
| 61 | return { kind: "fuse" }; |
| 62 | } |
| 63 | |
| 64 | if (mode === "macfuse") { |
| 65 | if (platform !== "darwin") { |
| 66 | throw new Error(`FUSE_MOUNT=macfuse requires macOS; got platform ${platform}`); |
| 67 | } |
| 68 | if (!(await canAccess(access, MACFUSE_FILESYSTEM))) { |
| 69 | throw new Error( |
| 70 | `FUSE_MOUNT=macfuse is set but macFUSE is not installed; install macFUSE or set FUSE_MOUNT=shim`, |
| 71 | ); |
| 72 | } |
| 73 | return { kind: "macfuse" }; |
| 74 | } |
| 75 | |
| 76 | // mode === "auto" |
| 77 | if (platform === "linux" && (await canAccess(access, LINUX_FUSE_DEVICE))) { |
| 78 | return { kind: "fuse" }; |
| 79 | } |
| 80 | if (platform === "darwin" && (await canAccess(access, MACFUSE_FILESYSTEM))) { |
| 81 | return { kind: "macfuse" }; |
| 82 | } |
| 83 | return { kind: "shim" }; |
| 84 | } |
| 85 | |
| 86 | async function canAccess(access: (path: string) => Promise<void>, path: string): Promise<boolean> { |
| 87 | try { |
no test coverage detected