feat: add Metadata field to HopRoute and update related functions

Kim committed Apr 27, 2026 at 11:52 UTC d027db30b57e4b79260c220bfbaab8f05f5ef1b8
4 files changed +8 -1
portal/auth/hop_route.go
+1
@@ -79,6 +79,7 @@ func normalizeHopRoute(route types.HopRoute, requireOwner bool) (types.HopRoute,
79 route.RelayURL = relayURL
80 route.MatchHostname = utils.NormalizeHostname(route.MatchHostname)
81 route.MatchToken = strings.TrimSpace(route.MatchToken)
82 + route.Metadata = route.Metadata.Copy()
83 route.ForwardToken = strings.TrimSpace(route.ForwardToken)
84 route.ExpiresAt = route.ExpiresAt.UTC()
85 route.Signature = strings.TrimSpace(route.Signature)
portal/lease.go
+5 -1
@@ -284,6 +284,7 @@ func (r *leaseRegistry) RegisterHopRoute(route *types.HopRoute, now time.Time) (
284 Address: ownerKey,
285 },
286 Hostname: matchHostname,
287 + Metadata: route.Metadata.Copy(),
288 ExpiresAt: expiresAt,
289 hopToken: matchToken,
290 hopNextOverlayIPv4: overlayIPv4,
@@ -514,9 +515,12 @@ func (r *leaseRegistry) PublicLeases(now time.Time) []types.Lease {
515 if record == nil || !record.isPublicEntry() || record.isExpired(now) {
516 continue
517 }
518 + if record.Metadata.Hide {
519 + continue
520 + }
521 if record.stream != nil {
522 identityKey := record.Key()
519 - if r.policy.IsIdentityBanned(identityKey) || r.policy.IsIdentityDenied(identityKey) || !r.policy.EffectiveApproval(identityKey) || record.Metadata.Hide {
523 + if r.policy.IsIdentityBanned(identityKey) || r.policy.IsIdentityDenied(identityKey) || !r.policy.EffectiveApproval(identityKey) {
524 continue
525 }
526 since := time.Duration(0)
sdk/api_client.go
+1
@@ -136,6 +136,7 @@ func (l *listener) registerLease(ctx context.Context, ttl time.Duration, udpEnab
136 }
137 if i == 0 {
138 route.MatchHostname = publicHostname
139 + route.Metadata = l.metadata
140 } else {
141 route.MatchToken = previousHopToken
142 }
types/api.go
+1
@@ -136,6 +136,7 @@ type HopRoute struct {
136 RelayURL string `json:"relay_url"`
137 MatchHostname string `json:"match_hostname,omitempty"`
138 MatchToken string `json:"match_token,omitempty"`
139 + Metadata LeaseMetadata `json:"metadata,omitempty"`
140 ForwardRelay RelayDescriptor `json:"forward_relay"`
141 ForwardToken string `json:"forward_token"`
142 ExpiresAt time.Time `json:"expires_at,omitempty"`