diff options
Diffstat (limited to 'pkg/server')
| -rw-r--r-- | pkg/server/server.go | 8 | ||||
| -rw-r--r-- | pkg/server/unix.go | 89 |
2 files changed, 96 insertions, 1 deletions
diff --git a/pkg/server/server.go b/pkg/server/server.go index c08d5a4..a7a5395 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -2,6 +2,7 @@ package server import ( "bytes" + "context" "io" "log/slog" "net/http" @@ -14,6 +15,11 @@ import ( "github.com/jpappel/atlas/pkg/query" ) +type Server interface { + ListenAndServe() error + Shutdown(context.Context) error +} + func info(w http.ResponseWriter, r *http.Request) { w.Write([]byte(` <h1>Atlas Server</h1> @@ -22,7 +28,7 @@ func info(w http.ResponseWriter, r *http.Request) { `)) } -func New(db *data.Query) *http.ServeMux { +func NewMux(db *data.Query) *http.ServeMux { mux := http.NewServeMux() outputBufPool := &sync.Pool{} diff --git a/pkg/server/unix.go b/pkg/server/unix.go new file mode 100644 index 0000000..87b425e --- /dev/null +++ b/pkg/server/unix.go @@ -0,0 +1,89 @@ +package server + +import ( + "bytes" + "context" + "fmt" + "log/slog" + "net" + "os" + "sync" + + "github.com/jpappel/atlas/pkg/data" +) + +// datagram based unix server +type UnixServer struct { + Addr string + Db *data.Query + shouldClose chan struct{} + bufPool *sync.Pool +} + +func (s *UnixServer) ListenAndServe() error { + slog.Info("Listening on", slog.String("addr", s.Addr)) + conn, err := net.ListenUnixgram( + "unixgram", + &net.UnixAddr{Name: s.Addr, Net: "Unix"}, + ) + if err != nil { + return err + } + defer conn.Close() + defer os.RemoveAll(s.Addr) + slog.Debug("Accepted connection") + + // slog.Info("New Connection", + // slog.String("addr", conn.RemoteAddr().String()), + // ) + + s.bufPool = &sync.Pool{} + s.bufPool.New = func() any { + return &bytes.Buffer{} + } + s.handleConn(conn) + + return nil +} + +func (s UnixServer) handleConn(conn *net.UnixConn) { + // buf, ok := s.bufPool.Get().(*bytes.Buffer) + // if !ok { + // panic("Expected *bytes.Buffer in pool") + // } + buf := make([]byte, 1024) + + n, err := conn.Read(buf) + if err != nil { + panic(err) + } + buf = buf[:n] + + fmt.Println(string(buf)) + + // if _, err := io.Copy(buf, conn); err != nil { + // panic(err) + // } + // defer buf.Reset() + // + // io.Copy(os.Stdout, buf) + + // artifact, err := query.Compile(buf.String(), 0, 1) + // if err != nil { + // panic(err) + // } + // + // docs, err := s.Db.Execute(artifact) + // if err != nil { + // panic(err) + // } + // + // _, err = query.DefaultOutput{}.OutputTo(conn, slices.Collect(maps.Values(docs))) + // if err != nil { + // panic(err) + // } +} + +func (s *UnixServer) Shutdown(ctx context.Context) error { + return nil +} |
