Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var Command = &cli.Command{ Name: "serve", Flags: []cli.Flag{ &cli.StringFlag{ Name: "port", Value: "8089", Usage: "port to listen on", Aliases: []string{"p"}, Sources: cli.EnvVars("PORT"), }, &cli.StringFlag{ Name: "turso-db-url", Sources: cli.EnvVars("TURSO_CONNECTION_PATH"), }, &cli.StringFlag{ Name: "turso-db-token", Sources: cli.EnvVars("TURSO_CONNECTION_TOKEN"), }, }, Action: func(ctx context.Context, cmd *cli.Command) error { if err := godotenv.Load(); err != nil { return fmt.Errorf("failed to load .env file: %w", err) } gormDB, err := setupDatabase(cmd.String("turso-db-url"), cmd.String("turso-db-token")) if err != nil { return fmt.Errorf("failed to setup database: %w", err) } productIDs := map[apiv1.CheckoutProduct]string{ apiv1.CheckoutProduct_CHECKOUT_PRODUCT_BASIC: os.Getenv("CHECKOUT_PRODUCT_BASIC_ID"), apiv1.CheckoutProduct_CHECKOUT_PRODUCT_PRO: os.Getenv("CHECKOUT_PRODUCT_PRO_ID"), } apiService, err := api.NewServiceImpl(gormDB, productIDs) if err != nil { return fmt.Errorf("failed to create api service: %w", err) } mux := http.NewServeMux() apiPath, apiHandler := apiv1connect.NewApiServiceHandler(apiService, connect.WithInterceptors( api.NewAuthInterceptor(gormDB), validate.NewInterceptor(), )) protocols := new(http.Protocols) protocols.SetHTTP1(true) protocols.SetUnencryptedHTTP2(true) mux.Handle(apiPath, apiHandler) webhookPath := "/api/v1/webhooks/polar" mux.HandleFunc(webhookPath, api.NewPolarWebhookHandler(apiService)) slog.Info("serving polar webhook handler", "path", webhookPath) geminiProxyPath := "/api/v1/gemini/" mux.HandleFunc(geminiProxyPath, geminiProxyHandler) slog.Info("serving gemini proxy handler", "path", geminiProxyPath) slog.Info("serving rpc handler for api v1 service", "path", apiPath) h2Handler := h2c.NewHandler(mux, &http2.Server{}) server := &http.Server{ Addr: ":" + cmd.String("port"), Handler: h2Handler, ReadHeaderTimeout: 3 * time.Second, Protocols: protocols, } sigint := make(chan os.Signal, 1) signal.Notify(sigint, os.Interrupt) go func() { slog.Info("serving http server for api v1 service", "addr", ":"+cmd.String("port")) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { slog.Error("failed to serve engine service", "error", err) os.Exit(1) } }() <-sigint slog.Info("shutting down engine service") shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(shutdownCtx); err != nil { slog.Error("server forced to shutdown", "error", err) } slog.Info("engine service shut down") return nil }, }
Functions ¶
This section is empty.
Types ¶
This section is empty.
Click to show internal directories.
Click to hide internal directories.