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