session-route.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { base64Encode } from "@opencode-ai/core/util/encode"
  2. import { ServerConnection } from "@/context/server"
  3. import { decode64 } from "@/utils/base64"
  4. export function sessionHref(server: ServerConnection.Key, sessionID: string) {
  5. return `/server/${base64Encode(server)}/session/${sessionID}`
  6. }
  7. export function legacySessionHref(directory: string, sessionID: string) {
  8. return `/${base64Encode(directory)}/session/${sessionID}`
  9. }
  10. export function requireServerKey(segment: string | undefined) {
  11. const key = decode64(segment)
  12. if (!key || base64Encode(key) !== segment) throw new Error("Invalid server route")
  13. return ServerConnection.Key.make(key)
  14. }
  15. export function legacySessionServer(
  16. tabs: readonly { type: "session"; server: ServerConnection.Key; sessionId: string }[],
  17. sessionID: string,
  18. active: ServerConnection.Key,
  19. ) {
  20. const matches = tabs.filter((tab) => tab.sessionId === sessionID)
  21. return matches.find((tab) => tab.server === active)?.server ?? (matches.length === 1 ? matches[0]?.server : active)
  22. }
  23. type SessionParent = { id: string; parentID?: string }
  24. export async function rootSession<T extends SessionParent>(session: T, get: (sessionID: string) => Promise<T>) {
  25. const seen = new Set([session.id])
  26. let current = session
  27. while (current.parentID) {
  28. if (seen.has(current.parentID)) throw new Error(`Session parent cycle: ${current.parentID}`)
  29. seen.add(current.parentID)
  30. current = await get(current.parentID)
  31. }
  32. return current
  33. }