aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/server/server.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-08-12 11:01:07 +0800
committerRunxi Yu <me@runxiyu.org>2025-09-13 19:08:22 +0800
commit5717faed659a9eeb86c528ab56822c42eca1ad3f (patch)
tree92e6662628a51c03c52300d2fd98173716a82882 /forged/internal/server/server.go
parentRemove forge-specific functions from misc (diff)
downloadforge-5717faed659a9eeb86c528ab56822c42eca1ad3f.tar.gz
forge-5717faed659a9eeb86c528ab56822c42eca1ad3f.tar.zst
forge-5717faed659a9eeb86c528ab56822c42eca1ad3f.zip
Refactor
Diffstat (limited to 'forged/internal/server/server.go')
-rw-r--r--forged/internal/server/server.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/forged/internal/server/server.go b/forged/internal/server/server.go
new file mode 100644
index 0000000..62a9442
--- /dev/null
+++ b/forged/internal/server/server.go
@@ -0,0 +1,82 @@
+package server
+
+import (
+ "context"
+ "fmt"
+
+ "go.lindenii.runxiyu.org/forge/forged/internal/config"
+ "go.lindenii.runxiyu.org/forge/forged/internal/database"
+ "go.lindenii.runxiyu.org/forge/forged/internal/database/queries"
+ "go.lindenii.runxiyu.org/forge/forged/internal/global"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/hooks"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/lmtp"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/ssh"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/web"
+ "golang.org/x/sync/errgroup"
+)
+
+type Server struct {
+ config config.Config
+
+ database database.Database
+ hookServer *hooks.Server
+ lmtpServer *lmtp.Server
+ webServer *web.Server
+ sshServer *ssh.Server
+
+ global global.Global
+}
+
+func New(configPath string) (server *Server, err error) {
+ server = &Server{} //exhaustruct:ignore
+
+ server.config, err = config.Open(configPath)
+ if err != nil {
+ return server, fmt.Errorf("open config: %w", err)
+ }
+
+ queries := queries.New(&server.database)
+
+ server.global.ForgeVersion = "unknown" // TODO
+ server.global.ForgeTitle = server.config.General.Title
+
+ server.hookServer = hooks.New(server.config.Hooks, &server.global)
+ server.lmtpServer = lmtp.New(server.config.LMTP, &server.global)
+ server.webServer = web.New(server.config.Web, &server.global, queries)
+ server.sshServer, err = ssh.New(server.config.SSH, &server.global)
+ if err != nil {
+ return server, fmt.Errorf("create SSH server: %w", err)
+ }
+
+ return server, nil
+}
+
+func (server *Server) Run(ctx context.Context) (err error) {
+ // TODO: Not running git2d because it should be run separately.
+ // This needs to be documented somewhere, hence a TODO here for now.
+
+ g, gctx := errgroup.WithContext(ctx)
+
+ server.database, err = database.Open(gctx, server.config.DB)
+ if err != nil {
+ return fmt.Errorf("open database: %w", err)
+ }
+ defer server.database.Close()
+
+ g.Go(func() error { return server.hookServer.Run(gctx) })
+ g.Go(func() error { return server.lmtpServer.Run(gctx) })
+ g.Go(func() error { return server.webServer.Run(gctx) })
+ g.Go(func() error { return server.sshServer.Run(gctx) })
+
+ err = g.Wait()
+ if err != nil {
+ return fmt.Errorf("server error: %w", err)
+ }
+
+ err = ctx.Err()
+ if err != nil {
+ return fmt.Errorf("context exceeded: %w", err)
+ }
+
+ return nil
+}