aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/server
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server')
-rw-r--r--pkg/server/server.go8
-rw-r--r--pkg/server/unix.go89
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
+}