detached 9e386a7

feat(protocol): carry route hosts and attention order in route snapshots

RecentRouteSnapshot gains Hosts (client-ledger creation destinations
besides the serving daemon, no endpoint) and RecentRouteEntry gains
AttentionSeq, the client-assigned attention onset order used to jump to
the oldest attention across daemons. Stays on protocol version 58.
commit
9e386a7b4f789b9873bcf442bf20be2d6c254c67
author
brice · · 2026-09-22 20:32 UTC
committer
brice · · 2026-09-22 20:32 UTC
parent
42155b1
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
6 files · +358 -81
M internal/adapters/sessionwire/proto_convert_navigation.go +17 -0
@@ -71,9 +71,25 @@ func recentRouteEntryToWire(entry protocol.RecentRouteEntry) (*wire.RecentRouteE
7171 Ephemeral: entry.Ephemeral,
7272 Attention: entry.Attention,
7373 Reachability: uint32(entry.Reachability),
74+ AttentionSeq: entry.AttentionSeq,
7475 }, nil
7576 }
7677
78+func routeHostToWire(host protocol.RouteHost) *wire.RouteHost {
79+ return &wire.RouteHost{Key: host.Key, Generation: host.Generation, Label: host.Label, Kind: uint32(host.Kind)}
80+}
81+
82+func routeHostFromWire(message *wire.RouteHost) (protocol.RouteHost, error) {
83+ if message == nil {
84+ return protocol.RouteHost{}, protocol.ErrInvalidRouteWire
85+ }
86+ kind, err := enum8[protocol.RouteKind](message.GetKind())
87+ if err != nil {
88+ return protocol.RouteHost{}, err
89+ }
90+ return protocol.RouteHost{Key: message.GetKey(), Generation: message.GetGeneration(), Label: message.GetLabel(), Kind: kind}, nil
91+}
92+
7793 func recentRouteEntryFromWire(message *wire.RecentRouteEntry) (protocol.RecentRouteEntry, error) {
7894 var entry protocol.RecentRouteEntry
7995 if message == nil {
@@ -98,6 +114,7 @@ func recentRouteEntryFromWire(message *wire.RecentRouteEntry) (protocol.RecentRo
98114 if err != nil {
99115 return protocol.RecentRouteEntry{}, err
100116 }
117+ entry.AttentionSeq = message.GetAttentionSeq()
101118 return entry, nil
102119 }
103120
@@ -71,9 +71,25 @@ func recentRouteEntryToWire(entry protocol.RecentRouteEntry) (*wire.RecentRouteE
71 Ephemeral: entry.Ephemeral,71 Ephemeral: entry.Ephemeral,
72 Attention: entry.Attention,72 Attention: entry.Attention,
73 Reachability: uint32(entry.Reachability),73 Reachability: uint32(entry.Reachability),
74+ AttentionSeq: entry.AttentionSeq,
74 }, nil75 }, nil
75 }76 }
76 77
78+func routeHostToWire(host protocol.RouteHost) *wire.RouteHost {
79+ return &wire.RouteHost{Key: host.Key, Generation: host.Generation, Label: host.Label, Kind: uint32(host.Kind)}
80+}
81+
82+func routeHostFromWire(message *wire.RouteHost) (protocol.RouteHost, error) {
83+ if message == nil {
84+ return protocol.RouteHost{}, protocol.ErrInvalidRouteWire
85+ }
86+ kind, err := enum8[protocol.RouteKind](message.GetKind())
87+ if err != nil {
88+ return protocol.RouteHost{}, err
89+ }
90+ return protocol.RouteHost{Key: message.GetKey(), Generation: message.GetGeneration(), Label: message.GetLabel(), Kind: kind}, nil
91+}
92+
77 func recentRouteEntryFromWire(message *wire.RecentRouteEntry) (protocol.RecentRouteEntry, error) {93 func recentRouteEntryFromWire(message *wire.RecentRouteEntry) (protocol.RecentRouteEntry, error) {
78 var entry protocol.RecentRouteEntry94 var entry protocol.RecentRouteEntry
79 if message == nil {95 if message == nil {
@@ -98,6 +114,7 @@ func recentRouteEntryFromWire(message *wire.RecentRouteEntry) (protocol.RecentRo
98 if err != nil {114 if err != nil {
99 return protocol.RecentRouteEntry{}, err115 return protocol.RecentRouteEntry{}, err
100 }116 }
117+ entry.AttentionSeq = message.GetAttentionSeq()
101 return entry, nil118 return entry, nil
102 }119 }
103 120
A internal/adapters/sessionwire/proto_convert_route_hosts_test.go +93 -0
@@ -0,0 +1,93 @@
1+package sessionwire
2+
3+import (
4+ "testing"
5+
6+ "github.com/stretchr/testify/require"
7+ "google.golang.org/protobuf/proto"
8+
9+ "github.com/bnema/vev/internal/domain"
10+ "github.com/bnema/vev/internal/protocol"
11+ "github.com/bnema/vev/internal/protocol/wire"
12+)
13+
14+func routeHostsTestSnapshot() protocol.RecentRouteSnapshot {
15+ target := protocol.ExactSessionTarget{LifecycleID: domain.SessionLifecycleID{7}, SessionName: "work"}
16+ return protocol.RecentRouteSnapshot{
17+ Generation: 3,
18+ Entries: []protocol.RecentRouteEntry{{
19+ Key: 1, Generation: 1, Target: target, Name: "work", HostLabel: "box",
20+ Kind: protocol.RouteKindRemote, Attention: true, AttentionSeq: 5,
21+ }},
22+ Hosts: []protocol.RouteHost{
23+ {Key: 2, Generation: 1, Label: "a", Kind: protocol.RouteKindRemote},
24+ {Key: 3, Generation: 1, Label: "local", Kind: protocol.RouteKindLocal},
25+ },
26+ }
27+}
28+
29+// TestProtoRouteHostsWire pins the new route snapshot fields byte for byte
30+// and checks the envelope rejects a truncated prefix and trailing garbage.
31+func TestProtoRouteHostsWire(t *testing.T) {
32+ hostBytes, err := proto.Marshal(routeHostToWire(protocol.RouteHost{Key: 2, Generation: 1, Label: "a", Kind: protocol.RouteKindRemote}))
33+ require.NoError(t, err)
34+ require.Equal(t, []byte{0x08, 0x02, 0x10, 0x01, 0x1A, 0x01, 'a', 0x20, 0x02}, hostBytes)
35+ seqBytes, err := proto.Marshal(&wire.RecentRouteEntry{AttentionSeq: 5})
36+ require.NoError(t, err)
37+ require.Equal(t, []byte{0x50, 0x05}, seqBytes)
38+
39+ snapshot := routeHostsTestSnapshot()
40+ envelope, err := encodeProtoClient(snapshot)
41+ require.NoError(t, err)
42+ raw, err := proto.Marshal(envelope)
43+ require.NoError(t, err)
44+
45+ tests := []struct {
46+ name string
47+ raw []byte
48+ wantErr bool
49+ }{
50+ {name: "exact", raw: raw},
51+ {name: "truncated prefix", raw: raw[:len(raw)-1], wantErr: true},
52+ {name: "trailing garbage", raw: append(append([]byte(nil), raw...), 0xFF), wantErr: true},
53+ }
54+ for _, tt := range tests {
55+ t.Run(tt.name, func(t *testing.T) {
56+ err := wire.ScanEnvelope(&wire.ClientEnvelope{}, tt.raw)
57+ if tt.wantErr {
58+ require.Error(t, err)
59+ return
60+ }
61+ require.NoError(t, err)
62+ decoded := &wire.ClientEnvelope{}
63+ require.NoError(t, proto.Unmarshal(tt.raw, decoded))
64+ got, err := decodeProtoClient(decoded)
65+ require.NoError(t, err)
66+ require.Equal(t, snapshot, got)
67+ })
68+ }
69+}
70+
71+func TestProtoRouteHostsRejectInvalid(t *testing.T) {
72+ tests := []struct {
73+ name string
74+ mutate func(*wire.RecentRouteSnapshot)
75+ }{
76+ {name: "zero host identity", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Key = 0 }},
77+ {name: "empty host label", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Label = "" }},
78+ {name: "unknown host kind", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Kind = 9 }},
79+ {name: "host collides with entry", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Key = 1 }},
80+ {name: "duplicate host", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[1].Key = s.Hosts[0].Key }},
81+ {name: "attention order without attention", mutate: func(s *wire.RecentRouteSnapshot) { s.Entries[0].Attention = false }},
82+ {name: "nil host", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0] = nil }},
83+ }
84+ for _, tt := range tests {
85+ t.Run(tt.name, func(t *testing.T) {
86+ message, err := recentRouteSnapshotToWire(routeHostsTestSnapshot())
87+ require.NoError(t, err)
88+ tt.mutate(message)
89+ _, err = recentRouteSnapshotFromWire(message)
90+ require.Error(t, err)
91+ })
92+ }
93+}
@@ -0,0 +1,93 @@
1+package sessionwire
2+
3+import (
4+ "testing"
5+
6+ "github.com/stretchr/testify/require"
7+ "google.golang.org/protobuf/proto"
8+
9+ "github.com/bnema/vev/internal/domain"
10+ "github.com/bnema/vev/internal/protocol"
11+ "github.com/bnema/vev/internal/protocol/wire"
12+)
13+
14+func routeHostsTestSnapshot() protocol.RecentRouteSnapshot {
15+ target := protocol.ExactSessionTarget{LifecycleID: domain.SessionLifecycleID{7}, SessionName: "work"}
16+ return protocol.RecentRouteSnapshot{
17+ Generation: 3,
18+ Entries: []protocol.RecentRouteEntry{{
19+ Key: 1, Generation: 1, Target: target, Name: "work", HostLabel: "box",
20+ Kind: protocol.RouteKindRemote, Attention: true, AttentionSeq: 5,
21+ }},
22+ Hosts: []protocol.RouteHost{
23+ {Key: 2, Generation: 1, Label: "a", Kind: protocol.RouteKindRemote},
24+ {Key: 3, Generation: 1, Label: "local", Kind: protocol.RouteKindLocal},
25+ },
26+ }
27+}
28+
29+// TestProtoRouteHostsWire pins the new route snapshot fields byte for byte
30+// and checks the envelope rejects a truncated prefix and trailing garbage.
31+func TestProtoRouteHostsWire(t *testing.T) {
32+ hostBytes, err := proto.Marshal(routeHostToWire(protocol.RouteHost{Key: 2, Generation: 1, Label: "a", Kind: protocol.RouteKindRemote}))
33+ require.NoError(t, err)
34+ require.Equal(t, []byte{0x08, 0x02, 0x10, 0x01, 0x1A, 0x01, 'a', 0x20, 0x02}, hostBytes)
35+ seqBytes, err := proto.Marshal(&wire.RecentRouteEntry{AttentionSeq: 5})
36+ require.NoError(t, err)
37+ require.Equal(t, []byte{0x50, 0x05}, seqBytes)
38+
39+ snapshot := routeHostsTestSnapshot()
40+ envelope, err := encodeProtoClient(snapshot)
41+ require.NoError(t, err)
42+ raw, err := proto.Marshal(envelope)
43+ require.NoError(t, err)
44+
45+ tests := []struct {
46+ name string
47+ raw []byte
48+ wantErr bool
49+ }{
50+ {name: "exact", raw: raw},
51+ {name: "truncated prefix", raw: raw[:len(raw)-1], wantErr: true},
52+ {name: "trailing garbage", raw: append(append([]byte(nil), raw...), 0xFF), wantErr: true},
53+ }
54+ for _, tt := range tests {
55+ t.Run(tt.name, func(t *testing.T) {
56+ err := wire.ScanEnvelope(&wire.ClientEnvelope{}, tt.raw)
57+ if tt.wantErr {
58+ require.Error(t, err)
59+ return
60+ }
61+ require.NoError(t, err)
62+ decoded := &wire.ClientEnvelope{}
63+ require.NoError(t, proto.Unmarshal(tt.raw, decoded))
64+ got, err := decodeProtoClient(decoded)
65+ require.NoError(t, err)
66+ require.Equal(t, snapshot, got)
67+ })
68+ }
69+}
70+
71+func TestProtoRouteHostsRejectInvalid(t *testing.T) {
72+ tests := []struct {
73+ name string
74+ mutate func(*wire.RecentRouteSnapshot)
75+ }{
76+ {name: "zero host identity", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Key = 0 }},
77+ {name: "empty host label", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Label = "" }},
78+ {name: "unknown host kind", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Kind = 9 }},
79+ {name: "host collides with entry", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0].Key = 1 }},
80+ {name: "duplicate host", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[1].Key = s.Hosts[0].Key }},
81+ {name: "attention order without attention", mutate: func(s *wire.RecentRouteSnapshot) { s.Entries[0].Attention = false }},
82+ {name: "nil host", mutate: func(s *wire.RecentRouteSnapshot) { s.Hosts[0] = nil }},
83+ }
84+ for _, tt := range tests {
85+ t.Run(tt.name, func(t *testing.T) {
86+ message, err := recentRouteSnapshotToWire(routeHostsTestSnapshot())
87+ require.NoError(t, err)
88+ tt.mutate(message)
89+ _, err = recentRouteSnapshotFromWire(message)
90+ require.Error(t, err)
91+ })
92+ }
93+}
M internal/adapters/sessionwire/proto_convert_routes.go +10 -0
@@ -175,6 +175,9 @@ func recentRouteSnapshotToWire(message protocol.RecentRouteSnapshot) (*wire.Rece
175175 }
176176 out.Entries = append(out.Entries, converted)
177177 }
178+ for _, host := range message.Hosts {
179+ out.Hosts = append(out.Hosts, routeHostToWire(host))
180+ }
178181 return out, nil
179182 }
180183
@@ -199,6 +202,13 @@ func recentRouteSnapshotFromWire(message *wire.RecentRouteSnapshot) (protocol.Re
199202 }
200203 snapshot.Entries = append(snapshot.Entries, converted)
201204 }
205+ for _, host := range message.GetHosts() {
206+ converted, err := routeHostFromWire(host)
207+ if err != nil {
208+ return protocol.RecentRouteSnapshot{}, err
209+ }
210+ snapshot.Hosts = append(snapshot.Hosts, converted)
211+ }
202212 if err := snapshot.Validate(); err != nil {
203213 return protocol.RecentRouteSnapshot{}, err
204214 }
@@ -175,6 +175,9 @@ func recentRouteSnapshotToWire(message protocol.RecentRouteSnapshot) (*wire.Rece
175 }175 }
176 out.Entries = append(out.Entries, converted)176 out.Entries = append(out.Entries, converted)
177 }177 }
178+ for _, host := range message.Hosts {
179+ out.Hosts = append(out.Hosts, routeHostToWire(host))
180+ }
178 return out, nil181 return out, nil
179 }182 }
180 183
@@ -199,6 +202,13 @@ func recentRouteSnapshotFromWire(message *wire.RecentRouteSnapshot) (protocol.Re
199 }202 }
200 snapshot.Entries = append(snapshot.Entries, converted)203 snapshot.Entries = append(snapshot.Entries, converted)
201 }204 }
205+ for _, host := range message.GetHosts() {
206+ converted, err := routeHostFromWire(host)
207+ if err != nil {
208+ return protocol.RecentRouteSnapshot{}, err
209+ }
210+ snapshot.Hosts = append(snapshot.Hosts, converted)
211+ }
202 if err := snapshot.Validate(); err != nil {212 if err := snapshot.Validate(); err != nil {
203 return protocol.RecentRouteSnapshot{}, err213 return protocol.RecentRouteSnapshot{}, err
204 }214 }
M internal/protocol/routes.go +48 -2
@@ -349,6 +349,19 @@ type RecentRouteEntry struct {
349349 Ephemeral bool
350350 Attention bool
351351 Reachability RouteReachability
352+ // AttentionSeq orders attention onsets across every daemon the client
353+ // observes: a smaller value is older. It is zero without attention.
354+ AttentionSeq uint64
355+}
356+
357+// RouteHost is one daemon the client can create a session on, other than
358+// the serving daemon. Its reference shares the entry namespace; it carries
359+// no endpoint, dialer, or credential.
360+type RouteHost struct {
361+ Key uint64
362+ Generation uint64
363+ Label string
364+ Kind RouteKind
352365 }
353366
354367 // RecentRouteSnapshot is an immutable, bounded publication of the client
@@ -363,6 +376,8 @@ type RecentRouteSnapshot struct {
363376 Previous RouteRef
364377 Home RouteRef
365378 Entries []RecentRouteEntry
379+ // Hosts are the creation destinations besides the serving daemon.
380+ Hosts []RouteHost
366381 }
367382
368383 // validateRecentRouteEntry enforces one entry's identity and display bounds.
@@ -388,6 +403,22 @@ func validateRecentRouteEntry(entry RecentRouteEntry) error {
388403 if entry.Reachability.Validate() != nil {
389404 return fmt.Errorf("%w: invalid route reachability", ErrInvalidRouteWire)
390405 }
406+ if entry.AttentionSeq != 0 && !entry.Attention {
407+ return fmt.Errorf("%w: attention order without attention", ErrInvalidRouteWire)
408+ }
409+ return nil
410+}
411+
412+func validateRouteHost(host RouteHost) error {
413+ if host.Key == 0 || host.Generation == 0 {
414+ return fmt.Errorf("%w: route host identity is zero", ErrInvalidRouteWire)
415+ }
416+ if err := ValidateRouteLabel(host.Label, false); err != nil {
417+ return fmt.Errorf("%w: route host label: %v", ErrInvalidRouteWire, err)
418+ }
419+ if host.Kind.Validate() != nil {
420+ return fmt.Errorf("%w: invalid route host kind", ErrInvalidRouteWire)
421+ }
391422 return nil
392423 }
393424
@@ -400,7 +431,10 @@ func (s RecentRouteSnapshot) Validate() error {
400431 if len(s.Entries) > RouteSnapshotMaxEntries {
401432 return fmt.Errorf("%w: too many route entries", ErrInvalidRouteWire)
402433 }
403- if s.Generation == 0 && (len(s.Entries) != 0 || s.ActiveEntry != (RecentRouteEntry{})) {
434+ if len(s.Hosts) > RouteSnapshotMaxHosts {
435+ return fmt.Errorf("%w: too many route hosts", ErrInvalidRouteWire)
436+ }
437+ if s.Generation == 0 && (len(s.Entries) != 0 || len(s.Hosts) != 0 || s.ActiveEntry != (RecentRouteEntry{})) {
404438 return fmt.Errorf("%w: non-empty snapshot has zero generation", ErrInvalidRouteWire)
405439 }
406440 for _, ref := range []RouteRef{s.Active, s.Previous, s.Home} {
@@ -437,6 +471,16 @@ func (s RecentRouteSnapshot) Validate() error {
437471 }
438472 refs[ref] = struct{}{}
439473 }
474+ for _, host := range s.Hosts {
475+ if err := validateRouteHost(host); err != nil {
476+ return err
477+ }
478+ ref := RouteRef{Key: host.Key, Generation: host.Generation}
479+ if _, exists := refs[ref]; exists || ref == s.Active {
480+ return fmt.Errorf("%w: duplicate route host", ErrInvalidRouteWire)
481+ }
482+ refs[ref] = struct{}{}
483+ }
440484 for _, item := range []struct {
441485 name string
442486 ref RouteRef
@@ -612,5 +656,7 @@ const (
612656 // of work a receiver performs before returning to its transport loop. The
613657 // private client history may use a smaller product cap.
614658 RouteSnapshotMaxEntries = 32
615- RouteLabelMaxBytes = 256
659+ // RouteSnapshotMaxHosts bounds the creation destinations of one snapshot.
660+ RouteSnapshotMaxHosts = 32
661+ RouteLabelMaxBytes = 256
616662 )
@@ -349,6 +349,19 @@ type RecentRouteEntry struct {
349 Ephemeral bool349 Ephemeral bool
350 Attention bool350 Attention bool
351 Reachability RouteReachability351 Reachability RouteReachability
352+ // AttentionSeq orders attention onsets across every daemon the client
353+ // observes: a smaller value is older. It is zero without attention.
354+ AttentionSeq uint64
355+}
356+
357+// RouteHost is one daemon the client can create a session on, other than
358+// the serving daemon. Its reference shares the entry namespace; it carries
359+// no endpoint, dialer, or credential.
360+type RouteHost struct {
361+ Key uint64
362+ Generation uint64
363+ Label string
364+ Kind RouteKind
352 }365 }
353 366
354 // RecentRouteSnapshot is an immutable, bounded publication of the client367 // RecentRouteSnapshot is an immutable, bounded publication of the client
@@ -363,6 +376,8 @@ type RecentRouteSnapshot struct {
363 Previous RouteRef376 Previous RouteRef
364 Home RouteRef377 Home RouteRef
365 Entries []RecentRouteEntry378 Entries []RecentRouteEntry
379+ // Hosts are the creation destinations besides the serving daemon.
380+ Hosts []RouteHost
366 }381 }
367 382
368 // validateRecentRouteEntry enforces one entry's identity and display bounds.383 // validateRecentRouteEntry enforces one entry's identity and display bounds.
@@ -388,6 +403,22 @@ func validateRecentRouteEntry(entry RecentRouteEntry) error {
388 if entry.Reachability.Validate() != nil {403 if entry.Reachability.Validate() != nil {
389 return fmt.Errorf("%w: invalid route reachability", ErrInvalidRouteWire)404 return fmt.Errorf("%w: invalid route reachability", ErrInvalidRouteWire)
390 }405 }
406+ if entry.AttentionSeq != 0 && !entry.Attention {
407+ return fmt.Errorf("%w: attention order without attention", ErrInvalidRouteWire)
408+ }
409+ return nil
410+}
411+
412+func validateRouteHost(host RouteHost) error {
413+ if host.Key == 0 || host.Generation == 0 {
414+ return fmt.Errorf("%w: route host identity is zero", ErrInvalidRouteWire)
415+ }
416+ if err := ValidateRouteLabel(host.Label, false); err != nil {
417+ return fmt.Errorf("%w: route host label: %v", ErrInvalidRouteWire, err)
418+ }
419+ if host.Kind.Validate() != nil {
420+ return fmt.Errorf("%w: invalid route host kind", ErrInvalidRouteWire)
421+ }
391 return nil422 return nil
392 }423 }
393 424
@@ -400,7 +431,10 @@ func (s RecentRouteSnapshot) Validate() error {
400 if len(s.Entries) > RouteSnapshotMaxEntries {431 if len(s.Entries) > RouteSnapshotMaxEntries {
401 return fmt.Errorf("%w: too many route entries", ErrInvalidRouteWire)432 return fmt.Errorf("%w: too many route entries", ErrInvalidRouteWire)
402 }433 }
403- if s.Generation == 0 && (len(s.Entries) != 0 || s.ActiveEntry != (RecentRouteEntry{})) {434+ if len(s.Hosts) > RouteSnapshotMaxHosts {
435+ return fmt.Errorf("%w: too many route hosts", ErrInvalidRouteWire)
436+ }
437+ if s.Generation == 0 && (len(s.Entries) != 0 || len(s.Hosts) != 0 || s.ActiveEntry != (RecentRouteEntry{})) {
404 return fmt.Errorf("%w: non-empty snapshot has zero generation", ErrInvalidRouteWire)438 return fmt.Errorf("%w: non-empty snapshot has zero generation", ErrInvalidRouteWire)
405 }439 }
406 for _, ref := range []RouteRef{s.Active, s.Previous, s.Home} {440 for _, ref := range []RouteRef{s.Active, s.Previous, s.Home} {
@@ -437,6 +471,16 @@ func (s RecentRouteSnapshot) Validate() error {
437 }471 }
438 refs[ref] = struct{}{}472 refs[ref] = struct{}{}
439 }473 }
474+ for _, host := range s.Hosts {
475+ if err := validateRouteHost(host); err != nil {
476+ return err
477+ }
478+ ref := RouteRef{Key: host.Key, Generation: host.Generation}
479+ if _, exists := refs[ref]; exists || ref == s.Active {
480+ return fmt.Errorf("%w: duplicate route host", ErrInvalidRouteWire)
481+ }
482+ refs[ref] = struct{}{}
483+ }
440 for _, item := range []struct {484 for _, item := range []struct {
441 name string485 name string
442 ref RouteRef486 ref RouteRef
@@ -612,5 +656,7 @@ const (
612 // of work a receiver performs before returning to its transport loop. The656 // of work a receiver performs before returning to its transport loop. The
613 // private client history may use a smaller product cap.657 // private client history may use a smaller product cap.
614 RouteSnapshotMaxEntries = 32658 RouteSnapshotMaxEntries = 32
615- RouteLabelMaxBytes = 256659+ // RouteSnapshotMaxHosts bounds the creation destinations of one snapshot.
660+ RouteSnapshotMaxHosts = 32
661+ RouteLabelMaxBytes = 256
616 )662 )
M internal/protocol/wire/schema/session.proto +12 -0
@@ -160,6 +160,17 @@ message RecentRouteEntry {
160160 bool attention = 8;
161161 // Closed reachability taxonomy: 0 = unknown, 1 = reachable, 2 = unavailable.
162162 uint32 reachability = 9;
163+ // Client-assigned attention onset order; zero without attention.
164+ uint64 attention_seq = 10;
165+}
166+
167+// RouteHost is one creation destination other than the serving daemon.
168+message RouteHost {
169+ uint64 key = 1;
170+ uint64 generation = 2;
171+ string label = 3;
172+ // Closed kind taxonomy: 1 = local, 2 = remote.
173+ uint32 kind = 4;
163174 }
164175
165176 // RecentRouteSnapshot is an immutable bounded route publication.
@@ -170,6 +181,7 @@ message RecentRouteSnapshot {
170181 RouteRef previous = 4;
171182 RouteRef home = 5;
172183 repeated RecentRouteEntry entries = 6;
184+ repeated RouteHost hosts = 7;
173185 }
174186
175187 // RouteNavigationAction asks the client to resolve one ledger entry.
@@ -160,6 +160,17 @@ message RecentRouteEntry {
160 bool attention = 8;160 bool attention = 8;
161 // Closed reachability taxonomy: 0 = unknown, 1 = reachable, 2 = unavailable.161 // Closed reachability taxonomy: 0 = unknown, 1 = reachable, 2 = unavailable.
162 uint32 reachability = 9;162 uint32 reachability = 9;
163+ // Client-assigned attention onset order; zero without attention.
164+ uint64 attention_seq = 10;
165+}
166+
167+// RouteHost is one creation destination other than the serving daemon.
168+message RouteHost {
169+ uint64 key = 1;
170+ uint64 generation = 2;
171+ string label = 3;
172+ // Closed kind taxonomy: 1 = local, 2 = remote.
173+ uint32 kind = 4;
163 }174 }
164 175
165 // RecentRouteSnapshot is an immutable bounded route publication.176 // RecentRouteSnapshot is an immutable bounded route publication.
@@ -170,6 +181,7 @@ message RecentRouteSnapshot {
170 RouteRef previous = 4;181 RouteRef previous = 4;
171 RouteRef home = 5;182 RouteRef home = 5;
172 repeated RecentRouteEntry entries = 6;183 repeated RecentRouteEntry entries = 6;
184+ repeated RouteHost hosts = 7;
173 }185 }
174 186
175 // RouteNavigationAction asks the client to resolve one ledger entry.187 // RouteNavigationAction asks the client to resolve one ledger entry.
M internal/protocol/wire/session.pb.go +178 -79
@@ -1232,7 +1232,9 @@ type RecentRouteEntry struct {
12321232 Ephemeral bool `protobuf:"varint,7,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"`
12331233 Attention bool `protobuf:"varint,8,opt,name=attention,proto3" json:"attention,omitempty"`
12341234 // Closed reachability taxonomy: 0 = unknown, 1 = reachable, 2 = unavailable.
1235- Reachability uint32 `protobuf:"varint,9,opt,name=reachability,proto3" json:"reachability,omitempty"`
1235+ Reachability uint32 `protobuf:"varint,9,opt,name=reachability,proto3" json:"reachability,omitempty"`
1236+ // Client-assigned attention onset order; zero without attention.
1237+ AttentionSeq uint64 `protobuf:"varint,10,opt,name=attention_seq,json=attentionSeq,proto3" json:"attention_seq,omitempty"`
12361238 unknownFields protoimpl.UnknownFields
12371239 sizeCache protoimpl.SizeCache
12381240 }
@@ -1330,6 +1332,83 @@ func (x *RecentRouteEntry) GetReachability() uint32 {
13301332 return 0
13311333 }
13321334
1335+func (x *RecentRouteEntry) GetAttentionSeq() uint64 {
1336+ if x != nil {
1337+ return x.AttentionSeq
1338+ }
1339+ return 0
1340+}
1341+
1342+// RouteHost is one creation destination other than the serving daemon.
1343+type RouteHost struct {
1344+ state protoimpl.MessageState `protogen:"open.v1"`
1345+ Key uint64 `protobuf:"varint,1,opt,name=key,proto3" json:"key,omitempty"`
1346+ Generation uint64 `protobuf:"varint,2,opt,name=generation,proto3" json:"generation,omitempty"`
1347+ Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
1348+ // Closed kind taxonomy: 1 = local, 2 = remote.
1349+ Kind uint32 `protobuf:"varint,4,opt,name=kind,proto3" json:"kind,omitempty"`
1350+ unknownFields protoimpl.UnknownFields
1351+ sizeCache protoimpl.SizeCache
1352+}
1353+
1354+func (x *RouteHost) Reset() {
1355+ *x = RouteHost{}
1356+ mi := &file_session_proto_msgTypes[19]
1357+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1358+ ms.StoreMessageInfo(mi)
1359+}
1360+
1361+func (x *RouteHost) String() string {
1362+ return protoimpl.X.MessageStringOf(x)
1363+}
1364+
1365+func (*RouteHost) ProtoMessage() {}
1366+
1367+func (x *RouteHost) ProtoReflect() protoreflect.Message {
1368+ mi := &file_session_proto_msgTypes[19]
1369+ if x != nil {
1370+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1371+ if ms.LoadMessageInfo() == nil {
1372+ ms.StoreMessageInfo(mi)
1373+ }
1374+ return ms
1375+ }
1376+ return mi.MessageOf(x)
1377+}
1378+
1379+// Deprecated: Use RouteHost.ProtoReflect.Descriptor instead.
1380+func (*RouteHost) Descriptor() ([]byte, []int) {
1381+ return file_session_proto_rawDescGZIP(), []int{19}
1382+}
1383+
1384+func (x *RouteHost) GetKey() uint64 {
1385+ if x != nil {
1386+ return x.Key
1387+ }
1388+ return 0
1389+}
1390+
1391+func (x *RouteHost) GetGeneration() uint64 {
1392+ if x != nil {
1393+ return x.Generation
1394+ }
1395+ return 0
1396+}
1397+
1398+func (x *RouteHost) GetLabel() string {
1399+ if x != nil {
1400+ return x.Label
1401+ }
1402+ return ""
1403+}
1404+
1405+func (x *RouteHost) GetKind() uint32 {
1406+ if x != nil {
1407+ return x.Kind
1408+ }
1409+ return 0
1410+}
1411+
13331412 // RecentRouteSnapshot is an immutable bounded route publication.
13341413 type RecentRouteSnapshot struct {
13351414 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1339,13 +1418,14 @@ type RecentRouteSnapshot struct {
13391418 Previous *RouteRef `protobuf:"bytes,4,opt,name=previous,proto3" json:"previous,omitempty"`
13401419 Home *RouteRef `protobuf:"bytes,5,opt,name=home,proto3" json:"home,omitempty"`
13411420 Entries []*RecentRouteEntry `protobuf:"bytes,6,rep,name=entries,proto3" json:"entries,omitempty"`
1421+ Hosts []*RouteHost `protobuf:"bytes,7,rep,name=hosts,proto3" json:"hosts,omitempty"`
13421422 unknownFields protoimpl.UnknownFields
13431423 sizeCache protoimpl.SizeCache
13441424 }
13451425
13461426 func (x *RecentRouteSnapshot) Reset() {
13471427 *x = RecentRouteSnapshot{}
1348- mi := &file_session_proto_msgTypes[19]
1428+ mi := &file_session_proto_msgTypes[20]
13491429 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13501430 ms.StoreMessageInfo(mi)
13511431 }
@@ -1357,7 +1437,7 @@ func (x *RecentRouteSnapshot) String() string {
13571437 func (*RecentRouteSnapshot) ProtoMessage() {}
13581438
13591439 func (x *RecentRouteSnapshot) ProtoReflect() protoreflect.Message {
1360- mi := &file_session_proto_msgTypes[19]
1440+ mi := &file_session_proto_msgTypes[20]
13611441 if x != nil {
13621442 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13631443 if ms.LoadMessageInfo() == nil {
@@ -1370,7 +1450,7 @@ func (x *RecentRouteSnapshot) ProtoReflect() protoreflect.Message {
13701450
13711451 // Deprecated: Use RecentRouteSnapshot.ProtoReflect.Descriptor instead.
13721452 func (*RecentRouteSnapshot) Descriptor() ([]byte, []int) {
1373- return file_session_proto_rawDescGZIP(), []int{19}
1453+ return file_session_proto_rawDescGZIP(), []int{20}
13741454 }
13751455
13761456 func (x *RecentRouteSnapshot) GetGeneration() uint64 {
@@ -1415,6 +1495,13 @@ func (x *RecentRouteSnapshot) GetEntries() []*RecentRouteEntry {
14151495 return nil
14161496 }
14171497
1498+func (x *RecentRouteSnapshot) GetHosts() []*RouteHost {
1499+ if x != nil {
1500+ return x.Hosts
1501+ }
1502+ return nil
1503+}
1504+
14181505 // RouteNavigationAction asks the client to resolve one ledger entry.
14191506 type RouteNavigationAction struct {
14201507 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1428,7 +1515,7 @@ type RouteNavigationAction struct {
14281515
14291516 func (x *RouteNavigationAction) Reset() {
14301517 *x = RouteNavigationAction{}
1431- mi := &file_session_proto_msgTypes[20]
1518+ mi := &file_session_proto_msgTypes[21]
14321519 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14331520 ms.StoreMessageInfo(mi)
14341521 }
@@ -1440,7 +1527,7 @@ func (x *RouteNavigationAction) String() string {
14401527 func (*RouteNavigationAction) ProtoMessage() {}
14411528
14421529 func (x *RouteNavigationAction) ProtoReflect() protoreflect.Message {
1443- mi := &file_session_proto_msgTypes[20]
1530+ mi := &file_session_proto_msgTypes[21]
14441531 if x != nil {
14451532 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14461533 if ms.LoadMessageInfo() == nil {
@@ -1453,7 +1540,7 @@ func (x *RouteNavigationAction) ProtoReflect() protoreflect.Message {
14531540
14541541 // Deprecated: Use RouteNavigationAction.ProtoReflect.Descriptor instead.
14551542 func (*RouteNavigationAction) Descriptor() ([]byte, []int) {
1456- return file_session_proto_rawDescGZIP(), []int{20}
1543+ return file_session_proto_rawDescGZIP(), []int{21}
14571544 }
14581545
14591546 func (x *RouteNavigationAction) GetCauseActionId() uint64 {
@@ -1499,7 +1586,7 @@ type RouteCreateSessionAction struct {
14991586
15001587 func (x *RouteCreateSessionAction) Reset() {
15011588 *x = RouteCreateSessionAction{}
1502- mi := &file_session_proto_msgTypes[21]
1589+ mi := &file_session_proto_msgTypes[22]
15031590 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15041591 ms.StoreMessageInfo(mi)
15051592 }
@@ -1511,7 +1598,7 @@ func (x *RouteCreateSessionAction) String() string {
15111598 func (*RouteCreateSessionAction) ProtoMessage() {}
15121599
15131600 func (x *RouteCreateSessionAction) ProtoReflect() protoreflect.Message {
1514- mi := &file_session_proto_msgTypes[21]
1601+ mi := &file_session_proto_msgTypes[22]
15151602 if x != nil {
15161603 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15171604 if ms.LoadMessageInfo() == nil {
@@ -1524,7 +1611,7 @@ func (x *RouteCreateSessionAction) ProtoReflect() protoreflect.Message {
15241611
15251612 // Deprecated: Use RouteCreateSessionAction.ProtoReflect.Descriptor instead.
15261613 func (*RouteCreateSessionAction) Descriptor() ([]byte, []int) {
1527- return file_session_proto_rawDescGZIP(), []int{21}
1614+ return file_session_proto_rawDescGZIP(), []int{22}
15281615 }
15291616
15301617 func (x *RouteCreateSessionAction) GetCauseActionId() uint64 {
@@ -1584,7 +1671,7 @@ type RouteNavigationFailure struct {
15841671
15851672 func (x *RouteNavigationFailure) Reset() {
15861673 *x = RouteNavigationFailure{}
1587- mi := &file_session_proto_msgTypes[22]
1674+ mi := &file_session_proto_msgTypes[23]
15881675 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15891676 ms.StoreMessageInfo(mi)
15901677 }
@@ -1596,7 +1683,7 @@ func (x *RouteNavigationFailure) String() string {
15961683 func (*RouteNavigationFailure) ProtoMessage() {}
15971684
15981685 func (x *RouteNavigationFailure) ProtoReflect() protoreflect.Message {
1599- mi := &file_session_proto_msgTypes[22]
1686+ mi := &file_session_proto_msgTypes[23]
16001687 if x != nil {
16011688 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16021689 if ms.LoadMessageInfo() == nil {
@@ -1609,7 +1696,7 @@ func (x *RouteNavigationFailure) ProtoReflect() protoreflect.Message {
16091696
16101697 // Deprecated: Use RouteNavigationFailure.ProtoReflect.Descriptor instead.
16111698 func (*RouteNavigationFailure) Descriptor() ([]byte, []int) {
1612- return file_session_proto_rawDescGZIP(), []int{22}
1699+ return file_session_proto_rawDescGZIP(), []int{23}
16131700 }
16141701
16151702 func (x *RouteNavigationFailure) GetKey() uint64 {
@@ -1644,7 +1731,7 @@ type SessionCreationFailure struct {
16441731
16451732 func (x *SessionCreationFailure) Reset() {
16461733 *x = SessionCreationFailure{}
1647- mi := &file_session_proto_msgTypes[23]
1734+ mi := &file_session_proto_msgTypes[24]
16481735 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16491736 ms.StoreMessageInfo(mi)
16501737 }
@@ -1656,7 +1743,7 @@ func (x *SessionCreationFailure) String() string {
16561743 func (*SessionCreationFailure) ProtoMessage() {}
16571744
16581745 func (x *SessionCreationFailure) ProtoReflect() protoreflect.Message {
1659- mi := &file_session_proto_msgTypes[23]
1746+ mi := &file_session_proto_msgTypes[24]
16601747 if x != nil {
16611748 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16621749 if ms.LoadMessageInfo() == nil {
@@ -1669,7 +1756,7 @@ func (x *SessionCreationFailure) ProtoReflect() protoreflect.Message {
16691756
16701757 // Deprecated: Use SessionCreationFailure.ProtoReflect.Descriptor instead.
16711758 func (*SessionCreationFailure) Descriptor() ([]byte, []int) {
1672- return file_session_proto_rawDescGZIP(), []int{23}
1759+ return file_session_proto_rawDescGZIP(), []int{24}
16731760 }
16741761
16751762 func (x *SessionCreationFailure) GetRequestId() uint64 {
@@ -1697,7 +1784,7 @@ type RoutePosition struct {
16971784
16981785 func (x *RoutePosition) Reset() {
16991786 *x = RoutePosition{}
1700- mi := &file_session_proto_msgTypes[24]
1787+ mi := &file_session_proto_msgTypes[25]
17011788 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17021789 ms.StoreMessageInfo(mi)
17031790 }
@@ -1709,7 +1796,7 @@ func (x *RoutePosition) String() string {
17091796 func (*RoutePosition) ProtoMessage() {}
17101797
17111798 func (x *RoutePosition) ProtoReflect() protoreflect.Message {
1712- mi := &file_session_proto_msgTypes[24]
1799+ mi := &file_session_proto_msgTypes[25]
17131800 if x != nil {
17141801 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17151802 if ms.LoadMessageInfo() == nil {
@@ -1722,7 +1809,7 @@ func (x *RoutePosition) ProtoReflect() protoreflect.Message {
17221809
17231810 // Deprecated: Use RoutePosition.ProtoReflect.Descriptor instead.
17241811 func (*RoutePosition) Descriptor() ([]byte, []int) {
1725- return file_session_proto_rawDescGZIP(), []int{24}
1812+ return file_session_proto_rawDescGZIP(), []int{25}
17261813 }
17271814
17281815 func (x *RoutePosition) GetTarget() *ExactTarget {
@@ -1750,7 +1837,7 @@ type RouteRetired struct {
17501837
17511838 func (x *RouteRetired) Reset() {
17521839 *x = RouteRetired{}
1753- mi := &file_session_proto_msgTypes[25]
1840+ mi := &file_session_proto_msgTypes[26]
17541841 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17551842 ms.StoreMessageInfo(mi)
17561843 }
@@ -1762,7 +1849,7 @@ func (x *RouteRetired) String() string {
17621849 func (*RouteRetired) ProtoMessage() {}
17631850
17641851 func (x *RouteRetired) ProtoReflect() protoreflect.Message {
1765- mi := &file_session_proto_msgTypes[25]
1852+ mi := &file_session_proto_msgTypes[26]
17661853 if x != nil {
17671854 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17681855 if ms.LoadMessageInfo() == nil {
@@ -1775,7 +1862,7 @@ func (x *RouteRetired) ProtoReflect() protoreflect.Message {
17751862
17761863 // Deprecated: Use RouteRetired.ProtoReflect.Descriptor instead.
17771864 func (*RouteRetired) Descriptor() ([]byte, []int) {
1778- return file_session_proto_rawDescGZIP(), []int{25}
1865+ return file_session_proto_rawDescGZIP(), []int{26}
17791866 }
17801867
17811868 func (x *RouteRetired) GetRef() *RouteRef {
@@ -1804,7 +1891,7 @@ type SamePeerSwitchRequest struct {
18041891
18051892 func (x *SamePeerSwitchRequest) Reset() {
18061893 *x = SamePeerSwitchRequest{}
1807- mi := &file_session_proto_msgTypes[26]
1894+ mi := &file_session_proto_msgTypes[27]
18081895 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18091896 ms.StoreMessageInfo(mi)
18101897 }
@@ -1816,7 +1903,7 @@ func (x *SamePeerSwitchRequest) String() string {
18161903 func (*SamePeerSwitchRequest) ProtoMessage() {}
18171904
18181905 func (x *SamePeerSwitchRequest) ProtoReflect() protoreflect.Message {
1819- mi := &file_session_proto_msgTypes[26]
1906+ mi := &file_session_proto_msgTypes[27]
18201907 if x != nil {
18211908 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18221909 if ms.LoadMessageInfo() == nil {
@@ -1829,7 +1916,7 @@ func (x *SamePeerSwitchRequest) ProtoReflect() protoreflect.Message {
18291916
18301917 // Deprecated: Use SamePeerSwitchRequest.ProtoReflect.Descriptor instead.
18311918 func (*SamePeerSwitchRequest) Descriptor() ([]byte, []int) {
1832- return file_session_proto_rawDescGZIP(), []int{26}
1919+ return file_session_proto_rawDescGZIP(), []int{27}
18331920 }
18341921
18351922 func (x *SamePeerSwitchRequest) GetRequestId() uint64 {
@@ -1865,7 +1952,7 @@ type SamePeerSwitchFailure struct {
18651952
18661953 func (x *SamePeerSwitchFailure) Reset() {
18671954 *x = SamePeerSwitchFailure{}
1868- mi := &file_session_proto_msgTypes[27]
1955+ mi := &file_session_proto_msgTypes[28]
18691956 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18701957 ms.StoreMessageInfo(mi)
18711958 }
@@ -1877,7 +1964,7 @@ func (x *SamePeerSwitchFailure) String() string {
18771964 func (*SamePeerSwitchFailure) ProtoMessage() {}
18781965
18791966 func (x *SamePeerSwitchFailure) ProtoReflect() protoreflect.Message {
1880- mi := &file_session_proto_msgTypes[27]
1967+ mi := &file_session_proto_msgTypes[28]
18811968 if x != nil {
18821969 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18831970 if ms.LoadMessageInfo() == nil {
@@ -1890,7 +1977,7 @@ func (x *SamePeerSwitchFailure) ProtoReflect() protoreflect.Message {
18901977
18911978 // Deprecated: Use SamePeerSwitchFailure.ProtoReflect.Descriptor instead.
18921979 func (*SamePeerSwitchFailure) Descriptor() ([]byte, []int) {
1893- return file_session_proto_rawDescGZIP(), []int{27}
1980+ return file_session_proto_rawDescGZIP(), []int{28}
18941981 }
18951982
18961983 func (x *SamePeerSwitchFailure) GetRequestId() uint64 {
@@ -1917,7 +2004,7 @@ type SuspendAttachment struct {
19172004
19182005 func (x *SuspendAttachment) Reset() {
19192006 *x = SuspendAttachment{}
1920- mi := &file_session_proto_msgTypes[28]
2007+ mi := &file_session_proto_msgTypes[29]
19212008 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
19222009 ms.StoreMessageInfo(mi)
19232010 }
@@ -1929,7 +2016,7 @@ func (x *SuspendAttachment) String() string {
19292016 func (*SuspendAttachment) ProtoMessage() {}
19302017
19312018 func (x *SuspendAttachment) ProtoReflect() protoreflect.Message {
1932- mi := &file_session_proto_msgTypes[28]
2019+ mi := &file_session_proto_msgTypes[29]
19332020 if x != nil {
19342021 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
19352022 if ms.LoadMessageInfo() == nil {
@@ -1942,7 +2029,7 @@ func (x *SuspendAttachment) ProtoReflect() protoreflect.Message {
19422029
19432030 // Deprecated: Use SuspendAttachment.ProtoReflect.Descriptor instead.
19442031 func (*SuspendAttachment) Descriptor() ([]byte, []int) {
1945- return file_session_proto_rawDescGZIP(), []int{28}
2032+ return file_session_proto_rawDescGZIP(), []int{29}
19462033 }
19472034
19482035 func (x *SuspendAttachment) GetRequestId() uint64 {
@@ -1963,7 +2050,7 @@ type AttachmentSuspended struct {
19632050
19642051 func (x *AttachmentSuspended) Reset() {
19652052 *x = AttachmentSuspended{}
1966- mi := &file_session_proto_msgTypes[29]
2053+ mi := &file_session_proto_msgTypes[30]
19672054 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
19682055 ms.StoreMessageInfo(mi)
19692056 }
@@ -1975,7 +2062,7 @@ func (x *AttachmentSuspended) String() string {
19752062 func (*AttachmentSuspended) ProtoMessage() {}
19762063
19772064 func (x *AttachmentSuspended) ProtoReflect() protoreflect.Message {
1978- mi := &file_session_proto_msgTypes[29]
2065+ mi := &file_session_proto_msgTypes[30]
19792066 if x != nil {
19802067 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
19812068 if ms.LoadMessageInfo() == nil {
@@ -1988,7 +2075,7 @@ func (x *AttachmentSuspended) ProtoReflect() protoreflect.Message {
19882075
19892076 // Deprecated: Use AttachmentSuspended.ProtoReflect.Descriptor instead.
19902077 func (*AttachmentSuspended) Descriptor() ([]byte, []int) {
1991- return file_session_proto_rawDescGZIP(), []int{29}
2078+ return file_session_proto_rawDescGZIP(), []int{30}
19922079 }
19932080
19942081 func (x *AttachmentSuspended) GetRequestId() uint64 {
@@ -2020,7 +2107,7 @@ type ActivateAttachment struct {
20202107
20212108 func (x *ActivateAttachment) Reset() {
20222109 *x = ActivateAttachment{}
2023- mi := &file_session_proto_msgTypes[30]
2110+ mi := &file_session_proto_msgTypes[31]
20242111 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
20252112 ms.StoreMessageInfo(mi)
20262113 }
@@ -2032,7 +2119,7 @@ func (x *ActivateAttachment) String() string {
20322119 func (*ActivateAttachment) ProtoMessage() {}
20332120
20342121 func (x *ActivateAttachment) ProtoReflect() protoreflect.Message {
2035- mi := &file_session_proto_msgTypes[30]
2122+ mi := &file_session_proto_msgTypes[31]
20362123 if x != nil {
20372124 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
20382125 if ms.LoadMessageInfo() == nil {
@@ -2045,7 +2132,7 @@ func (x *ActivateAttachment) ProtoReflect() protoreflect.Message {
20452132
20462133 // Deprecated: Use ActivateAttachment.ProtoReflect.Descriptor instead.
20472134 func (*ActivateAttachment) Descriptor() ([]byte, []int) {
2048- return file_session_proto_rawDescGZIP(), []int{30}
2135+ return file_session_proto_rawDescGZIP(), []int{31}
20492136 }
20502137
20512138 func (x *ActivateAttachment) GetRequestId() uint64 {
@@ -2106,7 +2193,7 @@ type AttachmentActivated struct {
21062193
21072194 func (x *AttachmentActivated) Reset() {
21082195 *x = AttachmentActivated{}
2109- mi := &file_session_proto_msgTypes[31]
2196+ mi := &file_session_proto_msgTypes[32]
21102197 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
21112198 ms.StoreMessageInfo(mi)
21122199 }
@@ -2118,7 +2205,7 @@ func (x *AttachmentActivated) String() string {
21182205 func (*AttachmentActivated) ProtoMessage() {}
21192206
21202207 func (x *AttachmentActivated) ProtoReflect() protoreflect.Message {
2121- mi := &file_session_proto_msgTypes[31]
2208+ mi := &file_session_proto_msgTypes[32]
21222209 if x != nil {
21232210 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
21242211 if ms.LoadMessageInfo() == nil {
@@ -2131,7 +2218,7 @@ func (x *AttachmentActivated) ProtoReflect() protoreflect.Message {
21312218
21322219 // Deprecated: Use AttachmentActivated.ProtoReflect.Descriptor instead.
21332220 func (*AttachmentActivated) Descriptor() ([]byte, []int) {
2134- return file_session_proto_rawDescGZIP(), []int{31}
2221+ return file_session_proto_rawDescGZIP(), []int{32}
21352222 }
21362223
21372224 func (x *AttachmentActivated) GetRequestId() uint64 {
@@ -2270,7 +2357,7 @@ const file_session_proto_rawDesc = "" +
22702357 "\n" +
22712358 "source_key\x18\x03 \x01(\tR\tsourceKey\"Y\n" +
22722359 "\x1aRouteAttentionSubscription\x12;\n" +
2273- "\atargets\x18\x01 \x03(\v2!.vev.wire.v1.RouteAttentionTargetR\atargets\"\x9d\x02\n" +
2360+ "\atargets\x18\x01 \x03(\v2!.vev.wire.v1.RouteAttentionTargetR\atargets\"\xc2\x02\n" +
22742361 "\x10RecentRouteEntry\x12\x10\n" +
22752362 "\x03key\x18\x01 \x01(\x04R\x03key\x12\x1e\n" +
22762363 "\n" +
@@ -2283,7 +2370,16 @@ const file_session_proto_rawDesc = "" +
22832370 "\x04kind\x18\x06 \x01(\rR\x04kind\x12\x1c\n" +
22842371 "\tephemeral\x18\a \x01(\bR\tephemeral\x12\x1c\n" +
22852372 "\tattention\x18\b \x01(\bR\tattention\x12\"\n" +
2286- "\freachability\x18\t \x01(\rR\freachability\"\xbd\x02\n" +
2373+ "\freachability\x18\t \x01(\rR\freachability\x12#\n" +
2374+ "\rattention_seq\x18\n" +
2375+ " \x01(\x04R\fattentionSeq\"g\n" +
2376+ "\tRouteHost\x12\x10\n" +
2377+ "\x03key\x18\x01 \x01(\x04R\x03key\x12\x1e\n" +
2378+ "\n" +
2379+ "generation\x18\x02 \x01(\x04R\n" +
2380+ "generation\x12\x14\n" +
2381+ "\x05label\x18\x03 \x01(\tR\x05label\x12\x12\n" +
2382+ "\x04kind\x18\x04 \x01(\rR\x04kind\"\xeb\x02\n" +
22872383 "\x13RecentRouteSnapshot\x12\x1e\n" +
22882384 "\n" +
22892385 "generation\x18\x01 \x01(\x04R\n" +
@@ -2292,7 +2388,8 @@ const file_session_proto_rawDesc = "" +
22922388 "\factive_entry\x18\x03 \x01(\v2\x1d.vev.wire.v1.RecentRouteEntryR\vactiveEntry\x121\n" +
22932389 "\bprevious\x18\x04 \x01(\v2\x15.vev.wire.v1.RouteRefR\bprevious\x12)\n" +
22942390 "\x04home\x18\x05 \x01(\v2\x15.vev.wire.v1.RouteRefR\x04home\x127\n" +
2295- "\aentries\x18\x06 \x03(\v2\x1d.vev.wire.v1.RecentRouteEntryR\aentries\"\xa2\x01\n" +
2391+ "\aentries\x18\x06 \x03(\v2\x1d.vev.wire.v1.RecentRouteEntryR\aentries\x12,\n" +
2392+ "\x05hosts\x18\a \x03(\v2\x16.vev.wire.v1.RouteHostR\x05hosts\"\xa2\x01\n" +
22962393 "\x15RouteNavigationAction\x12&\n" +
22972394 "\x0fcause_action_id\x18\x01 \x01(\x04R\rcauseActionId\x12/\n" +
22982395 "\x13snapshot_generation\x18\x02 \x01(\x04R\x12snapshotGeneration\x12\x10\n" +
@@ -2371,7 +2468,7 @@ func file_session_proto_rawDescGZIP() []byte {
23712468 return file_session_proto_rawDescData
23722469 }
23732470
2374-var file_session_proto_msgTypes = make([]protoimpl.MessageInfo, 32)
2471+var file_session_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
23752472 var file_session_proto_goTypes = []any{
23762473 (*Hello)(nil), // 0: vev.wire.v1.Hello
23772474 (*Welcome)(nil), // 1: vev.wire.v1.Welcome
@@ -2392,52 +2489,54 @@ var file_session_proto_goTypes = []any{
23922489 (*RouteAttentionTarget)(nil), // 16: vev.wire.v1.RouteAttentionTarget
23932490 (*RouteAttentionSubscription)(nil), // 17: vev.wire.v1.RouteAttentionSubscription
23942491 (*RecentRouteEntry)(nil), // 18: vev.wire.v1.RecentRouteEntry
2395- (*RecentRouteSnapshot)(nil), // 19: vev.wire.v1.RecentRouteSnapshot
2396- (*RouteNavigationAction)(nil), // 20: vev.wire.v1.RouteNavigationAction
2397- (*RouteCreateSessionAction)(nil), // 21: vev.wire.v1.RouteCreateSessionAction
2398- (*RouteNavigationFailure)(nil), // 22: vev.wire.v1.RouteNavigationFailure
2399- (*SessionCreationFailure)(nil), // 23: vev.wire.v1.SessionCreationFailure
2400- (*RoutePosition)(nil), // 24: vev.wire.v1.RoutePosition
2401- (*RouteRetired)(nil), // 25: vev.wire.v1.RouteRetired
2402- (*SamePeerSwitchRequest)(nil), // 26: vev.wire.v1.SamePeerSwitchRequest
2403- (*SamePeerSwitchFailure)(nil), // 27: vev.wire.v1.SamePeerSwitchFailure
2404- (*SuspendAttachment)(nil), // 28: vev.wire.v1.SuspendAttachment
2405- (*AttachmentSuspended)(nil), // 29: vev.wire.v1.AttachmentSuspended
2406- (*ActivateAttachment)(nil), // 30: vev.wire.v1.ActivateAttachment
2407- (*AttachmentActivated)(nil), // 31: vev.wire.v1.AttachmentActivated
2408- (*ExactTarget)(nil), // 32: vev.wire.v1.ExactTarget
2409- (*SessionAttachTarget)(nil), // 33: vev.wire.v1.SessionAttachTarget
2492+ (*RouteHost)(nil), // 19: vev.wire.v1.RouteHost
2493+ (*RecentRouteSnapshot)(nil), // 20: vev.wire.v1.RecentRouteSnapshot
2494+ (*RouteNavigationAction)(nil), // 21: vev.wire.v1.RouteNavigationAction
2495+ (*RouteCreateSessionAction)(nil), // 22: vev.wire.v1.RouteCreateSessionAction
2496+ (*RouteNavigationFailure)(nil), // 23: vev.wire.v1.RouteNavigationFailure
2497+ (*SessionCreationFailure)(nil), // 24: vev.wire.v1.SessionCreationFailure
2498+ (*RoutePosition)(nil), // 25: vev.wire.v1.RoutePosition
2499+ (*RouteRetired)(nil), // 26: vev.wire.v1.RouteRetired
2500+ (*SamePeerSwitchRequest)(nil), // 27: vev.wire.v1.SamePeerSwitchRequest
2501+ (*SamePeerSwitchFailure)(nil), // 28: vev.wire.v1.SamePeerSwitchFailure
2502+ (*SuspendAttachment)(nil), // 29: vev.wire.v1.SuspendAttachment
2503+ (*AttachmentSuspended)(nil), // 30: vev.wire.v1.AttachmentSuspended
2504+ (*ActivateAttachment)(nil), // 31: vev.wire.v1.ActivateAttachment
2505+ (*AttachmentActivated)(nil), // 32: vev.wire.v1.AttachmentActivated
2506+ (*ExactTarget)(nil), // 33: vev.wire.v1.ExactTarget
2507+ (*SessionAttachTarget)(nil), // 34: vev.wire.v1.SessionAttachTarget
24102508 }
24112509 var file_session_proto_depIdxs = []int32{
2412- 32, // 0: vev.wire.v1.Hello.exact_target:type_name -> vev.wire.v1.ExactTarget
2413- 33, // 1: vev.wire.v1.Hello.session_target:type_name -> vev.wire.v1.SessionAttachTarget
2510+ 33, // 0: vev.wire.v1.Hello.exact_target:type_name -> vev.wire.v1.ExactTarget
2511+ 34, // 1: vev.wire.v1.Hello.session_target:type_name -> vev.wire.v1.SessionAttachTarget
24142512 3, // 2: vev.wire.v1.Welcome.committed_identity:type_name -> vev.wire.v1.CommittedRouteIdentity
2415- 32, // 3: vev.wire.v1.CommittedRouteIdentity.target:type_name -> vev.wire.v1.ExactTarget
2416- 32, // 4: vev.wire.v1.AttachTarget.exact_target:type_name -> vev.wire.v1.ExactTarget
2417- 33, // 5: vev.wire.v1.AttachTarget.session_target:type_name -> vev.wire.v1.SessionAttachTarget
2513+ 33, // 3: vev.wire.v1.CommittedRouteIdentity.target:type_name -> vev.wire.v1.ExactTarget
2514+ 33, // 4: vev.wire.v1.AttachTarget.exact_target:type_name -> vev.wire.v1.ExactTarget
2515+ 34, // 5: vev.wire.v1.AttachTarget.session_target:type_name -> vev.wire.v1.SessionAttachTarget
24182516 5, // 6: vev.wire.v1.Sessions.sessions:type_name -> vev.wire.v1.SessionInfo
24192517 8, // 7: vev.wire.v1.KillResult.failures:type_name -> vev.wire.v1.KillFailure
24202518 15, // 8: vev.wire.v1.RouteAttentionTarget.ref:type_name -> vev.wire.v1.RouteRef
2421- 32, // 9: vev.wire.v1.RouteAttentionTarget.target:type_name -> vev.wire.v1.ExactTarget
2519+ 33, // 9: vev.wire.v1.RouteAttentionTarget.target:type_name -> vev.wire.v1.ExactTarget
24222520 16, // 10: vev.wire.v1.RouteAttentionSubscription.targets:type_name -> vev.wire.v1.RouteAttentionTarget
2423- 32, // 11: vev.wire.v1.RecentRouteEntry.target:type_name -> vev.wire.v1.ExactTarget
2521+ 33, // 11: vev.wire.v1.RecentRouteEntry.target:type_name -> vev.wire.v1.ExactTarget
24242522 15, // 12: vev.wire.v1.RecentRouteSnapshot.active:type_name -> vev.wire.v1.RouteRef
24252523 18, // 13: vev.wire.v1.RecentRouteSnapshot.active_entry:type_name -> vev.wire.v1.RecentRouteEntry
24262524 15, // 14: vev.wire.v1.RecentRouteSnapshot.previous:type_name -> vev.wire.v1.RouteRef
24272525 15, // 15: vev.wire.v1.RecentRouteSnapshot.home:type_name -> vev.wire.v1.RouteRef
24282526 18, // 16: vev.wire.v1.RecentRouteSnapshot.entries:type_name -> vev.wire.v1.RecentRouteEntry
2429- 32, // 17: vev.wire.v1.RoutePosition.target:type_name -> vev.wire.v1.ExactTarget
2430- 15, // 18: vev.wire.v1.RouteRetired.ref:type_name -> vev.wire.v1.RouteRef
2431- 32, // 19: vev.wire.v1.RouteRetired.target:type_name -> vev.wire.v1.ExactTarget
2432- 32, // 20: vev.wire.v1.SamePeerSwitchRequest.target:type_name -> vev.wire.v1.ExactTarget
2433- 32, // 21: vev.wire.v1.AttachmentSuspended.target:type_name -> vev.wire.v1.ExactTarget
2434- 32, // 22: vev.wire.v1.ActivateAttachment.target:type_name -> vev.wire.v1.ExactTarget
2435- 3, // 23: vev.wire.v1.AttachmentActivated.identity:type_name -> vev.wire.v1.CommittedRouteIdentity
2436- 24, // [24:24] is the sub-list for method output_type
2437- 24, // [24:24] is the sub-list for method input_type
2438- 24, // [24:24] is the sub-list for extension type_name
2439- 24, // [24:24] is the sub-list for extension extendee
2440- 0, // [0:24] is the sub-list for field type_name
2527+ 19, // 17: vev.wire.v1.RecentRouteSnapshot.hosts:type_name -> vev.wire.v1.RouteHost
2528+ 33, // 18: vev.wire.v1.RoutePosition.target:type_name -> vev.wire.v1.ExactTarget
2529+ 15, // 19: vev.wire.v1.RouteRetired.ref:type_name -> vev.wire.v1.RouteRef
2530+ 33, // 20: vev.wire.v1.RouteRetired.target:type_name -> vev.wire.v1.ExactTarget
2531+ 33, // 21: vev.wire.v1.SamePeerSwitchRequest.target:type_name -> vev.wire.v1.ExactTarget
2532+ 33, // 22: vev.wire.v1.AttachmentSuspended.target:type_name -> vev.wire.v1.ExactTarget
2533+ 33, // 23: vev.wire.v1.ActivateAttachment.target:type_name -> vev.wire.v1.ExactTarget
2534+ 3, // 24: vev.wire.v1.AttachmentActivated.identity:type_name -> vev.wire.v1.CommittedRouteIdentity
2535+ 25, // [25:25] is the sub-list for method output_type
2536+ 25, // [25:25] is the sub-list for method input_type
2537+ 25, // [25:25] is the sub-list for extension type_name
2538+ 25, // [25:25] is the sub-list for extension extendee
2539+ 0, // [0:25] is the sub-list for field type_name
24412540 }
24422541
24432542 func init() { file_session_proto_init() }
@@ -2452,7 +2551,7 @@ func file_session_proto_init() {
24522551 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
24532552 RawDescriptor: unsafe.Slice(unsafe.StringData(file_session_proto_rawDesc), len(file_session_proto_rawDesc)),
24542553 NumEnums: 0,
2455- NumMessages: 32,
2554+ NumMessages: 33,
24562555 NumExtensions: 0,
24572556 NumServices: 0,
24582557 },
@@ -1232,7 +1232,9 @@ type RecentRouteEntry struct {
1232 Ephemeral bool `protobuf:"varint,7,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"`1232 Ephemeral bool `protobuf:"varint,7,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"`
1233 Attention bool `protobuf:"varint,8,opt,name=attention,proto3" json:"attention,omitempty"`1233 Attention bool `protobuf:"varint,8,opt,name=attention,proto3" json:"attention,omitempty"`
1234 // Closed reachability taxonomy: 0 = unknown, 1 = reachable, 2 = unavailable.1234 // Closed reachability taxonomy: 0 = unknown, 1 = reachable, 2 = unavailable.
1235- Reachability uint32 `protobuf:"varint,9,opt,name=reachability,proto3" json:"reachability,omitempty"`1235+ Reachability uint32 `protobuf:"varint,9,opt,name=reachability,proto3" json:"reachability,omitempty"`
1236+ // Client-assigned attention onset order; zero without attention.
1237+ AttentionSeq uint64 `protobuf:"varint,10,opt,name=attention_seq,json=attentionSeq,proto3" json:"attention_seq,omitempty"`
1236 unknownFields protoimpl.UnknownFields1238 unknownFields protoimpl.UnknownFields
1237 sizeCache protoimpl.SizeCache1239 sizeCache protoimpl.SizeCache
1238 }1240 }
@@ -1330,6 +1332,83 @@ func (x *RecentRouteEntry) GetReachability() uint32 {
1330 return 01332 return 0
1331 }1333 }
1332 1334
1335+func (x *RecentRouteEntry) GetAttentionSeq() uint64 {
1336+ if x != nil {
1337+ return x.AttentionSeq
1338+ }
1339+ return 0
1340+}
1341+
1342+// RouteHost is one creation destination other than the serving daemon.
1343+type RouteHost struct {
1344+ state protoimpl.MessageState `protogen:"open.v1"`
1345+ Key uint64 `protobuf:"varint,1,opt,name=key,proto3" json:"key,omitempty"`
1346+ Generation uint64 `protobuf:"varint,2,opt,name=generation,proto3" json:"generation,omitempty"`
1347+ Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
1348+ // Closed kind taxonomy: 1 = local, 2 = remote.
1349+ Kind uint32 `protobuf:"varint,4,opt,name=kind,proto3" json:"kind,omitempty"`
1350+ unknownFields protoimpl.UnknownFields
1351+ sizeCache protoimpl.SizeCache
1352+}
1353+
1354+func (x *RouteHost) Reset() {
1355+ *x = RouteHost{}
1356+ mi := &file_session_proto_msgTypes[19]
1357+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1358+ ms.StoreMessageInfo(mi)
1359+}
1360+
1361+func (x *RouteHost) String() string {
1362+ return protoimpl.X.MessageStringOf(x)
1363+}
1364+
1365+func (*RouteHost) ProtoMessage() {}
1366+
1367+func (x *RouteHost) ProtoReflect() protoreflect.Message {
1368+ mi := &file_session_proto_msgTypes[19]
1369+ if x != nil {
1370+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1371+ if ms.LoadMessageInfo() == nil {
1372+ ms.StoreMessageInfo(mi)
1373+ }
1374+ return ms
1375+ }
1376+ return mi.MessageOf(x)
1377+}
1378+
1379+// Deprecated: Use RouteHost.ProtoReflect.Descriptor instead.
1380+func (*RouteHost) Descriptor() ([]byte, []int) {
1381+ return file_session_proto_rawDescGZIP(), []int{19}
1382+}
1383+
1384+func (x *RouteHost) GetKey() uint64 {
1385+ if x != nil {
1386+ return x.Key
1387+ }
1388+ return 0
1389+}
1390+
1391+func (x *RouteHost) GetGeneration() uint64 {
1392+ if x != nil {
1393+ return x.Generation
1394+ }
1395+ return 0
1396+}
1397+
1398+func (x *RouteHost) GetLabel() string {
1399+ if x != nil {
1400+ return x.Label
1401+ }
1402+ return ""
1403+}
1404+
1405+func (x *RouteHost) GetKind() uint32 {
1406+ if x != nil {
1407+ return x.Kind
1408+ }
1409+ return 0
1410+}
1411+
1333 // RecentRouteSnapshot is an immutable bounded route publication.1412 // RecentRouteSnapshot is an immutable bounded route publication.
1334 type RecentRouteSnapshot struct {1413 type RecentRouteSnapshot struct {
1335 state protoimpl.MessageState `protogen:"open.v1"`1414 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1339,13 +1418,14 @@ type RecentRouteSnapshot struct {
1339 Previous *RouteRef `protobuf:"bytes,4,opt,name=previous,proto3" json:"previous,omitempty"`1418 Previous *RouteRef `protobuf:"bytes,4,opt,name=previous,proto3" json:"previous,omitempty"`
1340 Home *RouteRef `protobuf:"bytes,5,opt,name=home,proto3" json:"home,omitempty"`1419 Home *RouteRef `protobuf:"bytes,5,opt,name=home,proto3" json:"home,omitempty"`
1341 Entries []*RecentRouteEntry `protobuf:"bytes,6,rep,name=entries,proto3" json:"entries,omitempty"`1420 Entries []*RecentRouteEntry `protobuf:"bytes,6,rep,name=entries,proto3" json:"entries,omitempty"`
1421+ Hosts []*RouteHost `protobuf:"bytes,7,rep,name=hosts,proto3" json:"hosts,omitempty"`
1342 unknownFields protoimpl.UnknownFields1422 unknownFields protoimpl.UnknownFields
1343 sizeCache protoimpl.SizeCache1423 sizeCache protoimpl.SizeCache
1344 }1424 }
1345 1425
1346 func (x *RecentRouteSnapshot) Reset() {1426 func (x *RecentRouteSnapshot) Reset() {
1347 *x = RecentRouteSnapshot{}1427 *x = RecentRouteSnapshot{}
1348- mi := &file_session_proto_msgTypes[19]1428+ mi := &file_session_proto_msgTypes[20]
1349 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1429 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1350 ms.StoreMessageInfo(mi)1430 ms.StoreMessageInfo(mi)
1351 }1431 }
@@ -1357,7 +1437,7 @@ func (x *RecentRouteSnapshot) String() string {
1357 func (*RecentRouteSnapshot) ProtoMessage() {}1437 func (*RecentRouteSnapshot) ProtoMessage() {}
1358 1438
1359 func (x *RecentRouteSnapshot) ProtoReflect() protoreflect.Message {1439 func (x *RecentRouteSnapshot) ProtoReflect() protoreflect.Message {
1360- mi := &file_session_proto_msgTypes[19]1440+ mi := &file_session_proto_msgTypes[20]
1361 if x != nil {1441 if x != nil {
1362 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1442 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1363 if ms.LoadMessageInfo() == nil {1443 if ms.LoadMessageInfo() == nil {
@@ -1370,7 +1450,7 @@ func (x *RecentRouteSnapshot) ProtoReflect() protoreflect.Message {
1370 1450
1371 // Deprecated: Use RecentRouteSnapshot.ProtoReflect.Descriptor instead.1451 // Deprecated: Use RecentRouteSnapshot.ProtoReflect.Descriptor instead.
1372 func (*RecentRouteSnapshot) Descriptor() ([]byte, []int) {1452 func (*RecentRouteSnapshot) Descriptor() ([]byte, []int) {
1373- return file_session_proto_rawDescGZIP(), []int{19}1453+ return file_session_proto_rawDescGZIP(), []int{20}
1374 }1454 }
1375 1455
1376 func (x *RecentRouteSnapshot) GetGeneration() uint64 {1456 func (x *RecentRouteSnapshot) GetGeneration() uint64 {
@@ -1415,6 +1495,13 @@ func (x *RecentRouteSnapshot) GetEntries() []*RecentRouteEntry {
1415 return nil1495 return nil
1416 }1496 }
1417 1497
1498+func (x *RecentRouteSnapshot) GetHosts() []*RouteHost {
1499+ if x != nil {
1500+ return x.Hosts
1501+ }
1502+ return nil
1503+}
1504+
1418 // RouteNavigationAction asks the client to resolve one ledger entry.1505 // RouteNavigationAction asks the client to resolve one ledger entry.
1419 type RouteNavigationAction struct {1506 type RouteNavigationAction struct {
1420 state protoimpl.MessageState `protogen:"open.v1"`1507 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1428,7 +1515,7 @@ type RouteNavigationAction struct {
1428 1515
1429 func (x *RouteNavigationAction) Reset() {1516 func (x *RouteNavigationAction) Reset() {
1430 *x = RouteNavigationAction{}1517 *x = RouteNavigationAction{}
1431- mi := &file_session_proto_msgTypes[20]1518+ mi := &file_session_proto_msgTypes[21]
1432 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1519 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1433 ms.StoreMessageInfo(mi)1520 ms.StoreMessageInfo(mi)
1434 }1521 }
@@ -1440,7 +1527,7 @@ func (x *RouteNavigationAction) String() string {
1440 func (*RouteNavigationAction) ProtoMessage() {}1527 func (*RouteNavigationAction) ProtoMessage() {}
1441 1528
1442 func (x *RouteNavigationAction) ProtoReflect() protoreflect.Message {1529 func (x *RouteNavigationAction) ProtoReflect() protoreflect.Message {
1443- mi := &file_session_proto_msgTypes[20]1530+ mi := &file_session_proto_msgTypes[21]
1444 if x != nil {1531 if x != nil {
1445 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1532 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1446 if ms.LoadMessageInfo() == nil {1533 if ms.LoadMessageInfo() == nil {
@@ -1453,7 +1540,7 @@ func (x *RouteNavigationAction) ProtoReflect() protoreflect.Message {
1453 1540
1454 // Deprecated: Use RouteNavigationAction.ProtoReflect.Descriptor instead.1541 // Deprecated: Use RouteNavigationAction.ProtoReflect.Descriptor instead.
1455 func (*RouteNavigationAction) Descriptor() ([]byte, []int) {1542 func (*RouteNavigationAction) Descriptor() ([]byte, []int) {
1456- return file_session_proto_rawDescGZIP(), []int{20}1543+ return file_session_proto_rawDescGZIP(), []int{21}
1457 }1544 }
1458 1545
1459 func (x *RouteNavigationAction) GetCauseActionId() uint64 {1546 func (x *RouteNavigationAction) GetCauseActionId() uint64 {
@@ -1499,7 +1586,7 @@ type RouteCreateSessionAction struct {
1499 1586
1500 func (x *RouteCreateSessionAction) Reset() {1587 func (x *RouteCreateSessionAction) Reset() {
1501 *x = RouteCreateSessionAction{}1588 *x = RouteCreateSessionAction{}
1502- mi := &file_session_proto_msgTypes[21]1589+ mi := &file_session_proto_msgTypes[22]
1503 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1590 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1504 ms.StoreMessageInfo(mi)1591 ms.StoreMessageInfo(mi)
1505 }1592 }
@@ -1511,7 +1598,7 @@ func (x *RouteCreateSessionAction) String() string {
1511 func (*RouteCreateSessionAction) ProtoMessage() {}1598 func (*RouteCreateSessionAction) ProtoMessage() {}
1512 1599
1513 func (x *RouteCreateSessionAction) ProtoReflect() protoreflect.Message {1600 func (x *RouteCreateSessionAction) ProtoReflect() protoreflect.Message {
1514- mi := &file_session_proto_msgTypes[21]1601+ mi := &file_session_proto_msgTypes[22]
1515 if x != nil {1602 if x != nil {
1516 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1603 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1517 if ms.LoadMessageInfo() == nil {1604 if ms.LoadMessageInfo() == nil {
@@ -1524,7 +1611,7 @@ func (x *RouteCreateSessionAction) ProtoReflect() protoreflect.Message {
1524 1611
1525 // Deprecated: Use RouteCreateSessionAction.ProtoReflect.Descriptor instead.1612 // Deprecated: Use RouteCreateSessionAction.ProtoReflect.Descriptor instead.
1526 func (*RouteCreateSessionAction) Descriptor() ([]byte, []int) {1613 func (*RouteCreateSessionAction) Descriptor() ([]byte, []int) {
1527- return file_session_proto_rawDescGZIP(), []int{21}1614+ return file_session_proto_rawDescGZIP(), []int{22}
1528 }1615 }
1529 1616
1530 func (x *RouteCreateSessionAction) GetCauseActionId() uint64 {1617 func (x *RouteCreateSessionAction) GetCauseActionId() uint64 {
@@ -1584,7 +1671,7 @@ type RouteNavigationFailure struct {
1584 1671
1585 func (x *RouteNavigationFailure) Reset() {1672 func (x *RouteNavigationFailure) Reset() {
1586 *x = RouteNavigationFailure{}1673 *x = RouteNavigationFailure{}
1587- mi := &file_session_proto_msgTypes[22]1674+ mi := &file_session_proto_msgTypes[23]
1588 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1675 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1589 ms.StoreMessageInfo(mi)1676 ms.StoreMessageInfo(mi)
1590 }1677 }
@@ -1596,7 +1683,7 @@ func (x *RouteNavigationFailure) String() string {
1596 func (*RouteNavigationFailure) ProtoMessage() {}1683 func (*RouteNavigationFailure) ProtoMessage() {}
1597 1684
1598 func (x *RouteNavigationFailure) ProtoReflect() protoreflect.Message {1685 func (x *RouteNavigationFailure) ProtoReflect() protoreflect.Message {
1599- mi := &file_session_proto_msgTypes[22]1686+ mi := &file_session_proto_msgTypes[23]
1600 if x != nil {1687 if x != nil {
1601 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1688 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1602 if ms.LoadMessageInfo() == nil {1689 if ms.LoadMessageInfo() == nil {
@@ -1609,7 +1696,7 @@ func (x *RouteNavigationFailure) ProtoReflect() protoreflect.Message {
1609 1696
1610 // Deprecated: Use RouteNavigationFailure.ProtoReflect.Descriptor instead.1697 // Deprecated: Use RouteNavigationFailure.ProtoReflect.Descriptor instead.
1611 func (*RouteNavigationFailure) Descriptor() ([]byte, []int) {1698 func (*RouteNavigationFailure) Descriptor() ([]byte, []int) {
1612- return file_session_proto_rawDescGZIP(), []int{22}1699+ return file_session_proto_rawDescGZIP(), []int{23}
1613 }1700 }
1614 1701
1615 func (x *RouteNavigationFailure) GetKey() uint64 {1702 func (x *RouteNavigationFailure) GetKey() uint64 {
@@ -1644,7 +1731,7 @@ type SessionCreationFailure struct {
1644 1731
1645 func (x *SessionCreationFailure) Reset() {1732 func (x *SessionCreationFailure) Reset() {
1646 *x = SessionCreationFailure{}1733 *x = SessionCreationFailure{}
1647- mi := &file_session_proto_msgTypes[23]1734+ mi := &file_session_proto_msgTypes[24]
1648 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1735 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1649 ms.StoreMessageInfo(mi)1736 ms.StoreMessageInfo(mi)
1650 }1737 }
@@ -1656,7 +1743,7 @@ func (x *SessionCreationFailure) String() string {
1656 func (*SessionCreationFailure) ProtoMessage() {}1743 func (*SessionCreationFailure) ProtoMessage() {}
1657 1744
1658 func (x *SessionCreationFailure) ProtoReflect() protoreflect.Message {1745 func (x *SessionCreationFailure) ProtoReflect() protoreflect.Message {
1659- mi := &file_session_proto_msgTypes[23]1746+ mi := &file_session_proto_msgTypes[24]
1660 if x != nil {1747 if x != nil {
1661 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1748 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1662 if ms.LoadMessageInfo() == nil {1749 if ms.LoadMessageInfo() == nil {
@@ -1669,7 +1756,7 @@ func (x *SessionCreationFailure) ProtoReflect() protoreflect.Message {
1669 1756
1670 // Deprecated: Use SessionCreationFailure.ProtoReflect.Descriptor instead.1757 // Deprecated: Use SessionCreationFailure.ProtoReflect.Descriptor instead.
1671 func (*SessionCreationFailure) Descriptor() ([]byte, []int) {1758 func (*SessionCreationFailure) Descriptor() ([]byte, []int) {
1672- return file_session_proto_rawDescGZIP(), []int{23}1759+ return file_session_proto_rawDescGZIP(), []int{24}
1673 }1760 }
1674 1761
1675 func (x *SessionCreationFailure) GetRequestId() uint64 {1762 func (x *SessionCreationFailure) GetRequestId() uint64 {
@@ -1697,7 +1784,7 @@ type RoutePosition struct {
1697 1784
1698 func (x *RoutePosition) Reset() {1785 func (x *RoutePosition) Reset() {
1699 *x = RoutePosition{}1786 *x = RoutePosition{}
1700- mi := &file_session_proto_msgTypes[24]1787+ mi := &file_session_proto_msgTypes[25]
1701 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1788 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1702 ms.StoreMessageInfo(mi)1789 ms.StoreMessageInfo(mi)
1703 }1790 }
@@ -1709,7 +1796,7 @@ func (x *RoutePosition) String() string {
1709 func (*RoutePosition) ProtoMessage() {}1796 func (*RoutePosition) ProtoMessage() {}
1710 1797
1711 func (x *RoutePosition) ProtoReflect() protoreflect.Message {1798 func (x *RoutePosition) ProtoReflect() protoreflect.Message {
1712- mi := &file_session_proto_msgTypes[24]1799+ mi := &file_session_proto_msgTypes[25]
1713 if x != nil {1800 if x != nil {
1714 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1801 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1715 if ms.LoadMessageInfo() == nil {1802 if ms.LoadMessageInfo() == nil {
@@ -1722,7 +1809,7 @@ func (x *RoutePosition) ProtoReflect() protoreflect.Message {
1722 1809
1723 // Deprecated: Use RoutePosition.ProtoReflect.Descriptor instead.1810 // Deprecated: Use RoutePosition.ProtoReflect.Descriptor instead.
1724 func (*RoutePosition) Descriptor() ([]byte, []int) {1811 func (*RoutePosition) Descriptor() ([]byte, []int) {
1725- return file_session_proto_rawDescGZIP(), []int{24}1812+ return file_session_proto_rawDescGZIP(), []int{25}
1726 }1813 }
1727 1814
1728 func (x *RoutePosition) GetTarget() *ExactTarget {1815 func (x *RoutePosition) GetTarget() *ExactTarget {
@@ -1750,7 +1837,7 @@ type RouteRetired struct {
1750 1837
1751 func (x *RouteRetired) Reset() {1838 func (x *RouteRetired) Reset() {
1752 *x = RouteRetired{}1839 *x = RouteRetired{}
1753- mi := &file_session_proto_msgTypes[25]1840+ mi := &file_session_proto_msgTypes[26]
1754 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1841 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1755 ms.StoreMessageInfo(mi)1842 ms.StoreMessageInfo(mi)
1756 }1843 }
@@ -1762,7 +1849,7 @@ func (x *RouteRetired) String() string {
1762 func (*RouteRetired) ProtoMessage() {}1849 func (*RouteRetired) ProtoMessage() {}
1763 1850
1764 func (x *RouteRetired) ProtoReflect() protoreflect.Message {1851 func (x *RouteRetired) ProtoReflect() protoreflect.Message {
1765- mi := &file_session_proto_msgTypes[25]1852+ mi := &file_session_proto_msgTypes[26]
1766 if x != nil {1853 if x != nil {
1767 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1854 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1768 if ms.LoadMessageInfo() == nil {1855 if ms.LoadMessageInfo() == nil {
@@ -1775,7 +1862,7 @@ func (x *RouteRetired) ProtoReflect() protoreflect.Message {
1775 1862
1776 // Deprecated: Use RouteRetired.ProtoReflect.Descriptor instead.1863 // Deprecated: Use RouteRetired.ProtoReflect.Descriptor instead.
1777 func (*RouteRetired) Descriptor() ([]byte, []int) {1864 func (*RouteRetired) Descriptor() ([]byte, []int) {
1778- return file_session_proto_rawDescGZIP(), []int{25}1865+ return file_session_proto_rawDescGZIP(), []int{26}
1779 }1866 }
1780 1867
1781 func (x *RouteRetired) GetRef() *RouteRef {1868 func (x *RouteRetired) GetRef() *RouteRef {
@@ -1804,7 +1891,7 @@ type SamePeerSwitchRequest struct {
1804 1891
1805 func (x *SamePeerSwitchRequest) Reset() {1892 func (x *SamePeerSwitchRequest) Reset() {
1806 *x = SamePeerSwitchRequest{}1893 *x = SamePeerSwitchRequest{}
1807- mi := &file_session_proto_msgTypes[26]1894+ mi := &file_session_proto_msgTypes[27]
1808 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1895 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1809 ms.StoreMessageInfo(mi)1896 ms.StoreMessageInfo(mi)
1810 }1897 }
@@ -1816,7 +1903,7 @@ func (x *SamePeerSwitchRequest) String() string {
1816 func (*SamePeerSwitchRequest) ProtoMessage() {}1903 func (*SamePeerSwitchRequest) ProtoMessage() {}
1817 1904
1818 func (x *SamePeerSwitchRequest) ProtoReflect() protoreflect.Message {1905 func (x *SamePeerSwitchRequest) ProtoReflect() protoreflect.Message {
1819- mi := &file_session_proto_msgTypes[26]1906+ mi := &file_session_proto_msgTypes[27]
1820 if x != nil {1907 if x != nil {
1821 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1908 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1822 if ms.LoadMessageInfo() == nil {1909 if ms.LoadMessageInfo() == nil {
@@ -1829,7 +1916,7 @@ func (x *SamePeerSwitchRequest) ProtoReflect() protoreflect.Message {
1829 1916
1830 // Deprecated: Use SamePeerSwitchRequest.ProtoReflect.Descriptor instead.1917 // Deprecated: Use SamePeerSwitchRequest.ProtoReflect.Descriptor instead.
1831 func (*SamePeerSwitchRequest) Descriptor() ([]byte, []int) {1918 func (*SamePeerSwitchRequest) Descriptor() ([]byte, []int) {
1832- return file_session_proto_rawDescGZIP(), []int{26}1919+ return file_session_proto_rawDescGZIP(), []int{27}
1833 }1920 }
1834 1921
1835 func (x *SamePeerSwitchRequest) GetRequestId() uint64 {1922 func (x *SamePeerSwitchRequest) GetRequestId() uint64 {
@@ -1865,7 +1952,7 @@ type SamePeerSwitchFailure struct {
1865 1952
1866 func (x *SamePeerSwitchFailure) Reset() {1953 func (x *SamePeerSwitchFailure) Reset() {
1867 *x = SamePeerSwitchFailure{}1954 *x = SamePeerSwitchFailure{}
1868- mi := &file_session_proto_msgTypes[27]1955+ mi := &file_session_proto_msgTypes[28]
1869 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1956 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1870 ms.StoreMessageInfo(mi)1957 ms.StoreMessageInfo(mi)
1871 }1958 }
@@ -1877,7 +1964,7 @@ func (x *SamePeerSwitchFailure) String() string {
1877 func (*SamePeerSwitchFailure) ProtoMessage() {}1964 func (*SamePeerSwitchFailure) ProtoMessage() {}
1878 1965
1879 func (x *SamePeerSwitchFailure) ProtoReflect() protoreflect.Message {1966 func (x *SamePeerSwitchFailure) ProtoReflect() protoreflect.Message {
1880- mi := &file_session_proto_msgTypes[27]1967+ mi := &file_session_proto_msgTypes[28]
1881 if x != nil {1968 if x != nil {
1882 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1969 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1883 if ms.LoadMessageInfo() == nil {1970 if ms.LoadMessageInfo() == nil {
@@ -1890,7 +1977,7 @@ func (x *SamePeerSwitchFailure) ProtoReflect() protoreflect.Message {
1890 1977
1891 // Deprecated: Use SamePeerSwitchFailure.ProtoReflect.Descriptor instead.1978 // Deprecated: Use SamePeerSwitchFailure.ProtoReflect.Descriptor instead.
1892 func (*SamePeerSwitchFailure) Descriptor() ([]byte, []int) {1979 func (*SamePeerSwitchFailure) Descriptor() ([]byte, []int) {
1893- return file_session_proto_rawDescGZIP(), []int{27}1980+ return file_session_proto_rawDescGZIP(), []int{28}
1894 }1981 }
1895 1982
1896 func (x *SamePeerSwitchFailure) GetRequestId() uint64 {1983 func (x *SamePeerSwitchFailure) GetRequestId() uint64 {
@@ -1917,7 +2004,7 @@ type SuspendAttachment struct {
1917 2004
1918 func (x *SuspendAttachment) Reset() {2005 func (x *SuspendAttachment) Reset() {
1919 *x = SuspendAttachment{}2006 *x = SuspendAttachment{}
1920- mi := &file_session_proto_msgTypes[28]2007+ mi := &file_session_proto_msgTypes[29]
1921 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2008 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1922 ms.StoreMessageInfo(mi)2009 ms.StoreMessageInfo(mi)
1923 }2010 }
@@ -1929,7 +2016,7 @@ func (x *SuspendAttachment) String() string {
1929 func (*SuspendAttachment) ProtoMessage() {}2016 func (*SuspendAttachment) ProtoMessage() {}
1930 2017
1931 func (x *SuspendAttachment) ProtoReflect() protoreflect.Message {2018 func (x *SuspendAttachment) ProtoReflect() protoreflect.Message {
1932- mi := &file_session_proto_msgTypes[28]2019+ mi := &file_session_proto_msgTypes[29]
1933 if x != nil {2020 if x != nil {
1934 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2021 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1935 if ms.LoadMessageInfo() == nil {2022 if ms.LoadMessageInfo() == nil {
@@ -1942,7 +2029,7 @@ func (x *SuspendAttachment) ProtoReflect() protoreflect.Message {
1942 2029
1943 // Deprecated: Use SuspendAttachment.ProtoReflect.Descriptor instead.2030 // Deprecated: Use SuspendAttachment.ProtoReflect.Descriptor instead.
1944 func (*SuspendAttachment) Descriptor() ([]byte, []int) {2031 func (*SuspendAttachment) Descriptor() ([]byte, []int) {
1945- return file_session_proto_rawDescGZIP(), []int{28}2032+ return file_session_proto_rawDescGZIP(), []int{29}
1946 }2033 }
1947 2034
1948 func (x *SuspendAttachment) GetRequestId() uint64 {2035 func (x *SuspendAttachment) GetRequestId() uint64 {
@@ -1963,7 +2050,7 @@ type AttachmentSuspended struct {
1963 2050
1964 func (x *AttachmentSuspended) Reset() {2051 func (x *AttachmentSuspended) Reset() {
1965 *x = AttachmentSuspended{}2052 *x = AttachmentSuspended{}
1966- mi := &file_session_proto_msgTypes[29]2053+ mi := &file_session_proto_msgTypes[30]
1967 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2054 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1968 ms.StoreMessageInfo(mi)2055 ms.StoreMessageInfo(mi)
1969 }2056 }
@@ -1975,7 +2062,7 @@ func (x *AttachmentSuspended) String() string {
1975 func (*AttachmentSuspended) ProtoMessage() {}2062 func (*AttachmentSuspended) ProtoMessage() {}
1976 2063
1977 func (x *AttachmentSuspended) ProtoReflect() protoreflect.Message {2064 func (x *AttachmentSuspended) ProtoReflect() protoreflect.Message {
1978- mi := &file_session_proto_msgTypes[29]2065+ mi := &file_session_proto_msgTypes[30]
1979 if x != nil {2066 if x != nil {
1980 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2067 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1981 if ms.LoadMessageInfo() == nil {2068 if ms.LoadMessageInfo() == nil {
@@ -1988,7 +2075,7 @@ func (x *AttachmentSuspended) ProtoReflect() protoreflect.Message {
1988 2075
1989 // Deprecated: Use AttachmentSuspended.ProtoReflect.Descriptor instead.2076 // Deprecated: Use AttachmentSuspended.ProtoReflect.Descriptor instead.
1990 func (*AttachmentSuspended) Descriptor() ([]byte, []int) {2077 func (*AttachmentSuspended) Descriptor() ([]byte, []int) {
1991- return file_session_proto_rawDescGZIP(), []int{29}2078+ return file_session_proto_rawDescGZIP(), []int{30}
1992 }2079 }
1993 2080
1994 func (x *AttachmentSuspended) GetRequestId() uint64 {2081 func (x *AttachmentSuspended) GetRequestId() uint64 {
@@ -2020,7 +2107,7 @@ type ActivateAttachment struct {
2020 2107
2021 func (x *ActivateAttachment) Reset() {2108 func (x *ActivateAttachment) Reset() {
2022 *x = ActivateAttachment{}2109 *x = ActivateAttachment{}
2023- mi := &file_session_proto_msgTypes[30]2110+ mi := &file_session_proto_msgTypes[31]
2024 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2111 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2025 ms.StoreMessageInfo(mi)2112 ms.StoreMessageInfo(mi)
2026 }2113 }
@@ -2032,7 +2119,7 @@ func (x *ActivateAttachment) String() string {
2032 func (*ActivateAttachment) ProtoMessage() {}2119 func (*ActivateAttachment) ProtoMessage() {}
2033 2120
2034 func (x *ActivateAttachment) ProtoReflect() protoreflect.Message {2121 func (x *ActivateAttachment) ProtoReflect() protoreflect.Message {
2035- mi := &file_session_proto_msgTypes[30]2122+ mi := &file_session_proto_msgTypes[31]
2036 if x != nil {2123 if x != nil {
2037 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2124 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2038 if ms.LoadMessageInfo() == nil {2125 if ms.LoadMessageInfo() == nil {
@@ -2045,7 +2132,7 @@ func (x *ActivateAttachment) ProtoReflect() protoreflect.Message {
2045 2132
2046 // Deprecated: Use ActivateAttachment.ProtoReflect.Descriptor instead.2133 // Deprecated: Use ActivateAttachment.ProtoReflect.Descriptor instead.
2047 func (*ActivateAttachment) Descriptor() ([]byte, []int) {2134 func (*ActivateAttachment) Descriptor() ([]byte, []int) {
2048- return file_session_proto_rawDescGZIP(), []int{30}2135+ return file_session_proto_rawDescGZIP(), []int{31}
2049 }2136 }
2050 2137
2051 func (x *ActivateAttachment) GetRequestId() uint64 {2138 func (x *ActivateAttachment) GetRequestId() uint64 {
@@ -2106,7 +2193,7 @@ type AttachmentActivated struct {
2106 2193
2107 func (x *AttachmentActivated) Reset() {2194 func (x *AttachmentActivated) Reset() {
2108 *x = AttachmentActivated{}2195 *x = AttachmentActivated{}
2109- mi := &file_session_proto_msgTypes[31]2196+ mi := &file_session_proto_msgTypes[32]
2110 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2197 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2111 ms.StoreMessageInfo(mi)2198 ms.StoreMessageInfo(mi)
2112 }2199 }
@@ -2118,7 +2205,7 @@ func (x *AttachmentActivated) String() string {
2118 func (*AttachmentActivated) ProtoMessage() {}2205 func (*AttachmentActivated) ProtoMessage() {}
2119 2206
2120 func (x *AttachmentActivated) ProtoReflect() protoreflect.Message {2207 func (x *AttachmentActivated) ProtoReflect() protoreflect.Message {
2121- mi := &file_session_proto_msgTypes[31]2208+ mi := &file_session_proto_msgTypes[32]
2122 if x != nil {2209 if x != nil {
2123 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2210 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2124 if ms.LoadMessageInfo() == nil {2211 if ms.LoadMessageInfo() == nil {
@@ -2131,7 +2218,7 @@ func (x *AttachmentActivated) ProtoReflect() protoreflect.Message {
2131 2218
2132 // Deprecated: Use AttachmentActivated.ProtoReflect.Descriptor instead.2219 // Deprecated: Use AttachmentActivated.ProtoReflect.Descriptor instead.
2133 func (*AttachmentActivated) Descriptor() ([]byte, []int) {2220 func (*AttachmentActivated) Descriptor() ([]byte, []int) {
2134- return file_session_proto_rawDescGZIP(), []int{31}2221+ return file_session_proto_rawDescGZIP(), []int{32}
2135 }2222 }
2136 2223
2137 func (x *AttachmentActivated) GetRequestId() uint64 {2224 func (x *AttachmentActivated) GetRequestId() uint64 {
@@ -2270,7 +2357,7 @@ const file_session_proto_rawDesc = "" +
2270 "\n" +2357 "\n" +
2271 "source_key\x18\x03 \x01(\tR\tsourceKey\"Y\n" +2358 "source_key\x18\x03 \x01(\tR\tsourceKey\"Y\n" +
2272 "\x1aRouteAttentionSubscription\x12;\n" +2359 "\x1aRouteAttentionSubscription\x12;\n" +
2273- "\atargets\x18\x01 \x03(\v2!.vev.wire.v1.RouteAttentionTargetR\atargets\"\x9d\x02\n" +2360+ "\atargets\x18\x01 \x03(\v2!.vev.wire.v1.RouteAttentionTargetR\atargets\"\xc2\x02\n" +
2274 "\x10RecentRouteEntry\x12\x10\n" +2361 "\x10RecentRouteEntry\x12\x10\n" +
2275 "\x03key\x18\x01 \x01(\x04R\x03key\x12\x1e\n" +2362 "\x03key\x18\x01 \x01(\x04R\x03key\x12\x1e\n" +
2276 "\n" +2363 "\n" +
@@ -2283,7 +2370,16 @@ const file_session_proto_rawDesc = "" +
2283 "\x04kind\x18\x06 \x01(\rR\x04kind\x12\x1c\n" +2370 "\x04kind\x18\x06 \x01(\rR\x04kind\x12\x1c\n" +
2284 "\tephemeral\x18\a \x01(\bR\tephemeral\x12\x1c\n" +2371 "\tephemeral\x18\a \x01(\bR\tephemeral\x12\x1c\n" +
2285 "\tattention\x18\b \x01(\bR\tattention\x12\"\n" +2372 "\tattention\x18\b \x01(\bR\tattention\x12\"\n" +
2286- "\freachability\x18\t \x01(\rR\freachability\"\xbd\x02\n" +2373+ "\freachability\x18\t \x01(\rR\freachability\x12#\n" +
2374+ "\rattention_seq\x18\n" +
2375+ " \x01(\x04R\fattentionSeq\"g\n" +
2376+ "\tRouteHost\x12\x10\n" +
2377+ "\x03key\x18\x01 \x01(\x04R\x03key\x12\x1e\n" +
2378+ "\n" +
2379+ "generation\x18\x02 \x01(\x04R\n" +
2380+ "generation\x12\x14\n" +
2381+ "\x05label\x18\x03 \x01(\tR\x05label\x12\x12\n" +
2382+ "\x04kind\x18\x04 \x01(\rR\x04kind\"\xeb\x02\n" +
2287 "\x13RecentRouteSnapshot\x12\x1e\n" +2383 "\x13RecentRouteSnapshot\x12\x1e\n" +
2288 "\n" +2384 "\n" +
2289 "generation\x18\x01 \x01(\x04R\n" +2385 "generation\x18\x01 \x01(\x04R\n" +
@@ -2292,7 +2388,8 @@ const file_session_proto_rawDesc = "" +
2292 "\factive_entry\x18\x03 \x01(\v2\x1d.vev.wire.v1.RecentRouteEntryR\vactiveEntry\x121\n" +2388 "\factive_entry\x18\x03 \x01(\v2\x1d.vev.wire.v1.RecentRouteEntryR\vactiveEntry\x121\n" +
2293 "\bprevious\x18\x04 \x01(\v2\x15.vev.wire.v1.RouteRefR\bprevious\x12)\n" +2389 "\bprevious\x18\x04 \x01(\v2\x15.vev.wire.v1.RouteRefR\bprevious\x12)\n" +
2294 "\x04home\x18\x05 \x01(\v2\x15.vev.wire.v1.RouteRefR\x04home\x127\n" +2390 "\x04home\x18\x05 \x01(\v2\x15.vev.wire.v1.RouteRefR\x04home\x127\n" +
2295- "\aentries\x18\x06 \x03(\v2\x1d.vev.wire.v1.RecentRouteEntryR\aentries\"\xa2\x01\n" +2391+ "\aentries\x18\x06 \x03(\v2\x1d.vev.wire.v1.RecentRouteEntryR\aentries\x12,\n" +
2392+ "\x05hosts\x18\a \x03(\v2\x16.vev.wire.v1.RouteHostR\x05hosts\"\xa2\x01\n" +
2296 "\x15RouteNavigationAction\x12&\n" +2393 "\x15RouteNavigationAction\x12&\n" +
2297 "\x0fcause_action_id\x18\x01 \x01(\x04R\rcauseActionId\x12/\n" +2394 "\x0fcause_action_id\x18\x01 \x01(\x04R\rcauseActionId\x12/\n" +
2298 "\x13snapshot_generation\x18\x02 \x01(\x04R\x12snapshotGeneration\x12\x10\n" +2395 "\x13snapshot_generation\x18\x02 \x01(\x04R\x12snapshotGeneration\x12\x10\n" +
@@ -2371,7 +2468,7 @@ func file_session_proto_rawDescGZIP() []byte {
2371 return file_session_proto_rawDescData2468 return file_session_proto_rawDescData
2372 }2469 }
2373 2470
2374-var file_session_proto_msgTypes = make([]protoimpl.MessageInfo, 32)2471+var file_session_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
2375 var file_session_proto_goTypes = []any{2472 var file_session_proto_goTypes = []any{
2376 (*Hello)(nil), // 0: vev.wire.v1.Hello2473 (*Hello)(nil), // 0: vev.wire.v1.Hello
2377 (*Welcome)(nil), // 1: vev.wire.v1.Welcome2474 (*Welcome)(nil), // 1: vev.wire.v1.Welcome
@@ -2392,52 +2489,54 @@ var file_session_proto_goTypes = []any{
2392 (*RouteAttentionTarget)(nil), // 16: vev.wire.v1.RouteAttentionTarget2489 (*RouteAttentionTarget)(nil), // 16: vev.wire.v1.RouteAttentionTarget
2393 (*RouteAttentionSubscription)(nil), // 17: vev.wire.v1.RouteAttentionSubscription2490 (*RouteAttentionSubscription)(nil), // 17: vev.wire.v1.RouteAttentionSubscription
2394 (*RecentRouteEntry)(nil), // 18: vev.wire.v1.RecentRouteEntry2491 (*RecentRouteEntry)(nil), // 18: vev.wire.v1.RecentRouteEntry
2395- (*RecentRouteSnapshot)(nil), // 19: vev.wire.v1.RecentRouteSnapshot2492+ (*RouteHost)(nil), // 19: vev.wire.v1.RouteHost
2396- (*RouteNavigationAction)(nil), // 20: vev.wire.v1.RouteNavigationAction2493+ (*RecentRouteSnapshot)(nil), // 20: vev.wire.v1.RecentRouteSnapshot
2397- (*RouteCreateSessionAction)(nil), // 21: vev.wire.v1.RouteCreateSessionAction2494+ (*RouteNavigationAction)(nil), // 21: vev.wire.v1.RouteNavigationAction
2398- (*RouteNavigationFailure)(nil), // 22: vev.wire.v1.RouteNavigationFailure2495+ (*RouteCreateSessionAction)(nil), // 22: vev.wire.v1.RouteCreateSessionAction
2399- (*SessionCreationFailure)(nil), // 23: vev.wire.v1.SessionCreationFailure2496+ (*RouteNavigationFailure)(nil), // 23: vev.wire.v1.RouteNavigationFailure
2400- (*RoutePosition)(nil), // 24: vev.wire.v1.RoutePosition2497+ (*SessionCreationFailure)(nil), // 24: vev.wire.v1.SessionCreationFailure
2401- (*RouteRetired)(nil), // 25: vev.wire.v1.RouteRetired2498+ (*RoutePosition)(nil), // 25: vev.wire.v1.RoutePosition
2402- (*SamePeerSwitchRequest)(nil), // 26: vev.wire.v1.SamePeerSwitchRequest2499+ (*RouteRetired)(nil), // 26: vev.wire.v1.RouteRetired
2403- (*SamePeerSwitchFailure)(nil), // 27: vev.wire.v1.SamePeerSwitchFailure2500+ (*SamePeerSwitchRequest)(nil), // 27: vev.wire.v1.SamePeerSwitchRequest
2404- (*SuspendAttachment)(nil), // 28: vev.wire.v1.SuspendAttachment2501+ (*SamePeerSwitchFailure)(nil), // 28: vev.wire.v1.SamePeerSwitchFailure
2405- (*AttachmentSuspended)(nil), // 29: vev.wire.v1.AttachmentSuspended2502+ (*SuspendAttachment)(nil), // 29: vev.wire.v1.SuspendAttachment
2406- (*ActivateAttachment)(nil), // 30: vev.wire.v1.ActivateAttachment2503+ (*AttachmentSuspended)(nil), // 30: vev.wire.v1.AttachmentSuspended
2407- (*AttachmentActivated)(nil), // 31: vev.wire.v1.AttachmentActivated2504+ (*ActivateAttachment)(nil), // 31: vev.wire.v1.ActivateAttachment
2408- (*ExactTarget)(nil), // 32: vev.wire.v1.ExactTarget2505+ (*AttachmentActivated)(nil), // 32: vev.wire.v1.AttachmentActivated
2409- (*SessionAttachTarget)(nil), // 33: vev.wire.v1.SessionAttachTarget2506+ (*ExactTarget)(nil), // 33: vev.wire.v1.ExactTarget
2507+ (*SessionAttachTarget)(nil), // 34: vev.wire.v1.SessionAttachTarget
2410 }2508 }
2411 var file_session_proto_depIdxs = []int32{2509 var file_session_proto_depIdxs = []int32{
2412- 32, // 0: vev.wire.v1.Hello.exact_target:type_name -> vev.wire.v1.ExactTarget2510+ 33, // 0: vev.wire.v1.Hello.exact_target:type_name -> vev.wire.v1.ExactTarget
2413- 33, // 1: vev.wire.v1.Hello.session_target:type_name -> vev.wire.v1.SessionAttachTarget2511+ 34, // 1: vev.wire.v1.Hello.session_target:type_name -> vev.wire.v1.SessionAttachTarget
2414 3, // 2: vev.wire.v1.Welcome.committed_identity:type_name -> vev.wire.v1.CommittedRouteIdentity2512 3, // 2: vev.wire.v1.Welcome.committed_identity:type_name -> vev.wire.v1.CommittedRouteIdentity
2415- 32, // 3: vev.wire.v1.CommittedRouteIdentity.target:type_name -> vev.wire.v1.ExactTarget2513+ 33, // 3: vev.wire.v1.CommittedRouteIdentity.target:type_name -> vev.wire.v1.ExactTarget
2416- 32, // 4: vev.wire.v1.AttachTarget.exact_target:type_name -> vev.wire.v1.ExactTarget2514+ 33, // 4: vev.wire.v1.AttachTarget.exact_target:type_name -> vev.wire.v1.ExactTarget
2417- 33, // 5: vev.wire.v1.AttachTarget.session_target:type_name -> vev.wire.v1.SessionAttachTarget2515+ 34, // 5: vev.wire.v1.AttachTarget.session_target:type_name -> vev.wire.v1.SessionAttachTarget
2418 5, // 6: vev.wire.v1.Sessions.sessions:type_name -> vev.wire.v1.SessionInfo2516 5, // 6: vev.wire.v1.Sessions.sessions:type_name -> vev.wire.v1.SessionInfo
2419 8, // 7: vev.wire.v1.KillResult.failures:type_name -> vev.wire.v1.KillFailure2517 8, // 7: vev.wire.v1.KillResult.failures:type_name -> vev.wire.v1.KillFailure
2420 15, // 8: vev.wire.v1.RouteAttentionTarget.ref:type_name -> vev.wire.v1.RouteRef2518 15, // 8: vev.wire.v1.RouteAttentionTarget.ref:type_name -> vev.wire.v1.RouteRef
2421- 32, // 9: vev.wire.v1.RouteAttentionTarget.target:type_name -> vev.wire.v1.ExactTarget2519+ 33, // 9: vev.wire.v1.RouteAttentionTarget.target:type_name -> vev.wire.v1.ExactTarget
2422 16, // 10: vev.wire.v1.RouteAttentionSubscription.targets:type_name -> vev.wire.v1.RouteAttentionTarget2520 16, // 10: vev.wire.v1.RouteAttentionSubscription.targets:type_name -> vev.wire.v1.RouteAttentionTarget
2423- 32, // 11: vev.wire.v1.RecentRouteEntry.target:type_name -> vev.wire.v1.ExactTarget2521+ 33, // 11: vev.wire.v1.RecentRouteEntry.target:type_name -> vev.wire.v1.ExactTarget
2424 15, // 12: vev.wire.v1.RecentRouteSnapshot.active:type_name -> vev.wire.v1.RouteRef2522 15, // 12: vev.wire.v1.RecentRouteSnapshot.active:type_name -> vev.wire.v1.RouteRef
2425 18, // 13: vev.wire.v1.RecentRouteSnapshot.active_entry:type_name -> vev.wire.v1.RecentRouteEntry2523 18, // 13: vev.wire.v1.RecentRouteSnapshot.active_entry:type_name -> vev.wire.v1.RecentRouteEntry
2426 15, // 14: vev.wire.v1.RecentRouteSnapshot.previous:type_name -> vev.wire.v1.RouteRef2524 15, // 14: vev.wire.v1.RecentRouteSnapshot.previous:type_name -> vev.wire.v1.RouteRef
2427 15, // 15: vev.wire.v1.RecentRouteSnapshot.home:type_name -> vev.wire.v1.RouteRef2525 15, // 15: vev.wire.v1.RecentRouteSnapshot.home:type_name -> vev.wire.v1.RouteRef
2428 18, // 16: vev.wire.v1.RecentRouteSnapshot.entries:type_name -> vev.wire.v1.RecentRouteEntry2526 18, // 16: vev.wire.v1.RecentRouteSnapshot.entries:type_name -> vev.wire.v1.RecentRouteEntry
2429- 32, // 17: vev.wire.v1.RoutePosition.target:type_name -> vev.wire.v1.ExactTarget2527+ 19, // 17: vev.wire.v1.RecentRouteSnapshot.hosts:type_name -> vev.wire.v1.RouteHost
2430- 15, // 18: vev.wire.v1.RouteRetired.ref:type_name -> vev.wire.v1.RouteRef2528+ 33, // 18: vev.wire.v1.RoutePosition.target:type_name -> vev.wire.v1.ExactTarget
2431- 32, // 19: vev.wire.v1.RouteRetired.target:type_name -> vev.wire.v1.ExactTarget2529+ 15, // 19: vev.wire.v1.RouteRetired.ref:type_name -> vev.wire.v1.RouteRef
2432- 32, // 20: vev.wire.v1.SamePeerSwitchRequest.target:type_name -> vev.wire.v1.ExactTarget2530+ 33, // 20: vev.wire.v1.RouteRetired.target:type_name -> vev.wire.v1.ExactTarget
2433- 32, // 21: vev.wire.v1.AttachmentSuspended.target:type_name -> vev.wire.v1.ExactTarget2531+ 33, // 21: vev.wire.v1.SamePeerSwitchRequest.target:type_name -> vev.wire.v1.ExactTarget
2434- 32, // 22: vev.wire.v1.ActivateAttachment.target:type_name -> vev.wire.v1.ExactTarget2532+ 33, // 22: vev.wire.v1.AttachmentSuspended.target:type_name -> vev.wire.v1.ExactTarget
2435- 3, // 23: vev.wire.v1.AttachmentActivated.identity:type_name -> vev.wire.v1.CommittedRouteIdentity2533+ 33, // 23: vev.wire.v1.ActivateAttachment.target:type_name -> vev.wire.v1.ExactTarget
2436- 24, // [24:24] is the sub-list for method output_type2534+ 3, // 24: vev.wire.v1.AttachmentActivated.identity:type_name -> vev.wire.v1.CommittedRouteIdentity
2437- 24, // [24:24] is the sub-list for method input_type2535+ 25, // [25:25] is the sub-list for method output_type
2438- 24, // [24:24] is the sub-list for extension type_name2536+ 25, // [25:25] is the sub-list for method input_type
2439- 24, // [24:24] is the sub-list for extension extendee2537+ 25, // [25:25] is the sub-list for extension type_name
2440- 0, // [0:24] is the sub-list for field type_name2538+ 25, // [25:25] is the sub-list for extension extendee
2539+ 0, // [0:25] is the sub-list for field type_name
2441 }2540 }
2442 2541
2443 func init() { file_session_proto_init() }2542 func init() { file_session_proto_init() }
@@ -2452,7 +2551,7 @@ func file_session_proto_init() {
2452 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),2551 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
2453 RawDescriptor: unsafe.Slice(unsafe.StringData(file_session_proto_rawDesc), len(file_session_proto_rawDesc)),2552 RawDescriptor: unsafe.Slice(unsafe.StringData(file_session_proto_rawDesc), len(file_session_proto_rawDesc)),
2454 NumEnums: 0,2553 NumEnums: 0,
2455- NumMessages: 32,2554+ NumMessages: 33,
2456 NumExtensions: 0,2555 NumExtensions: 0,
2457 NumServices: 0,2556 NumServices: 0,
2458 },2557 },

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 12

Tags 11

↑↓ moveenter openesc close