package v2rayapi // 极简 StatsService 客户端。消息定义(stats.pb.go)直接从 sing-box // experimental/v2rayapi 原样 vendor(wire 保证一致);此处只手写 QueryStats 调用。 // // 注意:sing-box 服务端把 gRPC ServiceName 覆盖成了 v2ray 规范名 // "v2ray.core.app.stats.command.StatsService"(见 sing-box stats.go), // 而生成代码里的常量是 "experimental.v2rayapi.StatsService"。直接抄生成的 // client 会调错方法路径,故这里硬编码服务端真正注册的规范全名。 import ( "context" "google.golang.org/grpc" ) const queryStatsFullMethod = "/v2ray.core.app.stats.command.StatsService/QueryStats" // StatsClient 是 v2ray StatsService 的最小客户端(只用 QueryStats)。 type StatsClient struct { cc grpc.ClientConnInterface } // NewStatsClient 包一个已建立的 gRPC 连接。 func NewStatsClient(cc grpc.ClientConnInterface) *StatsClient { return &StatsClient{cc: cc} } // QueryStats 按 pattern 取计数器;reset=true 时取值并清零(天然给出窗口 delta)。 func (c *StatsClient) QueryStats(ctx context.Context, in *QueryStatsRequest, opts ...grpc.CallOption) (*QueryStatsResponse, error) { out := new(QueryStatsResponse) if err := c.cc.Invoke(ctx, queryStatsFullMethod, in, out, opts...); err != nil { return nil, err } return out, nil }