aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/server
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-08-17 04:08:24 +0800
committerRunxi Yu <me@runxiyu.org>2025-08-17 04:08:24 +0800
commit3b0a2adf296791bdbd0c1b0fba6399910c1fac82 (patch)
tree0725ce585922a47a86e58f5961df3571a2c3b6c1 /forged/internal/server
parentAdd some stubs (diff)
downloadforge-3b0a2adf296791bdbd0c1b0fba6399910c1fac82.tar.gz
forge-3b0a2adf296791bdbd0c1b0fba6399910c1fac82.tar.zst
forge-3b0a2adf296791bdbd0c1b0fba6399910c1fac82.zip
Context fixes
Diffstat (limited to 'forged/internal/server')
-rw-r--r--forged/internal/server/server.go46
1 files changed, 26 insertions, 20 deletions
diff --git a/forged/internal/server/server.go b/forged/internal/server/server.go
index b3cd92a..0b14e62 100644
--- a/forged/internal/server/server.go
+++ b/forged/internal/server/server.go
@@ -3,7 +3,6 @@ package server
import (
"context"
"fmt"
- "log"
"go.lindenii.runxiyu.org/forge/forged/internal/config"
"go.lindenii.runxiyu.org/forge/forged/internal/database"
@@ -29,7 +28,7 @@ type Server struct {
}
}
-func New(ctx context.Context, configPath string) (server *Server, err error) {
+func New(configPath string) (server *Server, err error) {
server = &Server{}
server.config, err = config.Open(configPath)
@@ -37,11 +36,6 @@ func New(ctx context.Context, configPath string) (server *Server, err error) {
return server, fmt.Errorf("open config: %w", err)
}
- server.database, err = database.Open(ctx, server.config.DB)
- if err != nil {
- return server, fmt.Errorf("open database: %w", err)
- }
-
server.hookServer = hooks.New(server.config.Hooks)
server.lmtpServer = lmtp.New(server.config.LMTP)
server.webServer = web.New(server.config.Web)
@@ -53,33 +47,45 @@ func New(ctx context.Context, configPath string) (server *Server, err error) {
return server, nil
}
-func (s *Server) Run() error {
+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.
+ subCtx, cancel := context.WithCancel(ctx)
+ defer cancel()
+
+ server.database, err = database.Open(subCtx, server.config.DB)
+ if err != nil {
+ return fmt.Errorf("open database: %w", err)
+ }
+
+ errCh := make(chan error)
+
go func() {
- if err := s.hookServer.Run(); err != nil {
- log.Fatalf("run hook server: %v", err)
- }
+ err := server.hookServer.Run(subCtx)
+ errCh <- err
}()
go func() {
- if err := s.lmtpServer.Run(); err != nil {
- log.Fatalf("run LMTP server: %v", err)
- }
+ err := server.lmtpServer.Run(subCtx)
+ errCh <- err
}()
go func() {
- if err := s.webServer.Run(); err != nil {
- log.Fatalf("run web server: %v", err)
- }
+ err := server.webServer.Run(subCtx)
+ errCh <- err
}()
go func() {
- if err := s.sshServer.Run(); err != nil {
- log.Fatalf("run SSH server: %v", err)
- }
+ err := server.sshServer.Run(subCtx)
+ errCh <- err
}()
+ select {
+ case err := <-errCh:
+ return fmt.Errorf("server error: %w", err)
+ case <-ctx.Done():
+ }
+
return nil
}