arblant
firefox-vpn-client / core / internal / tunservice / serve.go
serve.go30 lines · 788 B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
package tunservice

import (
	"errors"
	"net"
	"time"

	"github.com/armanlife/firefox-vpn-client/core/internal/logx"
	"github.com/armanlife/firefox-vpn-client/core/internal/tunapi"
)

// serve listens on the service's channel for the users that users names,
// again after a failure, until the server closes.
func serve(server *Server, users func() []string) {
	for {
		ln, err := tunapi.Listen(users())
		if err != nil {
			logx.Error("creating the service's channel failed; retrying err=%s", logx.Err(err))
		} else if err := server.Serve(ln); err == nil || errors.Is(err, net.ErrClosed) {
			return
		} else {
			logx.Error("the service's channel failed; retrying err=%s", logx.Err(err))
		}
		select {
		case <-server.Ended():
			return
		case <-time.After(5 * time.Second):
		}
	}
}