36 lines
		
	
	
		
			675 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			675 B
		
	
	
	
		
			Go
		
	
	
	
| package http
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	"golang.org/x/sync/errgroup"
 | |
| )
 | |
| 
 | |
| // NewServerGroup creates a new Server to start and gracefully stop a collection
 | |
| // of Servers.
 | |
| func NewServerGroup(servers ...Server) Server {
 | |
| 	return &serverGroup{
 | |
| 		servers: servers,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // serverGroup manages the starting and graceful shutdown of a collection of
 | |
| // servers.
 | |
| type serverGroup struct {
 | |
| 	servers []Server
 | |
| }
 | |
| 
 | |
| // Start runs the servers in the server group.
 | |
| func (s *serverGroup) Start(ctx context.Context) error {
 | |
| 	g, groupCtx := errgroup.WithContext(ctx)
 | |
| 
 | |
| 	for _, server := range s.servers {
 | |
| 		srv := server
 | |
| 		g.Go(func() error {
 | |
| 			return srv.Start(groupCtx)
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	return g.Wait()
 | |
| }
 |