all: Refactor relay invitations (#7646)

This commit is contained in:
Simon Frei
2021-05-10 22:25:43 +02:00
committed by GitHub
parent 6e662dc9fc
commit 713527facf
5 changed files with 38 additions and 44 deletions
+5 -21
View File
@@ -35,21 +35,21 @@ type RelayClient interface {
URI() *url.URL
}
func NewClient(uri *url.URL, certs []tls.Certificate, invitations chan protocol.SessionInvitation, timeout time.Duration) (RelayClient, error) {
func NewClient(uri *url.URL, certs []tls.Certificate, timeout time.Duration) (RelayClient, error) {
factory, ok := supportedSchemes[uri.Scheme]
if !ok {
return nil, fmt.Errorf("unsupported scheme: %s", uri.Scheme)
}
invitations := make(chan protocol.SessionInvitation)
return factory(uri, certs, invitations, timeout), nil
}
type commonClient struct {
svcutil.ServiceWithError
invitations chan protocol.SessionInvitation
closeInvitationsOnFinish bool
mut sync.RWMutex
invitations chan protocol.SessionInvitation
mut sync.RWMutex
}
func newCommonClient(invitations chan protocol.SessionInvitation, serve func(context.Context) error, creator string) commonClient {
@@ -57,26 +57,10 @@ func newCommonClient(invitations chan protocol.SessionInvitation, serve func(con
invitations: invitations,
mut: sync.NewRWMutex(),
}
newServe := func(ctx context.Context) error {
defer c.cleanup()
return serve(ctx)
}
c.ServiceWithError = svcutil.AsService(newServe, creator)
if c.invitations == nil {
c.closeInvitationsOnFinish = true
c.invitations = make(chan protocol.SessionInvitation)
}
c.ServiceWithError = svcutil.AsService(serve, creator)
return c
}
func (c *commonClient) cleanup() {
c.mut.Lock()
if c.closeInvitationsOnFinish {
close(c.invitations)
}
c.mut.Unlock()
}
func (c *commonClient) Invitations() chan protocol.SessionInvitation {
c.mut.RLock()
defer c.mut.RUnlock()
+9 -5
View File
@@ -114,16 +114,20 @@ func JoinSession(ctx context.Context, invitation protocol.SessionInvitation) (ne
func TestRelay(ctx context.Context, uri *url.URL, certs []tls.Certificate, sleep, timeout time.Duration, times int) error {
id := syncthingprotocol.NewDeviceID(certs[0].Certificate[0])
invs := make(chan protocol.SessionInvitation, 1)
c, err := NewClient(uri, certs, invs, timeout)
c, err := NewClient(uri, certs, timeout)
if err != nil {
close(invs)
return fmt.Errorf("creating client: %w", err)
}
ctx, cancel := context.WithCancel(context.Background())
go c.Serve(ctx)
go func() {
c.Serve(ctx)
close(invs)
for {
select {
case <-c.Invitations():
case <-ctx.Done():
return
}
}
}()
defer cancel()
+6 -1
View File
@@ -98,7 +98,12 @@ func (c *staticClient) serve(ctx context.Context) error {
if len(ip) == 0 || ip.IsUnspecified() {
msg.Address = remoteIPBytes(c.conn)
}
c.invitations <- msg
select {
case c.invitations <- msg:
case <-ctx.Done():
l.Debugln(c, "stopping")
return ctx.Err()
}
case protocol.RelayFull:
l.Infof("Disconnected from relay %s due to it becoming full.", c.uri)