Files
eng-pad-server/internal/grpcserver/server.go
Kyle Isom 49de9269d6 Rename service to EngPadSyncService (buf lint), add java_package, add buf.yaml
- Proto service renamed from EngPadSync to EngPadSyncService per buf
  STANDARD lint rule SERVICE_SUFFIX
- Added java_package and java_multiple_files options for Android client
- Added buf.yaml with STANDARD lint and FILE breaking detection
- Regenerated Go gRPC stubs, updated server references

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 21:25:09 -07:00

55 lines
1.2 KiB
Go

package grpcserver
import (
"crypto/tls"
"database/sql"
"fmt"
"log/slog"
"net"
pb "git.wntrmute.dev/kyle/eng-pad-server/gen/engpad/v1"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
type Config struct {
Addr string
TLSCert string
TLSKey string
DB *sql.DB
BaseURL string
}
// Start creates and starts the gRPC server. It returns the server so the
// caller can manage graceful shutdown. The server runs in a background
// goroutine; errors are sent to errCh.
func Start(cfg Config) (*grpc.Server, error) {
cert, err := tls.LoadX509KeyPair(cfg.TLSCert, cfg.TLSKey)
if err != nil {
return nil, fmt.Errorf("load TLS cert: %w", err)
}
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
MinVersion: tls.VersionTLS13,
}
lis, err := net.Listen("tcp", cfg.Addr)
if err != nil {
return nil, fmt.Errorf("listen %s: %w", cfg.Addr, err)
}
srv := grpc.NewServer(
grpc.Creds(credentials.NewTLS(tlsConfig)),
grpc.UnaryInterceptor(AuthInterceptor(cfg.DB)),
)
syncSvc := &SyncService{DB: cfg.DB, BaseURL: cfg.BaseURL}
pb.RegisterEngPadSyncServiceServer(srv, syncSvc)
slog.Info("gRPC server started", "addr", cfg.Addr)
go func() { _ = srv.Serve(lis) }()
return srv, nil
}