88 lines
1.3 KiB
Go
88 lines
1.3 KiB
Go
package server
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
"sync"
|
|
|
|
"github.com/LandaMm/hsp-go/hsp"
|
|
)
|
|
|
|
type Server struct {
|
|
Addr hsp.Adddress
|
|
routePrefix string // TODO: Support route prefix, e.g listening on localhost/api
|
|
Running bool
|
|
ConnChan chan net.Conn
|
|
listener net.Listener
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func NewServer(addr hsp.Adddress) *Server {
|
|
return &Server{
|
|
Addr: addr,
|
|
routePrefix: addr.Route,
|
|
Running: false,
|
|
}
|
|
}
|
|
|
|
func (s *Server) SetListener(ln chan net.Conn) {
|
|
s.ConnChan = ln
|
|
}
|
|
|
|
func (s *Server) Start() error {
|
|
ln, err := net.Listen("tcp", s.Addr.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
s.mu.Lock()
|
|
s.listener = ln
|
|
s.Running = true
|
|
s.mu.Unlock()
|
|
|
|
for s.IsRunning() {
|
|
log.Println("DEBUG:", "Waiting for new connection to accept")
|
|
conn, err := ln.Accept()
|
|
if err != nil {
|
|
if !s.IsRunning() {
|
|
break
|
|
}
|
|
return err
|
|
}
|
|
|
|
if s.ConnChan != nil {
|
|
s.ConnChan <- conn
|
|
}
|
|
}
|
|
|
|
log.Println("DEBUG:", "Finished listening for connections")
|
|
|
|
s.mu.Lock()
|
|
s.Running = false
|
|
s.listener = nil
|
|
s.mu.Unlock()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *Server) Stop() error {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
|
|
s.Running = false
|
|
if s.listener != nil {
|
|
return s.listener.Close()
|
|
}
|
|
if s.ConnChan != nil {
|
|
close(s.ConnChan)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *Server) IsRunning() bool {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
return s.Running
|
|
}
|