| 1 | import type { SessionOrganizationMutation, SessionOrganizationSnapshot, SessionOrganizationWorkspace, SessionSelector } from "../generated/desktopContract.generated"; |
| 2 | import type { ProjectNode, ProjectTreeOrganizationBindings } from "./types"; |
| 3 | |
| 4 | export function projectNodeSelector(node: ProjectNode): SessionSelector { |
| 5 | const remote = node.remoteSession; |
| 6 | if (remote) return remote.sessionId ? { ref: { hostId: remote.hostId, sessionId: remote.sessionId } } |
| 7 | : { source: { hostId: remote.hostId, path: remote.path || remote.name } }; |
| 8 | return { ref: node.session, source: node.source, sessionPath: node.sessionPath }; |
| 9 | } |
| 10 | |
| 11 | export async function mutateSessionOrganization(bindings: ProjectTreeOrganizationBindings, workspace: SessionOrganizationWorkspace, |
| 12 | mutation: SessionOrganizationMutation): Promise<SessionOrganizationSnapshot> { |
| 13 | if (!bindings.GetSessionOrganization || !bindings.UpdateSessionOrganization) throw new Error("Session organization is unavailable. Upgrade the desktop service."); |
| 14 | let snapshot = await bindings.GetSessionOrganization(workspace); |
| 15 | for (let attempt = 0; attempt < 3; attempt++) { |
| 16 | snapshot = await bindings.UpdateSessionOrganization(workspace, snapshot.revision, mutation); |
| 17 | if (snapshot.applied) return snapshot; |
| 18 | } |
| 19 | throw new Error("Session organization changed in another window. Please retry."); |
| 20 | } |
| 21 |