package core import ( "context" "log/slog" "net" "time" ) type Server struct { l *slog.Logger port string ctx context.Context Sessions chan *Session ln net.Listener } func NewServer(ctx context.Context, l *slog.Logger, port string) *Server { var s Server c := make(chan *Session) s.Sessions = c lc := net.ListenConfig{ KeepAlive: 5 * time.Minute, KeepAliveConfig: net.KeepAliveConfig{ Enable: true, Idle: 3 * time.Minute, Interval: 15 * time.Second, }, } ln, err := lc.Listen(ctx, "tcp", port) if err != nil { s.l.With( slog.Any("error", err), ).Error("could not start tcp listener") return &s } s.ctx = ctx s.ln = ln s.l = l s.port = port return &s } func (s *Server) Start() { s.l.Debug("starting telnet server") for { select { case <-s.ctx.Done(): return default: conn, err := s.ln.Accept() if err != nil { s.l.With( slog.Any("error", err), ).Error("could not accept tcp connection") } s.Sessions <- NewSession(s.ctx, conn, Printer{}, s.l) } } }