40760aa884
- server:Go 网关(WS 流式识别中继/计费配额/微信登录支付 mock/反馈/埋点),gummy provider 已真实联调 - desktop:Tauri 2(全局快捷键 push-to-talk/浮层/托盘/设置/登录购买/反馈/首启引导) - android:Compose 主 App + IME(键盘内录音直传) - ios:App + 键盘扩展(1A spike 实证键盘内不可录音,走 deep link 听写) - design/design-pipeline:设计系统 + token 导出 iOS/Android 主题 - doc:前后端设计文档(HTML);web:官网宣传页;todo:任务看板 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
43 lines
963 B
Go
43 lines
963 B
Go
package main
|
|
|
|
import (
|
|
"log/slog"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"dudu/server/internal/auth"
|
|
"dudu/server/internal/config"
|
|
"dudu/server/internal/httpapi"
|
|
"dudu/server/internal/quota"
|
|
"dudu/server/internal/store"
|
|
)
|
|
|
|
func main() {
|
|
slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil)))
|
|
cfg := config.Load()
|
|
|
|
db, err := store.Open(cfg.PostgresDSN)
|
|
if err != nil {
|
|
slog.Error("postgres open failed", "err", err)
|
|
os.Exit(1)
|
|
}
|
|
rdb := store.OpenRedis(cfg.RedisAddr, cfg.RedisDB)
|
|
|
|
jwt := auth.NewJWT(cfg.JWTSecret, time.Duration(cfg.JWTTTLHours)*time.Hour, rdb)
|
|
qm := quota.New(rdb, db)
|
|
|
|
gin.SetMode(gin.ReleaseMode)
|
|
r := gin.New()
|
|
r.Use(gin.Recovery())
|
|
|
|
httpapi.Register(r, &httpapi.Deps{Cfg: cfg, DB: db, RDB: rdb, JWT: jwt, Quota: qm})
|
|
|
|
slog.Info("dudu server listening", "addr", cfg.Addr, "asr_provider", cfg.ASRProvider)
|
|
if err := r.Run(cfg.Addr); err != nil {
|
|
slog.Error("server exited", "err", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|