Files
hsp.go/hsp/server/server.go
2025-04-19 12:38:40 +02:00

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
}