package main import ( "encoding/json" "errors" "flag" "fmt" "log" "net/http" "os" "strconv" "strings" "time" "gopkg.in/yaml.v3" "hyapp/pkg/tencentrtc" ) type fileConfig struct { TencentRTC rtcYAMLConfig `yaml:"tencent_rtc"` } type rtcYAMLConfig struct { Enabled bool `yaml:"enabled"` SDKAppID int64 `yaml:"sdk_app_id"` SecretKey string `yaml:"secret_key"` UserSigTTL time.Duration `yaml:"user_sig_ttl"` RoomIDType string `yaml:"room_id_type"` AppScene string `yaml:"app_scene"` } type server struct { rtcConfig tencentrtc.TokenConfig } func main() { configPath := flag.String("config", "services/gateway-service/configs/config.yaml", "gateway config containing tencent_rtc") addr := flag.String("addr", "127.0.0.1:13100", "listen address") flag.Parse() rtcConfig, err := loadRTCConfig(*configPath) if err != nil { log.Fatalf("load rtc config failed: %v", err) } if err := tencentrtc.ValidateConfig(rtcConfig); err != nil { log.Fatalf("rtc config is not usable: %v", err) } s := &server{rtcConfig: rtcConfig} mux := http.NewServeMux() mux.HandleFunc("/", s.index) mux.HandleFunc("/api/token", s.token) mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write([]byte("ok")) }) log.Printf("TRTC smoke demo listening on http://%s", *addr) log.Printf("SDKAppID=%d room_id_type=%s app_scene=%s", rtcConfig.SDKAppID, rtcConfig.RoomIDType, rtcConfig.AppScene) if err := http.ListenAndServe(*addr, mux); err != nil { log.Fatal(err) } } func loadRTCConfig(path string) (tencentrtc.TokenConfig, error) { content, err := os.ReadFile(path) if err != nil { return tencentrtc.TokenConfig{}, err } var cfg fileConfig if err := yaml.Unmarshal(content, &cfg); err != nil { return tencentrtc.TokenConfig{}, err } if cfg.TencentRTC.UserSigTTL <= 0 { return tencentrtc.TokenConfig{}, errors.New("tencent_rtc.user_sig_ttl is required") } return tencentrtc.TokenConfig{ Enabled: cfg.TencentRTC.Enabled, SDKAppID: cfg.TencentRTC.SDKAppID, SecretKey: strings.TrimSpace(cfg.TencentRTC.SecretKey), TTL: cfg.TencentRTC.UserSigTTL, RoomIDType: strings.TrimSpace(cfg.TencentRTC.RoomIDType), AppScene: strings.TrimSpace(cfg.TencentRTC.AppScene), }, nil } func (s *server) index(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") http.ServeContent(w, r, "index.html", time.Now(), strings.NewReader(indexHTML)) } func (s *server) token(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") if r.Method != http.MethodGet { http.Error(w, `{"error":"method not allowed"}`, http.StatusMethodNotAllowed) return } userID, err := parseUserID(r.URL.Query().Get("user_id")) if err != nil { writeJSONError(w, http.StatusBadRequest, err) return } roomID := strings.TrimSpace(r.URL.Query().Get("room_id")) if roomID == "" { writeJSONError(w, http.StatusBadRequest, errors.New("room_id is required")) return } token, err := tencentrtc.GenerateToken(s.rtcConfig, userID, roomID, time.Now().UTC()) if err != nil { writeJSONError(w, http.StatusBadRequest, err) return } _ = json.NewEncoder(w).Encode(token) } func parseUserID(raw string) (int64, error) { raw = strings.TrimSpace(raw) if raw == "" { return 0, errors.New("user_id is required") } value, err := strconv.ParseInt(raw, 10, 64) if err != nil || value <= 0 { return 0, fmt.Errorf("user_id must be a positive int64") } return value, nil } func writeJSONError(w http.ResponseWriter, status int, err error) { w.WriteHeader(status) _ = json.NewEncoder(w).Encode(map[string]string{"error": err.Error()}) } const indexHTML = ` TRTC Smoke

TRTC Smoke

Ready


    
`