package main import ( "context" "net" "os" "os/signal" "syscall" "github.com/authzed/authzed-go/v1" "github.com/rs/zerolog" "github.com/xlgmokha/x/pkg/env" "github.com/xlgmokha/x/pkg/ioc" "github.com/xlgmokha/x/pkg/log" "github.com/xlgmokha/x/pkg/x" "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/authz" "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/pls" "google.golang.org/grpc" ) func init() { c := ioc.Default ioc.RegisterSingleton[*zerolog.Logger](c, func() *zerolog.Logger { return log.New(os.Stdout, log.Fields{"app": "authzd"}) }) ioc.RegisterSingleton[context.Context](c, func() context.Context { logger := ioc.MustResolve[*zerolog.Logger](ioc.Default) return logger.WithContext(context.Background()) }) ioc.RegisterSingleton[*grpc.ClientConn](c, func() *grpc.ClientConn { ctx := ioc.MustResolve[context.Context](ioc.Default) return authz.NewGrpcConnection(ctx, env.Fetch("AUTHZD_HOST", ":20000")) }) ioc.RegisterSingleton[*authzed.Client](c, func() *authzed.Client { ctx := ioc.MustResolve[context.Context](ioc.Default) return authz.NewSpiceDBClient( ctx, env.Fetch("SPICEDB_ENDPOINT", ":50051"), env.Fetch("SPICEDB_TOKEN", "secret"), ) }) } func main() { ctx := ioc.MustResolve[context.Context](ioc.Default) connection := ioc.MustResolve[*grpc.ClientConn](ioc.Default) defer connection.Close() client := ioc.MustResolve[*authzed.Client](ioc.Default) defer client.Close() response, err := authz.WriteSchema(ctx, client, "./etc/authzd/schema.zed") if err != nil { pls.LogErrorNow(ctx, err) os.Exit(1) } pls.LogNow(ctx, log.Fields{"schema.write": response}) ctx = authz.Connection.With(ctx, connection) ctx = authz.Client.With(ctx, client) server := authz.New(ctx) c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) go func() { <-c server.GracefulStop() pls.LogNow(ctx, log.Fields{"status": "goodbye"}) }() defer server.GracefulStop() pls.LogNow(ctx, log.Fields{"status": "ready"}) socket := x.Must(net.Listen("tcp", ":10003")) pls.LogErrorNow(ctx, server.Serve(socket)) }