From 55bd6e1b481df0a4d773b0165543e54020f72a96 Mon Sep 17 00:00:00 2001 From: verse91 Date: Thu, 9 Apr 2026 14:29:19 +0700 Subject: [PATCH] feat(server): ipc server --- ipc/server.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 ipc/server.go diff --git a/ipc/server.go b/ipc/server.go new file mode 100644 index 0000000..195bce8 --- /dev/null +++ b/ipc/server.go @@ -0,0 +1,58 @@ +package ipc + +import ( + "net" +) + +type State struct { + Query string +} + +type Server struct { + conn *net.UDPConn + StateChan chan State + ListenPort int +} + +func NewServer() (*Server, error) { + addr := &net.UDPAddr{ + IP: net.ParseIP("127.0.0.1"), + Port: 0, // OS assigns random port + } + conn, err := net.ListenUDP("udp", addr) + if err != nil { + return nil, err + } + + localAddr := conn.LocalAddr().(*net.UDPAddr) + + s := &Server{ + conn: conn, + StateChan: make(chan State, 100), + ListenPort: localAddr.Port, + } + + return s, nil +} + +func (s *Server) Start() { + buf := make([]byte, 4096) + for { + n, _, err := s.conn.ReadFromUDP(buf) + if err != nil { + break + } + + query := string(buf[:n]) + // send non-blocking so we don't choke the UDP read loop + select { + case s.StateChan <- State{Query: query}: + default: + } + } +} + +func (s *Server) Close() { + s.conn.Close() + close(s.StateChan) +}