diff --git a/cmd/converge/server.go b/cmd/converge/server.go new file mode 100644 index 0000000..c8756ac --- /dev/null +++ b/cmd/converge/server.go @@ -0,0 +1,73 @@ +package main + +import ( + "cidebug/pkg/iowrappers" + "fmt" + "github.com/gorilla/websocket" + "log" + "net/http" +) + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, +} + +func handleWebSocket(w http.ResponseWriter, r *http.Request, + handler func(w http.ResponseWriter, r *http.Request, websockerConnection *iowrappers.WebSocketConn)) { + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Println("Error upgrading to WebSocket:", err) + return + } + wsConn := iowrappers.NewWebSocketConn(conn) + defer wsConn.Close() + + handler(w, r, wsConn) +} + +type WebSocketService struct { + handler func(w http.ResponseWriter, r *http.Request, conn *iowrappers.WebSocketConn) +} + +func (endpoint *WebSocketService) handle(w http.ResponseWriter, r *http.Request) { + handleWebSocket(w, r, endpoint.handler) +} + +var client *iowrappers.WebSocketConn +var agent *iowrappers.WebSocketConn + +func main() { + // Connect to TCP server + + clientClosed := make(chan bool) + serverAvailable := make(chan bool) + + registrationService := WebSocketService{ + handler: func(w http.ResponseWriter, r *http.Request, conn *iowrappers.WebSocketConn) { + log.Println("Got registration connection") + agent = conn + serverAvailable <- true + <-clientClosed + }, + } + clientService := WebSocketService{ + handler: func(w http.ResponseWriter, r *http.Request, conn *iowrappers.WebSocketConn) { + log.Println("Got client connection") + client = conn + if agent == nil { + log.Println("There is no agent yet,, closing") + return + } + iowrappers.SynchronizeStreams(client, agent) + clientClosed <- true + }, + } + + http.HandleFunc("/register", registrationService.handle) + http.HandleFunc("/client", clientService.handle) + + // Start HTTP server + fmt.Println("WebSocket server listening on :8000") + log.Fatal(http.ListenAndServe(":8000", nil)) +} diff --git a/cmd/tcptows/tcptows.go b/cmd/tcptows/tcptows.go index f30a797..34689f4 100644 --- a/cmd/tcptows/tcptows.go +++ b/cmd/tcptows/tcptows.go @@ -5,25 +5,33 @@ import ( "github.com/gorilla/websocket" "log" "net" + "os" ) -func handleConnection(tcpConn net.Conn, wsURL string) { - defer tcpConn.Close() +func closeConnection(conn net.Conn) { + if tcpConn, ok := conn.(*net.TCPConn); ok { + tcpConn.SetLinger(0) + } + _ = conn.Close() +} - conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil) - wsConn := iowrappers.NewWebSocketConn(conn) +func handleConnection(conn net.Conn, wsURL string) { + defer closeConnection(conn) + + _wsConn, _, err := websocket.DefaultDialer.Dial(wsURL, nil) if err != nil { log.Println("WebSocket connection error:", err) return } + wsConn := iowrappers.NewWebSocketConn(_wsConn) defer wsConn.Close() - iowrappers.SynchronizeStreams(wsConn, tcpConn) + iowrappers.SynchronizeStreams(wsConn, conn) } func main() { - tcpPort := "7000" - wsURL := "ws://localhost:8000/ws" // Replace with your WebSocket server URL + tcpPort := os.Args[1] + wsURL := os.Args[2] listener, err := net.Listen("tcp", ":"+tcpPort) if err != nil {