Files
eko/internal/server/server.go
2024-10-15 21:59:08 +03:00

90 lines
2.0 KiB
Go

package server
import (
"crypto/tls"
_ "embed"
"errors"
"log"
"net"
"os"
"os/signal"
"strconv"
"sync"
"syscall"
"github.com/kyren223/eko/internal/packet"
"github.com/kyren223/eko/pkg/assert"
)
const port = 7223
//go:embed server.crt
var certPEM []byte
//go:embed server.key
var keyPEM []byte
func Start() {
cert, err := tls.X509KeyPair(certPEM, keyPEM)
if err != nil {
log.Fatalln("error loading certificate:", err)
}
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
}
prepareConstPackets()
listener, err := tls.Listen("tcp4", ":"+strconv.Itoa(port), tlsConfig)
if err != nil {
log.Fatalf("error starting server: %s", err)
}
defer listener.Close()
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
go handleInterrupt(listener, signalChan)
var wg sync.WaitGroup
listen(listener, &wg)
wg.Wait()
}
func handleInterrupt(listener net.Listener, stopChan <-chan os.Signal) {
signal := <-stopChan
log.Println("signal:", signal.String())
listener.Close()
}
func listen(listener net.Listener, wg *sync.WaitGroup) {
log.Printf("started listening on port %v...\n", port)
for {
conn, err := listener.Accept()
if err != nil {
if !errors.Is(err, net.ErrClosed) {
log.Println("error accepting connection:", err)
}
break
}
wg.Add(1)
go handleConnection(conn, wg)
}
log.Printf("stopped listening on port %v...\n", port)
}
var unsupportedEncodingErrorPacket packet.Packet
var unsupportedTypeErrorPacket packet.Packet
func prepareConstPackets() {
message := packet.ErrorMessage{Error: packet.PacketUnsupportedEncoding.Error()}
encoder, err := packet.NewMsgPackEncoder(&message)
assert.NoError(err, "constant packets should not error")
unsupportedEncodingErrorPacket = packet.NewPacket(encoder)
message = packet.ErrorMessage{Error: packet.PacketUnsupportedType.Error()}
encoder, err = packet.NewMsgPackEncoder(&message)
assert.NoError(err, "constant packets should not error")
unsupportedTypeErrorPacket = packet.NewPacket(encoder)
}