feat(main,client,server): Add graceful shutdown with context propagation

This commit is contained in:
zarazaex69
2026-04-09 18:42:15 +03:00
parent fea611f687
commit 6d2f594bb3
3 changed files with 61 additions and 16 deletions

View File

@@ -1,9 +1,13 @@
package main
import (
"context"
"flag"
"log"
"os"
"os/signal"
"path/filepath"
"syscall"
"github.com/openlibrecommunity/olcrtc/internal/client"
"github.com/openlibrecommunity/olcrtc/internal/names"
@@ -55,13 +59,31 @@ func main() {
roomURL := "https://telemost.yandex.ru/j/" + roomID
switch mode {
case "srv":
if err := server.Run(roomURL, keyHex); err != nil {
log.Fatal(err)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
errCh := make(chan error, 1)
go func() {
switch mode {
case "srv":
errCh <- server.Run(ctx, roomURL, keyHex)
case "cnc":
errCh <- client.Run(ctx, roomURL, keyHex, socksPort)
}
case "cnc":
if err := client.Run(roomURL, keyHex, socksPort); err != nil {
}()
select {
case <-sigCh:
log.Println("Shutting down gracefully...")
cancel()
<-errCh
log.Println("Shutdown complete")
case err := <-errCh:
if err != nil {
log.Fatal(err)
}
}

View File

@@ -26,7 +26,7 @@ type Client struct {
clientID uint32
}
func Run(roomURL, keyHex string, socksPort int) error {
func Run(ctx context.Context, roomURL, keyHex string, socksPort int) error {
var key []byte
var err error
@@ -94,7 +94,6 @@ func Run(roomURL, keyHex string, socksPort int) error {
})
log.Println("Connecting to Telemost...")
ctx := context.Background()
if err := peer.Connect(ctx); err != nil {
return err
}
@@ -112,7 +111,7 @@ func Run(roomURL, keyHex string, socksPort int) error {
go peer.WatchConnection(ctx)
return c.runSOCKS5(socksPort)
return c.runSOCKS5(ctx, socksPort)
}
func (c *Client) onData(data []byte) {
@@ -124,7 +123,7 @@ func (c *Client) onData(data []byte) {
c.mux.HandleFrame(plaintext)
}
func (c *Client) runSOCKS5(port int) error {
func (c *Client) runSOCKS5(ctx context.Context, port int) error {
listener, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", port))
if err != nil {
return err
@@ -133,11 +132,21 @@ func (c *Client) runSOCKS5(port int) error {
log.Printf("SOCKS5 proxy listening on 0.0.0.0:%d", port)
go func() {
<-ctx.Done()
listener.Close()
}()
for {
conn, err := listener.Accept()
if err != nil {
log.Printf("Accept error: %v", err)
continue
select {
case <-ctx.Done():
return nil
default:
log.Printf("Accept error: %v", err)
continue
}
}
go c.handleSOCKS5(conn)

View File

@@ -33,7 +33,7 @@ type ConnectRequest struct {
Port int `json:"port"`
}
func Run(roomURL, keyHex string) error {
func Run(ctx context.Context, roomURL, keyHex string) error {
var key []byte
var err error
@@ -110,7 +110,6 @@ func Run(roomURL, keyHex string) error {
})
log.Println("Connecting to Telemost...")
ctx := context.Background()
if err := peer.Connect(ctx); err != nil {
return err
}
@@ -118,7 +117,7 @@ func Run(roomURL, keyHex string) error {
go peer.WatchConnection(ctx)
return s.run()
return s.run(ctx)
}
func (s *Server) onData(data []byte) {
@@ -151,8 +150,23 @@ func (s *Server) onData(data []byte) {
s.mux.HandleFrame(plaintext)
}
func (s *Server) run() error {
func (s *Server) run(ctx context.Context) error {
for {
select {
case <-ctx.Done():
log.Println("Server shutting down...")
s.connMu.Lock()
for _, conn := range s.connections {
if conn != nil {
conn.Close()
}
}
s.connMu.Unlock()
s.peer.Close()
return nil
default:
}
sids := s.mux.GetStreams()
for _, sid := range sids {