| 20 | } from "./PortableDesktopSession"; |
| 21 | |
| 22 | export class DesktopSessionManager { |
| 23 | private readonly sessions = new Map<string, PortableDesktopSession>(); |
| 24 | private readonly startupPromises = new Map<string, Promise<PortableDesktopSession>>(); |
| 25 | |
| 26 | constructor( |
| 27 | private readonly deps: { |
| 28 | config: Config; |
| 29 | experimentsService: ExperimentsService; |
| 30 | workspaceService: WorkspaceService; |
| 31 | } |
| 32 | ) {} |
| 33 | |
| 34 | private parseWorkspaceRuntime(metadata: FrontendWorkspaceMetadata) { |
| 35 | const runtimeConfig = metadata.runtimeConfig; |
| 36 | |
| 37 | switch (runtimeConfig.type) { |
| 38 | case "local": |
| 39 | return parseRuntimeModeAndHost("srcBaseDir" in runtimeConfig ? "worktree" : "local"); |
| 40 | case "worktree": |
| 41 | return parseRuntimeModeAndHost("worktree"); |
| 42 | case "ssh": |
| 43 | return parseRuntimeModeAndHost(`ssh ${runtimeConfig.host}`); |
| 44 | case "docker": |
| 45 | return parseRuntimeModeAndHost(`docker ${runtimeConfig.image}`); |
| 46 | case "devcontainer": |
| 47 | return parseRuntimeModeAndHost( |
| 48 | runtimeConfig.configPath.length > 0 |
| 49 | ? `devcontainer ${runtimeConfig.configPath}` |
| 50 | : "devcontainer" |
| 51 | ); |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | getPrereqStatus(): DesktopPrereqStatus { |
| 56 | assert( |
| 57 | this.deps.config.rootDir.length > 0, |
| 58 | "DesktopSessionManager requires a non-empty rootDir" |
| 59 | ); |
| 60 | |
| 61 | if (!["linux", "darwin", "win32"].includes(process.platform)) { |
| 62 | return { available: false, reason: "unsupported_platform" }; |
| 63 | } |
| 64 | |
| 65 | try { |
| 66 | if (!PortableDesktopSession.checkAvailability(this.deps.config.rootDir)) { |
| 67 | return { available: false, reason: "binary_not_found" }; |
| 68 | } |
| 69 | |
| 70 | return { available: true }; |
| 71 | } catch (error) { |
| 72 | log.error("PortableDesktop prerequisite check failed during availability check", { |
| 73 | error, |
| 74 | }); |
| 75 | if (error instanceof PortableDesktopBinaryNotFoundError) { |
| 76 | return { available: false, reason: "binary_not_found" }; |
| 77 | } |
| 78 | return { available: false, reason: "startup_failed" }; |
| 79 | } |
nothing calls this directly
no outgoing calls
no test coverage detected