summaryrefslogtreecommitdiffhomepage
path: root/pkg/server/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/server.go')
-rw-r--r--pkg/server/server.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/pkg/server/server.go b/pkg/server/server.go
new file mode 100644
index 000000000..901c08d69
--- /dev/null
+++ b/pkg/server/server.go
@@ -0,0 +1,52 @@
+package server
+
+import (
+ "context"
+ "fmt"
+ "log/slog"
+ "net"
+ "net/http"
+
+ "github.com/sst/opencode/pkg/app"
+)
+
+type Server struct {
+ app *app.App
+ mux *http.ServeMux
+ http *http.Server
+ log *slog.Logger
+}
+
+func New(app *app.App) (*Server, error) {
+ result := &Server{
+ app: app,
+ mux: http.NewServeMux(),
+ log: slog.With("service", "server"),
+ }
+ result.mux.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) {
+ })
+
+ listener, err := net.Listen("tcp", ":0")
+ if err != nil {
+ return nil, err
+ }
+ port := listener.Addr().(*net.TCPAddr).Port
+ listener.Close()
+ result.log.Info("listening on port", "port", port)
+
+ result.http = &http.Server{
+ Addr: fmt.Sprintf(":%d", port),
+ Handler: result.mux,
+ }
+
+ return result, nil
+}
+
+func (s *Server) Start(ctx context.Context) error {
+ s.log.Info("starting server")
+ go func() {
+ <-ctx.Done()
+ s.http.Shutdown(context.Background())
+ }()
+ return s.http.ListenAndServe()
+}