refactor(lease): change RegisterLease to accept lease object instead of separate name and alpns

- Modified portal/client.go RegisterLease to take a lease object, clone it, set identity/expires internally, and use lease fields for logging - Updated sdk/sdk.go Listen to create and pass lease object, store it in RDListener for re-registration; simplified reconnect logic to use lease directly - Added error/success logging in DeregisterLease - Enhanced relay addition to register existing leases, improving reconnect handling and metadata preservation

lemon-mint committed Oct 29, 2025 at 18:19 UTC f418aec63be6ff706afb97928d7868281fb2b4a9
2 files changed +68 -27
portal/client.go
+9 -10
@@ -551,25 +551,22 @@ func (g *RelayClient) RequestConnection(leaseID string, alpn string, clientCred
551 return resp.Code, secConn, nil
552 }
553
554 -func (g *RelayClient) RegisterLease(cred *cryptoops.Credential, name string, alpns []string) error {
554 +func (g *RelayClient) RegisterLease(cred *cryptoops.Credential, lease *rdverb.Lease) error {
555 + lease = lease.CloneVT() // copy lease to avoid modifying the original lease
556 +
557 identity := &rdsec.Identity{
558 Id: cred.ID(),
559 PublicKey: cred.PublicKey(),
560 }
561 + lease.Identity = identity
562 + lease.Expires = time.Now().Add(30 * time.Second).Unix()
563
564 log.Debug().
565 Str("lease_id", identity.Id).
562 - Str("name", name).
563 - Strs("alpns", alpns).
566 + Str("name", lease.Name).
567 + Strs("alpns", lease.Alpn).
568 Msg("[RelayClient] Registering lease")
569
566 - lease := &rdverb.Lease{
567 - Identity: identity,
568 - Expires: time.Now().Add(30 * time.Second).Unix(),
569 - Name: name,
570 - Alpn: alpns,
571 - }
572 -
570 g.leasesMu.Lock()
571 g.leases[identity.Id] = &leaseWithCred{
572 Lease: lease,
@@ -606,9 +603,11 @@ func (g *RelayClient) DeregisterLease(cred *cryptoops.Credential) error {
603
604 resp, err := g.deleteLease(cred, identity)
605 if err != nil || resp != rdverb.ResponseCode_RESPONSE_CODE_ACCEPTED {
606 + log.Error().Err(err).Str("lease_id", identity.Id).Msg("[RelayClient] Failed to deregister lease")
607 return err
608 }
609
610 + log.Debug().Str("lease_id", identity.Id).Msg("[RelayClient] Lease unregistered successfully")
611 return nil
612 }
613
sdk/sdk.go
+59 -17
@@ -355,9 +355,15 @@ func (g *RDClient) Listen(cred *cryptoops.Credential, name string, alpns []strin
355 return nil, ErrListenerExists
356 }
357
358 - // Create listener
358 + lease := &rdverb.Lease{
359 + Name: name,
360 + Alpn: alpns,
361 + }
362 +
363 + // Create listener with lease metadata for re-registration
364 listener := &RDListener{
365 cred: cred,
366 + lease: lease,
367 conns: make(map[*RDConnection]struct{}),
368 connCh: make(chan *RDConnection, 100),
369 closed: false,
@@ -374,11 +380,15 @@ func (g *RDClient) Listen(cred *cryptoops.Credential, name string, alpns []strin
380 // Register lease with all available relays
381 for _, relay := range g.relays {
382 go func(r *rdRelay) {
377 - err := r.client.RegisterLease(cred, name, alpns)
383 + err := r.client.RegisterLease(cred, listener.lease)
384 if err != nil {
385 log.Error().Err(err).Str("relay", r.addr).Msg("[SDK] Failed to register lease")
386 } else {
387 log.Debug().Str("relay", r.addr).Msg("[SDK] Lease registered successfully")
388 + // Store lease info in listener for future re-registration
389 + listener.mu.Lock()
390 + listener.lease = lease
391 + listener.mu.Unlock()
392 }
393 }(relay)
394 }
@@ -636,20 +646,18 @@ func (g *RDClient) reconnectRelay(relay *rdRelay, config *RDClientConfig) {
646 lease := l.lease
647 l.mu.Unlock()
648
639 - if lease != nil {
640 - err := relayClient.RegisterLease(cred, lease.Name, lease.Alpn)
641 - if err != nil {
642 - log.Error().
643 - Err(err).
644 - Str("relay", relay.addr).
645 - Str("lease_id", cred.ID()).
646 - Msg("[SDK] Failed to re-register lease after reconnection")
647 - } else {
648 - log.Debug().
649 - Str("relay", relay.addr).
650 - Str("lease_id", cred.ID()).
651 - Msg("[SDK] Lease re-registered after reconnection")
652 - }
649 + err := relayClient.RegisterLease(cred, lease)
650 + if err != nil {
651 + log.Error().
652 + Err(err).
653 + Str("relay", relay.addr).
654 + Str("lease_id", cred.ID()).
655 + Msg("[SDK] Failed to re-register lease after reconnection")
656 + } else {
657 + log.Debug().
658 + Str("relay", relay.addr).
659 + Str("lease_id", cred.ID()).
660 + Msg("[SDK] Lease re-registered after reconnection")
661 }
662 }(listener)
663 }
@@ -703,16 +711,17 @@ func (l *RDListener) Addr() net.Addr {
711 // AddRelay adds a new relay server to the client
712 func (g *RDClient) AddRelay(addr string, dialer func(context.Context, string) (io.ReadWriteCloser, error)) error {
713 g.mu.Lock()
706 - defer g.mu.Unlock()
714
715 // Check if relay already exists
716 if _, exists := g.relays[addr]; exists {
717 + g.mu.Unlock()
718 return errors.New("relay already exists")
719 }
720
721 // Connect to relay
722 conn, err := dialer(context.Background(), addr)
723 if err != nil {
724 + g.mu.Unlock()
725 return err
726 }
727
@@ -720,6 +729,7 @@ func (g *RDClient) AddRelay(addr string, dialer func(context.Context, string) (i
729 relayClient := portal.NewRelayClient(conn)
730 if relayClient == nil {
731 conn.Close()
732 + g.mu.Unlock()
733 return errors.New("failed to create relay client")
734 }
735
@@ -732,10 +742,42 @@ func (g *RDClient) AddRelay(addr string, dialer func(context.Context, string) (i
742 }
743 g.relays[addr] = relay
744
745 + // Register all existing leases with the new relay
746 + for _, listener := range g.listeners {
747 + go func(l *RDListener) {
748 + l.mu.Lock()
749 + cred := l.cred
750 + lease := l.lease
751 + l.mu.Unlock()
752 +
753 + err := relayClient.RegisterLease(cred, lease)
754 + if err != nil {
755 + log.Error().
756 + Err(err).
757 + Str("relay", addr).
758 + Str("lease_id", cred.ID()).
759 + Msg("[SDK] Failed to register lease with new relay")
760 + } else {
761 + log.Debug().
762 + Str("relay", addr).
763 + Str("lease_id", cred.ID()).
764 + Msg("[SDK] Lease registered with new relay")
765 + }
766 + }(listener)
767 + }
768 +
769 + // Start listener worker for the new relay
770 + g.waitGroup.Add(1)
771 + go g.listenerWorker(relay)
772 +
773 + g.mu.Unlock()
774 +
775 // Start health monitoring for this relay
776 g.waitGroup.Add(1)
777 go g.healthCheckWorker(relay, g.config)
778
779 + log.Info().Str("relay", addr).Msg("[SDK] New relay added successfully")
780 +
781 return nil
782 }
783