|
package main |
|
|
|
import ( |
|
"fmt" |
|
"log/slog" |
|
"os" |
|
"os/signal" |
|
"strconv" |
|
"syscall" |
|
|
|
"github.com/joho/godotenv" |
|
|
|
"app/internal" |
|
) |
|
|
|
func main() { |
|
|
|
err := godotenv.Load() |
|
if err != nil { |
|
slog.Warn("load .env file failed", "err", err) |
|
} |
|
|
|
|
|
logPath := os.Getenv("LOG_PATH") |
|
if _, err := os.Stat(logPath); os.IsNotExist(err) { |
|
if err := os.MkdirAll(logPath, os.ModePerm); err != nil { |
|
slog.Error("create log directory failed", "err", err) |
|
os.Exit(1) |
|
} |
|
} |
|
|
|
log2Stdout, err := strconv.ParseBool(os.Getenv("LOG_STDOUT")) |
|
if err != nil { |
|
slog.Error("environment LOG_STDOUT invalid") |
|
log2Stdout = false |
|
} |
|
|
|
|
|
agoraAppId := os.Getenv("AGORA_APP_ID") |
|
if len(agoraAppId) != 32 { |
|
slog.Error("environment AGORA_APP_ID invalid") |
|
os.Exit(1) |
|
} |
|
|
|
workersMax, err := strconv.Atoi(os.Getenv("WORKERS_MAX")) |
|
if err != nil || workersMax <= 0 { |
|
slog.Error("environment WORKERS_MAX invalid") |
|
os.Exit(1) |
|
} |
|
|
|
workerQuitTimeoutSeconds, err := strconv.Atoi(os.Getenv("WORKER_QUIT_TIMEOUT_SECONDES")) |
|
if err != nil || workerQuitTimeoutSeconds <= 0 { |
|
slog.Error("environment WORKER_QUIT_TIMEOUT_SECONDES invalid") |
|
os.Exit(1) |
|
} |
|
|
|
|
|
sigs := make(chan os.Signal, 1) |
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) |
|
|
|
go func() { |
|
<-sigs |
|
fmt.Println("Received interrupt signal, cleaning up workers...") |
|
internal.CleanWorkers() |
|
os.Exit(0) |
|
}() |
|
|
|
|
|
httpServerConfig := &internal.HttpServerConfig{ |
|
AppId: agoraAppId, |
|
AppCertificate: os.Getenv("AGORA_APP_CERTIFICATE"), |
|
LogPath: logPath, |
|
Port: os.Getenv("SERVER_PORT"), |
|
WorkersMax: workersMax, |
|
WorkerQuitTimeoutSeconds: workerQuitTimeoutSeconds, |
|
Log2Stdout: log2Stdout, |
|
} |
|
httpServer := internal.NewHttpServer(httpServerConfig) |
|
httpServer.Start() |
|
} |
|
|