// Package config 定义 im-service 的进程配置契约和 YAML 加载入口。 package config import ( "time" "hyapp/pkg/configx" ) // Config 描述 im-service 启动所需的最小配置。 type Config struct { // NodeID 标识当前 im-service 实例,写入 session 并透出到 health 响应便于定位节点。 NodeID string `yaml:"node_id"` // HTTPAddr 是 HTTP health 与 WebSocket 的监听地址。 HTTPAddr string `yaml:"http_addr"` // GRPCAddr 是 room-service 调用 RoomBridgeService 的内部 gRPC 监听地址。 GRPCAddr string `yaml:"grpc_addr"` // JWTSecret 是 im-service 直接校验客户端 WS JWT 的 HS256 密钥。 JWTSecret string `yaml:"jwt_secret"` // RoomHistoryLimit 控制每个房间保留的最近消息窗口大小。 RoomHistoryLimit int `yaml:"room_history_limit"` // RoomServiceAddr 是发言权限和房间 presence 守卫查询的 room-service gRPC 地址。 RoomServiceAddr string `yaml:"room_service_addr"` // ShutdownTimeout 是进程收到第一次退出信号后的总收敛预算。 ShutdownTimeout time.Duration `yaml:"shutdown_timeout"` // HTTPDrainTimeout 是 HTTP listener 停止接新请求并等待普通 handler 返回的预算。 HTTPDrainTimeout time.Duration `yaml:"http_drain_timeout"` // GRPCDrainTimeout 是内部 gRPC bridge 等待已进入 RPC 完成的预算。 GRPCDrainTimeout time.Duration `yaml:"grpc_drain_timeout"` // WSDrainTimeout 是已有 WebSocket 收到 service_restart close 后自行断开的预算。 WSDrainTimeout time.Duration `yaml:"ws_drain_timeout"` } // Default 返回适合本地开发的默认配置。 func Default() Config { // 默认端口遵守项目 13xxx 约束,避免重新引入 808x。 return Config{ NodeID: "im-node-local", HTTPAddr: ":13002", GRPCAddr: ":13003", JWTSecret: "im-dev-secret", RoomHistoryLimit: 200, RoomServiceAddr: "127.0.0.1:13001", ShutdownTimeout: 30 * time.Second, HTTPDrainTimeout: 20 * time.Second, GRPCDrainTimeout: 20 * time.Second, WSDrainTimeout: 30 * time.Second, } } // Load 从独立 config.yaml 读取 im-service 配置。 func Load(path string) (Config, error) { cfg := Default() if path == "" { // 空路径代表显式使用默认值,便于单元测试和最小启动。 return cfg, nil } if err := configx.LoadYAML(path, &cfg); err != nil { // 配置解析失败时返回空 Config,避免调用方误用部分默认值继续启动。 return Config{}, err } return cfg, nil }