remote_session.go RawHistoryFolder
1package domain
2
3import (
4 "encoding/base64"
5 "strings"
6)
7
8// RemoteSessionKey identifies a discovered remote session independently from
9// its display label.
10type RemoteSessionKey struct {
11 Host string
12 Name string
13 LifecycleID SessionLifecycleID
14 // DisplayOrigin is presentation-only. When empty, Display derives a
15 // conservative origin from Host for legacy callers; picker targets should
16 // populate it explicitly and never parse Display back into routing data.
17 DisplayOrigin string
18}
19
20// Validate reports whether the host target and session name are both valid.
21func (k RemoteSessionKey) Validate() error {
22 if err := ValidateRemoteHostTarget(k.Host); err != nil {
23 return err
24 }
25 return ValidateSessionName(k.Name)
26}
27
28// ID returns the opaque, delimiter-safe ID for this remote session. Routing
29// retains the structured key; callers must not recover it by decoding this ID.
30func (k RemoteSessionKey) ID() SessionID {
31 host := base64.RawURLEncoding.EncodeToString([]byte(k.Host))
32 name := base64.RawURLEncoding.EncodeToString([]byte(k.Name))
33 if k.LifecycleID != (SessionLifecycleID{}) {
34 lifecycle := base64.RawURLEncoding.EncodeToString(k.LifecycleID[:])
35 return SessionID("remote:" + host + "." + name + "." + lifecycle)
36 }
37 return SessionID("remote:" + host + "." + name)
38}
39
40// RemoteDisplayOrigin returns the host-facing portion of a remote endpoint.
41// Routing retains the full user@host target; presentation consistently omits
42// the login prefix regardless of whether the route came from the CLI or a
43// discovered picker entry.
44func RemoteDisplayOrigin(endpoint string) string {
45 if i := strings.LastIndexByte(endpoint, '@'); i >= 0 && i < len(endpoint)-1 {
46 return endpoint[i+1:]
47 }
48 return endpoint
49}
50
51// RemoteSessionDisplay returns the canonical presentation label for a remote
52// session. endpoint may be a routing target or an already-derived origin; the
53// login prefix is always removed.
54func RemoteSessionDisplay(name, endpoint string) string {
55 return name + "@" + RemoteDisplayOrigin(endpoint)
56}
57
58// Display returns the presentation label for this remote session.
59func (k RemoteSessionKey) Display() string {
60 origin := k.DisplayOrigin
61 if origin == "" {
62 origin = k.Host
63 }
64 return RemoteSessionDisplay(k.Name, origin)
65}