├── .gitignore ├── config.yml ├── netbase ├── device_etoken.go ├── queue.go ├── rabbitmq_pubsub.go ├── iothub_session.go ├── rabbitmq.go └── hooks.go ├── go.mod ├── README.md ├── config └── config.go ├── utils └── counter.go ├── tests └── consumer │ ├── README.md │ └── main.go ├── kit └── rediscli.go ├── main.go ├── protobuf ├── exhook.proto └── exhook_grpc.pb.go └── protobuf-v3 ├── exhook.proto └── exhook_grpc.pb.go /.gitignore: -------------------------------------------------------------------------------- 1 | go 2 | -------------------------------------------------------------------------------- /config.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9000 3 | 4 | redis: 5 | host: 127.0.0.1 6 | port: 6379 7 | password: 123456 8 | db: 0 9 | 10 | rabbitmq: 11 | host: 127.0.0.1 12 | port: 5672 13 | username: guest 14 | password: guest 15 | vhost: / -------------------------------------------------------------------------------- /netbase/device_etoken.go: -------------------------------------------------------------------------------- 1 | package netbase 2 | 3 | import ( 4 | "context" 5 | "emqx.io/grpc/exhook/kit" 6 | "time" 7 | ) 8 | 9 | var RedisDb *kit.RedisDB 10 | 11 | // SetDeviceEtoken key 是设备的时候为token, 是子设备的时候为设备编码 12 | func SetDeviceEtoken(key string, value any, duration time.Duration) error { 13 | return RedisDb.Set(key, value, duration) 14 | } 15 | 16 | // GetDeviceEtoken value 是参数指针 17 | func GetDeviceEtoken(key string, value interface{}) error { 18 | return RedisDb.Get(key, value) 19 | } 20 | 21 | // DelDeviceEtoken 删除指定的key 22 | func DelDeviceEtoken(key string) error { 23 | return RedisDb.Del(context.Background(), key).Err() 24 | } 25 | 26 | func ExistsDeviceEtoken(key string) bool { 27 | exists, _ := RedisDb.Exists(RedisDb.Context(), key).Result() 28 | return exists == 1 29 | } 30 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module emqx.io/grpc/exhook 2 | 3 | go 1.24 4 | 5 | replace emqx.io/grpc/exhook => ./ 6 | 7 | require ( 8 | github.com/go-redis/redis/v8 v8.11.5 9 | github.com/google/uuid v1.6.0 10 | google.golang.org/grpc v1.71.0 11 | google.golang.org/protobuf v1.36.5 12 | ) 13 | 14 | require ( 15 | github.com/cespare/xxhash/v2 v2.3.0 // indirect 16 | github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect 17 | github.com/eclipse/paho.mqtt.golang v1.5.0 // indirect 18 | github.com/golang/protobuf v1.5.4 // indirect 19 | github.com/gorilla/websocket v1.5.3 // indirect 20 | github.com/rabbitmq/amqp091-go v1.10.0 // indirect 21 | github.com/streadway/amqp v1.1.0 // indirect 22 | golang.org/x/net v0.34.0 // indirect 23 | golang.org/x/sync v0.10.0 // indirect 24 | golang.org/x/sys v0.29.0 // indirect 25 | golang.org/x/text v0.21.0 // indirect 26 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect 27 | gopkg.in/yaml.v2 v2.4.0 // indirect 28 | ) 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # emqx-exhook-svr-go 2 | 3 | 这是一个使用 Go 语言编写的 ExHook 服务。 4 | 5 | ## 重要说明 6 | 如果emqx 版本大于等于5.9.0 则需要使用protobuf-v3以上版本 7 | 8 | ## 前提条件 9 | 10 | - [Go](https://golang.org)(支持任意一个最新的三个主要版本) 11 | - [Protocol buffer](https://developers.google.com/protocol-buffers) **编译器**, `protoc` 12 | 安装说明请参阅 13 | [Protocol Buffer 编译器安装指南](https://grpc.io/docs/protoc-installation/)。 14 | - **Go 插件** 用于协议编译器: 15 | - 使用以下命令安装 Go 的协议编译器插件: 16 | ``` 17 | export GO111MODULE=on # 启用模块模式 18 | go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 19 | go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest 20 | ``` 21 | 22 | - 更新你的 PATH,以便 protoc 编译器可以找到这些插件: 23 | ``` 24 | export PATH="$PATH:$(go env GOPATH)/bin" 25 | ``` 26 | 27 | 28 | ## 运行 29 | 30 | 尝试编译 [*.proto](file:///Users/taiguangyin/Desktop/emqx-extension-examples-master/exhook-svr-go/protobuf/exhook.proto) 文件: 31 | 32 | ``` 33 | protoc --go_out=. --go_opt=paths=source_relative \ 34 | --go-grpc_out=. --go-grpc_opt=paths=source_relative \ 35 | protobuf/exhook.proto 36 | ``` 37 | 38 | 39 | 运行服务器: 40 | ``` 41 | go run main.go 42 | ``` 43 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "os" 7 | 8 | "gopkg.in/yaml.v2" 9 | ) 10 | 11 | // Config 应用配置结构 12 | type Config struct { 13 | Server struct { 14 | Port int `yaml:"port"` 15 | } `yaml:"server"` 16 | 17 | Redis struct { 18 | Host string `yaml:"host"` 19 | Port int `yaml:"port"` 20 | Password string `yaml:"password"` 21 | DB int `yaml:"db"` 22 | } `yaml:"redis"` 23 | 24 | RabbitMQ struct { 25 | Host string `yaml:"host"` 26 | Port int `yaml:"port"` 27 | Username string `yaml:"username"` 28 | Password string `yaml:"password"` 29 | VHost string `yaml:"vhost"` 30 | } `yaml:"rabbitmq"` 31 | } 32 | 33 | // LoadConfig 从配置文件加载配置 34 | func LoadConfig(configPath string) (*Config, error) { 35 | config := &Config{} 36 | 37 | // 读取配置文件 38 | data, err := os.ReadFile(configPath) 39 | if err != nil { 40 | return nil, fmt.Errorf("读取配置文件错误: %v", err) 41 | } 42 | 43 | // 解析YAML 44 | err = yaml.Unmarshal(data, config) 45 | if err != nil { 46 | return nil, fmt.Errorf("解析配置文件错误: %v", err) 47 | } 48 | 49 | log.Println("配置加载成功") 50 | return config, nil 51 | } 52 | -------------------------------------------------------------------------------- /utils/counter.go: -------------------------------------------------------------------------------- 1 | package exhook 2 | 3 | import ( 4 | "math" 5 | "sync" 6 | "time" 7 | ) 8 | 9 | type Counter struct { 10 | count int64 11 | start int64 12 | duration int64 13 | maxCount int64 14 | lock sync.Mutex 15 | } 16 | 17 | func NewCounter(duration int64, maxCount int64) *Counter { 18 | counter := &Counter{} 19 | counter.count = 0 20 | counter.start = time.Now().UnixNano() / 1e6 // 当前毫秒时间戳 21 | if duration == 0 { 22 | counter.duration = math.MaxInt64 // duration传0表示没有时间间隔限制,计数器不刷新 23 | } else { 24 | counter.duration = duration 25 | } 26 | counter.maxCount = maxCount 27 | return counter 28 | } 29 | 30 | // Count 计数器计数 31 | // n: 计数值 32 | // refersh: 计数器是否刷新 33 | // limit: 是否达到计数最大值 34 | // num: 计数后计数器的值 35 | func (counter *Counter) Count(n int64) (refresh bool, limit bool, num int64) { 36 | now := time.Now().UnixNano() / 1e6 37 | counter.lock.Lock() 38 | defer counter.lock.Unlock() 39 | 40 | if now-counter.start < counter.duration { 41 | counter.count += n 42 | num = counter.count 43 | limit = num > counter.maxCount 44 | } else { 45 | // num = counter.count // 刷新前的最大计数 46 | counter.start = now 47 | counter.count = 0 48 | refresh = true 49 | } 50 | return 51 | } 52 | 53 | func (counter *Counter) GetCount() (num int64) { 54 | counter.lock.Lock() 55 | defer counter.lock.Unlock() 56 | return counter.count 57 | } 58 | -------------------------------------------------------------------------------- /tests/consumer/README.md: -------------------------------------------------------------------------------- 1 | # RabbitMQ 测试消费者 2 | 3 | 这是一个用于测试 EMQX ExHook 服务将消息发送到 RabbitMQ 的测试消费者程序。 4 | 5 | ## 功能 6 | 7 | - 连接到 RabbitMQ 服务器 8 | - 创建一个队列并绑定到指定的交换机 9 | - 消费从交换机接收的消息 10 | - 解析并显示消息内容 11 | 12 | ## 使用方法 13 | 14 | ### 编译 15 | 16 | ```bash 17 | cd tests/consumer 18 | go build -o consumer 19 | ``` 20 | 21 | ### 运行 22 | 23 | 基本用法: 24 | 25 | ```bash 26 | ./consumer 27 | ``` 28 | 29 | 默认情况下,消费者将使用以下参数: 30 | - RabbitMQ 连接 URL: `amqp://guest:guest@localhost:5672/` 31 | - 交换机名称: `exchange_device_data_device_test` 32 | - 消费者名称: `consumer1` 33 | - 队列名称: `consumer1_queue` 34 | 35 | ### 自定义参数 36 | 37 | 您可以通过命令行参数自定义消费者行为: 38 | 39 | ```bash 40 | ./consumer -url=amqp://user:password@rabbitmq-host:5672/ -exchange=exchange_name -consumer=consumer_name -queue=queue_name 41 | ``` 42 | 43 | 参数说明: 44 | - `-url`: RabbitMQ 服务器连接 URL 45 | - `-exchange`: 要订阅的交换机名称 46 | - `-consumer`: 消费者标识名称 47 | - `-queue`: 要创建的队列名称(如果不指定,将使用消费者名称加上后缀 "_queue") 48 | 49 | ## 测试多个消费者 50 | 51 | 要测试多个消费者接收同一条消息,可以启动多个消费者实例,使它们订阅相同的交换机: 52 | 53 | ```bash 54 | # 终端 1 55 | ./consumer -consumer=consumer1 -exchange=exchange_device_data_device_test 56 | 57 | # 终端 2 58 | ./consumer -consumer=consumer2 -exchange=exchange_device_data_device_test 59 | ``` 60 | 61 | 当 EMQX 发布消息到指定主题时,两个消费者都会收到相同的消息。 62 | 63 | ## 配合 EMQX 测试 64 | 65 | 1. 确保 EMQX 和 RabbitMQ 服务都已启动 66 | 2. 启动 exhook-svc 服务 67 | 3. 启动一个或多个消费者 68 | 4. 使用 MQTT 客户端发布消息到 EMQX 的主题,例如 `device/test` 69 | 5. 观察消费者输出的消息内容 -------------------------------------------------------------------------------- /kit/rediscli.go: -------------------------------------------------------------------------------- 1 | package kit 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "github.com/go-redis/redis/v8" 7 | "time" 8 | ) 9 | 10 | type RedisDB struct { 11 | *redis.Client 12 | } 13 | 14 | func NewRedisClient(host, password string, port, db int) (*RedisDB, error) { 15 | rdb := redis.NewClient(&redis.Options{ 16 | Addr: fmt.Sprintf("%s:%d", host, port), 17 | Password: password, 18 | DB: db, 19 | }) 20 | 21 | if _, err := rdb.Ping(context.Background()).Result(); err != nil { 22 | return nil, err 23 | } 24 | 25 | return &RedisDB{ 26 | Client: rdb, 27 | }, nil 28 | } 29 | 30 | func (rdb *RedisDB) HGet(key, field string, obj interface{}) error { 31 | return rdb.Client.HGet(context.Background(), key, field).Scan(obj) 32 | } 33 | 34 | func (rdb *RedisDB) HSet(key, field string, val interface{}) error { 35 | return rdb.Client.HSet(context.Background(), key, field, val).Err() 36 | } 37 | 38 | func (rdb *RedisDB) HDel(key string, fields ...string) error { 39 | return rdb.Client.HDel(context.Background(), key, fields...).Err() 40 | } 41 | 42 | func (rdb *RedisDB) Get(key string, obj interface{}) error { 43 | return rdb.Client.Get(context.Background(), key).Scan(obj) 44 | } 45 | 46 | func (rdb *RedisDB) GetResult(key string) (string, error) { 47 | return rdb.Client.Get(context.Background(), key).Result() 48 | } 49 | 50 | func (rdb *RedisDB) Set(key string, val interface{}, expir time.Duration) error { 51 | return rdb.Client.Set(context.Background(), key, val, expir).Err() 52 | } 53 | -------------------------------------------------------------------------------- /netbase/queue.go: -------------------------------------------------------------------------------- 1 | package netbase 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "log" 7 | "strings" 8 | ) 9 | 10 | // 根据topic获取交换机名称 11 | func getExchangeNameByTopic(topic string) string { 12 | // 移除topic中可能包含的通配符 13 | cleanTopic := strings.Replace(topic, "#", "", -1) 14 | cleanTopic = strings.Replace(cleanTopic, "+", "", -1) 15 | 16 | // 将斜杠替换为下划线,避免命名问题 17 | exchangeName := strings.Replace(cleanTopic, "/", "_", -1) 18 | 19 | // 为不同类型的topic设置不同交换机 20 | if strings.HasPrefix(topic, "device/") { 21 | return "exchange_device_data_" + exchangeName 22 | } else if strings.HasPrefix(topic, "sensor/") { 23 | return "exchange_sensor_data_" + exchangeName 24 | } else if strings.HasPrefix(topic, "control/") { 25 | return "exchange_control_cmd_" + exchangeName 26 | } else if strings.HasPrefix(topic, "status/") { 27 | return "exchange_status_update_" + exchangeName 28 | } 29 | 30 | // 默认交换机 31 | return "exchange_default_" + exchangeName 32 | } 33 | 34 | // 发布消息到RabbitMQ交换机 35 | func publishToQueue(data *DeviceEventInfo) error { 36 | if RabbitMQClient == nil { 37 | return fmt.Errorf("RabbitMQ客户端未初始化") 38 | } 39 | 40 | // 使用topic作为交换机名称 41 | exchangeName := getExchangeNameByTopic(data.Topic) 42 | 43 | // 将数据序列化为JSON 44 | jsonData, err := json.Marshal(data) 45 | if err != nil { 46 | return fmt.Errorf("序列化消息失败: %v", err) 47 | } 48 | 49 | // 发布消息到RabbitMQ交换机(消息会被标记为持久化) 50 | err = RabbitMQClient.PublishToExchange(exchangeName, jsonData) 51 | if err != nil { 52 | return fmt.Errorf("推送消息到RabbitMQ交换机失败: %v", err) 53 | } 54 | 55 | log.Printf("消息已推送到RabbitMQ交换机 %s,数据大小: %d字节", exchangeName, len(jsonData)) 56 | return nil 57 | } 58 | -------------------------------------------------------------------------------- /netbase/rabbitmq_pubsub.go: -------------------------------------------------------------------------------- 1 | package netbase 2 | 3 | import ( 4 | "fmt" 5 | 6 | amqp "github.com/rabbitmq/amqp091-go" 7 | ) 8 | 9 | // DeclareExchange 声明交换机(持久化) 10 | func (r *RabbitMQ) DeclareExchange(name string) error { 11 | r.mutex.Lock() 12 | defer r.mutex.Unlock() 13 | 14 | return r.channel.ExchangeDeclare( 15 | name, // 交换机名称 16 | "fanout", // 类型:fanout表示广播给所有绑定的队列 17 | true, // 持久化 18 | false, // 自动删除 19 | false, // 内部使用 20 | false, // 不等待服务器响应 21 | nil, // 额外参数 22 | ) 23 | } 24 | 25 | // BindQueueToExchange 将队列绑定到交换机 26 | func (r *RabbitMQ) BindQueueToExchange(queueName, exchangeName string) error { 27 | r.mutex.Lock() 28 | defer r.mutex.Unlock() 29 | 30 | return r.channel.QueueBind( 31 | queueName, // 队列名称 32 | "", // 路由键(fanout模式下忽略) 33 | exchangeName, // 交换机名称 34 | false, // 不等待服务器响应 35 | nil, // 额外参数 36 | ) 37 | } 38 | 39 | // PublishToExchange 发布消息到交换机(广播给所有绑定的队列) 40 | func (r *RabbitMQ) PublishToExchange(exchangeName string, body []byte) error { 41 | r.mutex.Lock() 42 | defer r.mutex.Unlock() 43 | 44 | // 确保交换机存在 45 | err := r.channel.ExchangeDeclare( 46 | exchangeName, // 交换机名称 47 | "fanout", // 类型:fanout表示广播给所有绑定的队列 48 | true, // 持久化 49 | false, // 自动删除 50 | false, // 内部使用 51 | false, // 不等待服务器响应 52 | nil, // 额外参数 53 | ) 54 | if err != nil { 55 | return fmt.Errorf("声明交换机失败: %v", err) 56 | } 57 | 58 | return r.channel.Publish( 59 | exchangeName, // 交换机 60 | "", // 路由键(fanout模式下忽略) 61 | false, // 强制 62 | false, // 立即 63 | amqp.Publishing{ 64 | DeliveryMode: amqp.Persistent, // 持久化消息 65 | ContentType: "application/json", 66 | Body: body, 67 | }, 68 | ) 69 | } 70 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "net" 7 | "os" 8 | "os/signal" 9 | "syscall" 10 | 11 | config "emqx.io/grpc/exhook/config" 12 | 13 | "emqx.io/grpc/exhook/kit" 14 | "emqx.io/grpc/exhook/netbase" 15 | pb "emqx.io/grpc/exhook/protobuf" 16 | "google.golang.org/grpc" 17 | ) 18 | 19 | func main() { 20 | // 加载配置 21 | conf, err := config.LoadConfig("config.yml") 22 | if err != nil { 23 | log.Fatalf("加载配置失败: %v", err) 24 | } 25 | 26 | // 从配置获取Redis连接参数 (仍然保留Redis连接用于验证设备) 27 | client, err := kit.NewRedisClient( 28 | conf.Redis.Host, 29 | conf.Redis.Password, 30 | conf.Redis.Port, 31 | conf.Redis.DB, 32 | ) 33 | if err != nil { 34 | log.Panic("Redis连接错误") 35 | } else { 36 | log.Println("Redis连接成功") 37 | } 38 | netbase.RedisDb = client 39 | 40 | // 初始化RabbitMQ连接 41 | rabbitMQConfig := netbase.RabbitMQConfig{ 42 | Host: conf.RabbitMQ.Host, 43 | Port: conf.RabbitMQ.Port, 44 | Username: conf.RabbitMQ.Username, 45 | Password: conf.RabbitMQ.Password, 46 | VHost: conf.RabbitMQ.VHost, 47 | } 48 | 49 | rabbitMQ, err := netbase.NewRabbitMQ(rabbitMQConfig) 50 | if err != nil { 51 | log.Fatalf("RabbitMQ连接失败: %v", err) 52 | } 53 | defer rabbitMQ.Close() 54 | netbase.RabbitMQClient = rabbitMQ 55 | 56 | // 从配置获取服务端口 57 | port := fmt.Sprintf(":%d", conf.Server.Port) 58 | lis, err := net.Listen("tcp", port) 59 | if err != nil { 60 | log.Fatalf("监听失败: %v", err) 61 | } 62 | s := grpc.NewServer() 63 | 64 | // 使用hooks服务 65 | hookServer := netbase.NewHookServer() 66 | pb.RegisterHookProviderServer(s, hookServer) 67 | 68 | // 优雅关闭 69 | go func() { 70 | c := make(chan os.Signal, 1) 71 | signal.Notify(c, os.Interrupt, syscall.SIGTERM) 72 | <-c 73 | log.Println("接收到终止信号,正在关闭服务...") 74 | s.GracefulStop() 75 | }() 76 | 77 | log.Printf("gRPC服务运行在::%d", conf.Server.Port) 78 | if err := s.Serve(lis); err != nil { 79 | log.Fatalf("服务创建失败: %v", err) 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /netbase/iothub_session.go: -------------------------------------------------------------------------------- 1 | package netbase 2 | 3 | import ( 4 | "bytes" 5 | "encoding/base64" 6 | "encoding/json" 7 | "github.com/google/uuid" 8 | "strconv" 9 | "strings" 10 | ) 11 | 12 | type DeviceAuth struct { 13 | Owner string `json:"owner"` 14 | OrgId int64 `json:"orgId"` 15 | DeviceId string `json:"deviceId"` 16 | DeviceType string `json:"deviceType"` 17 | DeviceProtocol string `json:"deviceProtocol"` 18 | ProductId string `json:"productId"` 19 | RuleChainId string `json:"ruleChainId"` 20 | Name string `json:"name"` 21 | CreatedAt int64 `json:"created_at"` 22 | ExpiredAt int64 `json:"expired_at"` 23 | } 24 | 25 | type DeviceEventInfo struct { 26 | DeviceId string `json:"deviceId"` 27 | DeviceAuth *DeviceAuth `json:"deviceAuth"` 28 | Datas string `json:"datas"` 29 | RequestId string `json:"requestId"` 30 | Topic string `json:"topic"` 31 | } 32 | 33 | func (j *DeviceEventInfo) Bytes() []byte { 34 | b, err := json.Marshal(j) 35 | if err != nil { 36 | panic(err) 37 | } 38 | return b 39 | } 40 | 41 | func (entity *DeviceAuth) GetDeviceToken(key string) error { 42 | if err := GetDeviceEtoken(key, entity); err != nil { 43 | return err 44 | } 45 | return nil 46 | } 47 | 48 | func (token *DeviceAuth) MD5ID() string { 49 | buf := bytes.NewBufferString(token.DeviceId) 50 | buf.WriteString(token.DeviceType) 51 | buf.WriteString(strconv.FormatInt(token.CreatedAt, 10)) 52 | access := base64.URLEncoding.EncodeToString([]byte(uuid.NewMD5(uuid.Must(uuid.NewRandom()), buf.Bytes()).String())) 53 | access = strings.TrimRight(access, "=") 54 | return access 55 | } 56 | 57 | func (token *DeviceAuth) GetMarshal() string { 58 | marshal, _ := json.Marshal(*token) 59 | return string(marshal) 60 | } 61 | 62 | func (token *DeviceAuth) GetUnMarshal(data []byte) error { 63 | return json.Unmarshal(data, token) 64 | } 65 | 66 | // 序列化 67 | func (m *DeviceAuth) MarshalBinary() (data []byte, err error) { 68 | return json.Marshal(m) 69 | } 70 | 71 | // 反序列化 72 | func (m *DeviceAuth) UnmarshalBinary(data []byte) error { 73 | return json.Unmarshal(data, m) 74 | } 75 | -------------------------------------------------------------------------------- /netbase/rabbitmq.go: -------------------------------------------------------------------------------- 1 | package netbase 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "sync" 7 | 8 | amqp "github.com/rabbitmq/amqp091-go" 9 | ) 10 | 11 | // RabbitMQClient RabbitMQ客户端 12 | var RabbitMQClient *RabbitMQ 13 | 14 | // RabbitMQ 连接和通道封装 15 | type RabbitMQ struct { 16 | conn *amqp.Connection 17 | channel *amqp.Channel 18 | mutex sync.Mutex 19 | } 20 | 21 | // RabbitMQConfig RabbitMQ配置 22 | type RabbitMQConfig struct { 23 | Host string 24 | Port int 25 | Username string 26 | Password string 27 | VHost string 28 | } 29 | 30 | // NewRabbitMQ 创建新的RabbitMQ连接 31 | func NewRabbitMQ(config RabbitMQConfig) (*RabbitMQ, error) { 32 | // 构建连接URL 33 | url := fmt.Sprintf("amqp://%s:%s@%s:%d/%s", 34 | config.Username, 35 | config.Password, 36 | config.Host, 37 | config.Port, 38 | config.VHost) 39 | 40 | // 连接RabbitMQ 41 | conn, err := amqp.Dial(url) 42 | if err != nil { 43 | return nil, fmt.Errorf("连接RabbitMQ失败: %v", err) 44 | } 45 | 46 | // 创建通道 47 | channel, err := conn.Channel() 48 | if err != nil { 49 | conn.Close() 50 | return nil, fmt.Errorf("创建通道失败: %v", err) 51 | } 52 | 53 | log.Println("RabbitMQ连接成功") 54 | return &RabbitMQ{ 55 | conn: conn, 56 | channel: channel, 57 | }, nil 58 | } 59 | 60 | // Close 关闭连接 61 | func (r *RabbitMQ) Close() error { 62 | if r.channel != nil { 63 | r.channel.Close() 64 | } 65 | if r.conn != nil { 66 | return r.conn.Close() 67 | } 68 | return nil 69 | } 70 | 71 | // DeclareQueue 声明队列(持久化) 72 | func (r *RabbitMQ) DeclareQueue(name string) (amqp.Queue, error) { 73 | r.mutex.Lock() 74 | defer r.mutex.Unlock() 75 | 76 | return r.channel.QueueDeclare( 77 | name, // 队列名称 78 | true, // 持久化 79 | false, // 自动删除 80 | false, // 排他性 81 | false, // 不等待服务器响应 82 | nil, // 额外参数 83 | ) 84 | } 85 | 86 | // PublishMessage 发布消息到队列(持久化消息) 87 | func (r *RabbitMQ) PublishMessage(queueName string, body []byte) error { 88 | r.mutex.Lock() 89 | defer r.mutex.Unlock() 90 | 91 | // 确保队列存在 92 | _, err := r.DeclareQueue(queueName) 93 | if err != nil { 94 | return err 95 | } 96 | 97 | return r.channel.Publish( 98 | "", // 交换机 99 | queueName, // 路由键(队列名) 100 | false, // 强制 101 | false, // 立即 102 | amqp.Publishing{ 103 | DeliveryMode: amqp.Persistent, // 持久化消息 104 | ContentType: "application/json", 105 | Body: body, 106 | }, 107 | ) 108 | } 109 | -------------------------------------------------------------------------------- /tests/consumer/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "flag" 6 | "fmt" 7 | "log" 8 | "os" 9 | "os/signal" 10 | "syscall" 11 | 12 | amqp "github.com/rabbitmq/amqp091-go" 13 | ) 14 | 15 | // DeviceAuth 设备认证信息 16 | type DeviceAuth struct { 17 | Owner string `json:"owner"` 18 | OrgId int64 `json:"orgId"` 19 | DeviceId string `json:"deviceId"` 20 | DeviceType string `json:"deviceType"` 21 | DeviceProtocol string `json:"deviceProtocol"` 22 | ProductId string `json:"productId"` 23 | RuleChainId string `json:"ruleChainId"` 24 | Name string `json:"name"` 25 | CreatedAt int64 `json:"created_at"` 26 | ExpiredAt int64 `json:"expired_at"` 27 | } 28 | 29 | // DeviceEventInfo 设备事件信息 30 | type DeviceEventInfo struct { 31 | DeviceId string `json:"deviceId"` 32 | DeviceAuth *DeviceAuth `json:"deviceAuth"` 33 | Datas string `json:"datas"` 34 | RequestId string `json:"requestId"` 35 | Topic string `json:"topic"` 36 | } 37 | 38 | func main() { 39 | // 解析命令行参数 40 | var ( 41 | rabbitURL = flag.String("url", "amqp://guest:guest@localhost:5672/", "RabbitMQ连接URL") 42 | exchangeName = flag.String("exchange", "exchange_default_v1_devices_me_telemetry", "要订阅的交换机名称") 43 | queueName = flag.String("queue", "", "队列名称(默认为随机生成)") 44 | consumerName = flag.String("consumer", "consumer1", "消费者名称") 45 | ) 46 | flag.Parse() 47 | 48 | // 如果未指定队列名称,则使用消费者名称作为队列名前缀 49 | if *queueName == "" { 50 | *queueName = fmt.Sprintf("%s_queue", *consumerName) 51 | } 52 | 53 | log.Printf("启动消费者: %s, 连接到: %s, 订阅交换机: %s, 队列: %s\n", 54 | *consumerName, *rabbitURL, *exchangeName, *queueName) 55 | 56 | // 连接RabbitMQ 57 | conn, err := amqp.Dial(*rabbitURL) 58 | if err != nil { 59 | log.Fatalf("无法连接到RabbitMQ: %v", err) 60 | } 61 | defer conn.Close() 62 | 63 | // 创建通道 64 | ch, err := conn.Channel() 65 | if err != nil { 66 | log.Fatalf("无法创建通道: %v", err) 67 | } 68 | defer ch.Close() 69 | 70 | // 声明交换机 71 | err = ch.ExchangeDeclare( 72 | *exchangeName, // 交换机名称 73 | "fanout", // 类型 74 | true, // 持久化 75 | false, // 自动删除 76 | false, // 内部使用 77 | false, // 不等待 78 | nil, // 参数 79 | ) 80 | if err != nil { 81 | log.Fatalf("无法声明交换机: %v", err) 82 | } 83 | 84 | // 声明队列 85 | q, err := ch.QueueDeclare( 86 | *queueName, // 队列名 87 | true, // 持久化 88 | false, // 自动删除 89 | false, // 排他性 90 | false, // 不等待 91 | nil, // 参数 92 | ) 93 | if err != nil { 94 | log.Fatalf("无法声明队列: %v", err) 95 | } 96 | 97 | // 将队列绑定到交换机 98 | err = ch.QueueBind( 99 | q.Name, // 队列名 100 | "", // 路由键(fanout模式忽略) 101 | *exchangeName, // 交换机名 102 | false, // 不等待 103 | nil, // 参数 104 | ) 105 | if err != nil { 106 | log.Fatalf("无法绑定队列到交换机: %v", err) 107 | } 108 | 109 | // 消费消息 110 | msgs, err := ch.Consume( 111 | q.Name, // 队列名 112 | *consumerName, // 消费者标签 113 | true, // 自动确认 114 | false, // 排他性 115 | false, // 不等待 116 | false, // 参数 117 | nil, // 参数 118 | ) 119 | if err != nil { 120 | log.Fatalf("无法注册消费者: %v", err) 121 | } 122 | 123 | // 创建一个通道来接收中断信号 124 | stop := make(chan os.Signal, 1) 125 | signal.Notify(stop, os.Interrupt, syscall.SIGTERM) 126 | 127 | log.Printf("消费者 %s 已启动,等待消息...\n", *consumerName) 128 | 129 | // 在goroutine中消费消息 130 | go func() { 131 | for msg := range msgs { 132 | log.Printf("收到消息: [%d] 字节\n", len(msg.Body)) 133 | 134 | // 尝试解析JSON 135 | var eventInfo DeviceEventInfo 136 | if err := json.Unmarshal(msg.Body, &eventInfo); err != nil { 137 | log.Printf("JSON解析错误: %v\n", err) 138 | log.Printf("原始数据: %s\n", string(msg.Body)) 139 | continue 140 | } 141 | 142 | // 打印消息详情 143 | log.Printf("Topic: %s\n", eventInfo.Topic) 144 | log.Printf("DeviceId: %s\n", eventInfo.DeviceId) 145 | log.Printf("Datas: %s\n", eventInfo.Datas) 146 | 147 | if eventInfo.DeviceAuth != nil { 148 | log.Printf("设备信息: 类型=%s, 名称=%s\n", 149 | eventInfo.DeviceAuth.DeviceType, 150 | eventInfo.DeviceAuth.Name) 151 | } 152 | 153 | log.Println("---------------------------------------------") 154 | } 155 | }() 156 | 157 | // 等待中断信号 158 | <-stop 159 | log.Println("关闭消费者...") 160 | } 161 | -------------------------------------------------------------------------------- /netbase/hooks.go: -------------------------------------------------------------------------------- 1 | package netbase 2 | 3 | import ( 4 | "context" 5 | "log" 6 | 7 | pb "emqx.io/grpc/exhook/protobuf" 8 | ) 9 | 10 | // Server 是用于实现 emqx_exhook_v3 的服务器 11 | type Server struct { 12 | pb.UnimplementedHookProviderServer 13 | } 14 | 15 | // HookProviderServer callbacks 16 | 17 | func (s *Server) OnProviderLoaded(ctx context.Context, in *pb.ProviderLoadedRequest) (*pb.LoadedResponse, error) { 18 | hooks := []*pb.HookSpec{ 19 | &pb.HookSpec{Name: "client.connect"}, 20 | &pb.HookSpec{Name: "client.connack"}, 21 | &pb.HookSpec{Name: "client.connected"}, 22 | &pb.HookSpec{Name: "client.disconnected"}, 23 | &pb.HookSpec{Name: "client.authenticate"}, 24 | &pb.HookSpec{Name: "client.authorize"}, 25 | &pb.HookSpec{Name: "client.subscribe"}, 26 | &pb.HookSpec{Name: "client.unsubscribe"}, 27 | &pb.HookSpec{Name: "session.created"}, 28 | &pb.HookSpec{Name: "session.subscribed"}, 29 | &pb.HookSpec{Name: "session.unsubscribed"}, 30 | &pb.HookSpec{Name: "session.resumed"}, 31 | &pb.HookSpec{Name: "session.discarded"}, 32 | &pb.HookSpec{Name: "session.takenover"}, 33 | &pb.HookSpec{Name: "session.terminated"}, 34 | &pb.HookSpec{Name: "message.publish"}, 35 | &pb.HookSpec{Name: "message.delivered"}, 36 | &pb.HookSpec{Name: "message.acked"}, 37 | &pb.HookSpec{Name: "message.dropped"}, 38 | } 39 | return &pb.LoadedResponse{Hooks: hooks}, nil 40 | } 41 | 42 | func (s *Server) OnProviderUnloaded(ctx context.Context, in *pb.ProviderUnloadedRequest) (*pb.EmptySuccess, error) { 43 | return &pb.EmptySuccess{}, nil 44 | } 45 | 46 | func (s *Server) OnClientConnect(ctx context.Context, in *pb.ClientConnectRequest) (*pb.EmptySuccess, error) { 47 | return &pb.EmptySuccess{}, nil 48 | } 49 | 50 | func (s *Server) OnClientConnack(ctx context.Context, in *pb.ClientConnackRequest) (*pb.EmptySuccess, error) { 51 | return &pb.EmptySuccess{}, nil 52 | } 53 | 54 | func (s *Server) OnClientConnected(ctx context.Context, in *pb.ClientConnectedRequest) (*pb.EmptySuccess, error) { 55 | return &pb.EmptySuccess{}, nil 56 | } 57 | 58 | func (s *Server) OnClientDisconnected(ctx context.Context, in *pb.ClientDisconnectedRequest) (*pb.EmptySuccess, error) { 59 | return &pb.EmptySuccess{}, nil 60 | } 61 | 62 | func (s *Server) OnClientAuthenticate(ctx context.Context, in *pb.ClientAuthenticateRequest) (*pb.ValuedResponse, error) { 63 | reply := &pb.ValuedResponse{} 64 | reply.Type = pb.ValuedResponse_STOP_AND_RETURN 65 | reply.Value = &pb.ValuedResponse_BoolResult{BoolResult: true} 66 | return reply, nil 67 | } 68 | 69 | func (s *Server) OnClientAuthorize(ctx context.Context, in *pb.ClientAuthorizeRequest) (*pb.ValuedResponse, error) { 70 | reply := &pb.ValuedResponse{} 71 | reply.Type = pb.ValuedResponse_STOP_AND_RETURN 72 | reply.Value = &pb.ValuedResponse_BoolResult{BoolResult: true} 73 | return reply, nil 74 | } 75 | 76 | func (s *Server) OnClientSubscribe(ctx context.Context, in *pb.ClientSubscribeRequest) (*pb.EmptySuccess, error) { 77 | return &pb.EmptySuccess{}, nil 78 | } 79 | 80 | func (s *Server) OnClientUnsubscribe(ctx context.Context, in *pb.ClientUnsubscribeRequest) (*pb.EmptySuccess, error) { 81 | return &pb.EmptySuccess{}, nil 82 | } 83 | 84 | func (s *Server) OnSessionCreated(ctx context.Context, in *pb.SessionCreatedRequest) (*pb.EmptySuccess, error) { 85 | return &pb.EmptySuccess{}, nil 86 | } 87 | func (s *Server) OnSessionSubscribed(ctx context.Context, in *pb.SessionSubscribedRequest) (*pb.EmptySuccess, error) { 88 | return &pb.EmptySuccess{}, nil 89 | } 90 | 91 | func (s *Server) OnSessionUnsubscribed(ctx context.Context, in *pb.SessionUnsubscribedRequest) (*pb.EmptySuccess, error) { 92 | return &pb.EmptySuccess{}, nil 93 | } 94 | 95 | func (s *Server) OnSessionResumed(ctx context.Context, in *pb.SessionResumedRequest) (*pb.EmptySuccess, error) { 96 | return &pb.EmptySuccess{}, nil 97 | } 98 | 99 | func (s *Server) OnSessionDiscarded(ctx context.Context, in *pb.SessionDiscardedRequest) (*pb.EmptySuccess, error) { 100 | return &pb.EmptySuccess{}, nil 101 | } 102 | 103 | func (s *Server) OnSessionTakenover(ctx context.Context, in *pb.SessionTakenoverRequest) (*pb.EmptySuccess, error) { 104 | return &pb.EmptySuccess{}, nil 105 | } 106 | 107 | func (s *Server) OnSessionTerminated(ctx context.Context, in *pb.SessionTerminatedRequest) (*pb.EmptySuccess, error) { 108 | return &pb.EmptySuccess{}, nil 109 | } 110 | 111 | func (s *Server) OnMessagePublish(ctx context.Context, in *pb.MessagePublishRequest) (*pb.ValuedResponse, error) { 112 | reply := &pb.ValuedResponse{} 113 | reply.Type = pb.ValuedResponse_STOP_AND_RETURN 114 | reply.Value = &pb.ValuedResponse_Message{Message: in.Message} 115 | 116 | datas := string(in.GetMessage().GetPayload()) 117 | username := in.Message.Headers["username"] 118 | etoken := &DeviceAuth{} 119 | etoken.GetDeviceToken(username) 120 | 121 | data := &DeviceEventInfo{ 122 | Datas: datas, 123 | DeviceId: etoken.DeviceId, 124 | DeviceAuth: etoken, 125 | Topic: in.Message.Topic, 126 | } 127 | 128 | // 将消息发布到RabbitMQ交换机,支持多个消费者订阅 129 | err := publishToQueue(data) 130 | if err != nil { 131 | log.Printf("发布消息到RabbitMQ失败: %v, topic: %s", err, in.Message.Topic) 132 | } else { 133 | log.Printf("成功发布消息到RabbitMQ交换机, topic: %s", in.Message.Topic) 134 | } 135 | 136 | return reply, nil 137 | } 138 | 139 | func (s *Server) OnMessageDelivered(ctx context.Context, in *pb.MessageDeliveredRequest) (*pb.EmptySuccess, error) { 140 | return &pb.EmptySuccess{}, nil 141 | } 142 | 143 | func (s *Server) OnMessageDropped(ctx context.Context, in *pb.MessageDroppedRequest) (*pb.EmptySuccess, error) { 144 | return &pb.EmptySuccess{}, nil 145 | } 146 | 147 | func (s *Server) OnMessageAcked(ctx context.Context, in *pb.MessageAckedRequest) (*pb.EmptySuccess, error) { 148 | return &pb.EmptySuccess{}, nil 149 | } 150 | 151 | // NewHookServer 创建并返回一个新的Server实例 152 | func NewHookServer() *Server { 153 | return &Server{} 154 | } 155 | -------------------------------------------------------------------------------- /protobuf/exhook.proto: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // Copyright (c) 2020-2022 EMQ Technologies Co., Ltd. All Rights Reserved. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | //------------------------------------------------------------------------------ 16 | 17 | syntax = "proto3"; 18 | 19 | option csharp_namespace = "Emqx.Exhook.V2"; 20 | option go_package = "emqx.io/grpc/exhook"; 21 | option java_multiple_files = true; 22 | option java_package = "io.emqx.exhook"; 23 | option java_outer_classname = "EmqxExHookProto"; 24 | 25 | // The exhook proto version should be fixed as `v2` in EMQX v5.x 26 | // to make sure the exhook proto version is compatible 27 | package emqx.exhook.v2; 28 | 29 | service HookProvider { 30 | 31 | rpc OnProviderLoaded(ProviderLoadedRequest) returns (LoadedResponse) {}; 32 | 33 | rpc OnProviderUnloaded(ProviderUnloadedRequest) returns (EmptySuccess) {}; 34 | 35 | rpc OnClientConnect(ClientConnectRequest) returns (EmptySuccess) {}; 36 | 37 | rpc OnClientConnack(ClientConnackRequest) returns (EmptySuccess) {}; 38 | 39 | rpc OnClientConnected(ClientConnectedRequest) returns (EmptySuccess) {}; 40 | 41 | rpc OnClientDisconnected(ClientDisconnectedRequest) returns (EmptySuccess) {}; 42 | 43 | rpc OnClientAuthenticate(ClientAuthenticateRequest) returns (ValuedResponse) {}; 44 | 45 | rpc OnClientAuthorize(ClientAuthorizeRequest) returns (ValuedResponse) {}; 46 | 47 | rpc OnClientSubscribe(ClientSubscribeRequest) returns (EmptySuccess) {}; 48 | 49 | rpc OnClientUnsubscribe(ClientUnsubscribeRequest) returns (EmptySuccess) {}; 50 | 51 | rpc OnSessionCreated(SessionCreatedRequest) returns (EmptySuccess) {}; 52 | 53 | rpc OnSessionSubscribed(SessionSubscribedRequest) returns (EmptySuccess) {}; 54 | 55 | rpc OnSessionUnsubscribed(SessionUnsubscribedRequest) returns (EmptySuccess) {}; 56 | 57 | rpc OnSessionResumed(SessionResumedRequest) returns (EmptySuccess) {}; 58 | 59 | rpc OnSessionDiscarded(SessionDiscardedRequest) returns (EmptySuccess) {}; 60 | 61 | rpc OnSessionTakenover(SessionTakenoverRequest) returns (EmptySuccess) {}; 62 | 63 | rpc OnSessionTerminated(SessionTerminatedRequest) returns (EmptySuccess) {}; 64 | 65 | rpc OnMessagePublish(MessagePublishRequest) returns (ValuedResponse) {}; 66 | 67 | rpc OnMessageDelivered(MessageDeliveredRequest) returns (EmptySuccess) {}; 68 | 69 | rpc OnMessageDropped(MessageDroppedRequest) returns (EmptySuccess) {}; 70 | 71 | rpc OnMessageAcked(MessageAckedRequest) returns (EmptySuccess) {}; 72 | } 73 | 74 | //------------------------------------------------------------------------------ 75 | // Request 76 | //------------------------------------------------------------------------------ 77 | 78 | message ProviderLoadedRequest { 79 | 80 | BrokerInfo broker = 1; 81 | 82 | RequestMeta meta = 2; 83 | } 84 | 85 | message ProviderUnloadedRequest { 86 | 87 | RequestMeta meta = 1; 88 | } 89 | 90 | message ClientConnectRequest { 91 | 92 | ConnInfo conninfo = 1; 93 | 94 | // MQTT CONNECT packet's properties (MQTT v5.0) 95 | // 96 | // It should be empty on MQTT v3.1.1/v3.1 or others protocol 97 | repeated Property props = 2; 98 | 99 | RequestMeta meta = 3; 100 | } 101 | 102 | message ClientConnackRequest { 103 | 104 | ConnInfo conninfo = 1; 105 | 106 | string result_code = 2; 107 | 108 | repeated Property props = 3; 109 | 110 | RequestMeta meta = 4; 111 | } 112 | 113 | message ClientConnectedRequest { 114 | 115 | ClientInfo clientinfo = 1; 116 | 117 | RequestMeta meta = 2; 118 | } 119 | 120 | message ClientDisconnectedRequest { 121 | 122 | ClientInfo clientinfo = 1; 123 | 124 | string reason = 2; 125 | 126 | RequestMeta meta = 3; 127 | } 128 | 129 | message ClientAuthenticateRequest { 130 | 131 | ClientInfo clientinfo = 1; 132 | 133 | bool result = 2; 134 | 135 | RequestMeta meta = 3; 136 | } 137 | 138 | message ClientAuthorizeRequest { 139 | 140 | ClientInfo clientinfo = 1; 141 | 142 | enum AuthorizeReqType { 143 | 144 | PUBLISH = 0; 145 | 146 | SUBSCRIBE = 1; 147 | } 148 | 149 | AuthorizeReqType type = 2; 150 | 151 | string topic = 3; 152 | 153 | bool result = 4; 154 | 155 | RequestMeta meta = 5; 156 | } 157 | 158 | message ClientSubscribeRequest { 159 | 160 | ClientInfo clientinfo = 1; 161 | 162 | repeated Property props = 2; 163 | 164 | repeated TopicFilter topic_filters = 3; 165 | 166 | RequestMeta meta = 4; 167 | } 168 | 169 | message ClientUnsubscribeRequest { 170 | 171 | ClientInfo clientinfo = 1; 172 | 173 | repeated Property props = 2; 174 | 175 | repeated TopicFilter topic_filters = 3; 176 | 177 | RequestMeta meta = 4; 178 | } 179 | 180 | message SessionCreatedRequest { 181 | 182 | ClientInfo clientinfo = 1; 183 | 184 | RequestMeta meta = 2; 185 | } 186 | 187 | message SessionSubscribedRequest { 188 | 189 | ClientInfo clientinfo = 1; 190 | 191 | string topic = 2; 192 | 193 | SubOpts subopts = 3; 194 | 195 | RequestMeta meta = 4; 196 | } 197 | 198 | message SessionUnsubscribedRequest { 199 | 200 | ClientInfo clientinfo = 1; 201 | 202 | string topic = 2; 203 | 204 | RequestMeta meta = 3; 205 | } 206 | 207 | message SessionResumedRequest { 208 | 209 | ClientInfo clientinfo = 1; 210 | 211 | RequestMeta meta = 2; 212 | } 213 | 214 | message SessionDiscardedRequest { 215 | 216 | ClientInfo clientinfo = 1; 217 | 218 | RequestMeta meta = 2; 219 | } 220 | 221 | message SessionTakenoverRequest { 222 | 223 | ClientInfo clientinfo = 1; 224 | 225 | RequestMeta meta = 2; 226 | } 227 | 228 | message SessionTerminatedRequest { 229 | 230 | ClientInfo clientinfo = 1; 231 | 232 | string reason = 2; 233 | 234 | RequestMeta meta = 3; 235 | } 236 | 237 | message MessagePublishRequest { 238 | 239 | Message message = 1; 240 | 241 | RequestMeta meta = 2; 242 | } 243 | 244 | message MessageDeliveredRequest { 245 | 246 | ClientInfo clientinfo = 1; 247 | 248 | Message message = 2; 249 | 250 | RequestMeta meta = 3; 251 | } 252 | 253 | message MessageDroppedRequest { 254 | 255 | Message message = 1; 256 | 257 | string reason = 2; 258 | 259 | RequestMeta meta = 3; 260 | } 261 | 262 | message MessageAckedRequest { 263 | 264 | ClientInfo clientinfo = 1; 265 | 266 | Message message = 2; 267 | 268 | RequestMeta meta = 3; 269 | } 270 | 271 | //------------------------------------------------------------------------------ 272 | // Response 273 | //------------------------------------------------------------------------------ 274 | 275 | // Responsed by `ProviderLoadedRequest` 276 | 277 | message LoadedResponse { 278 | 279 | repeated HookSpec hooks = 1; 280 | } 281 | 282 | // Responsed by `ClientAuthenticateRequest` `ClientAuthorizeRequest` `MessagePublishRequest` 283 | 284 | message ValuedResponse { 285 | 286 | // The responded value type 287 | // - contiune: Use the responded value and execute the next hook 288 | // - ignore: Ignore the responded value 289 | // - stop_and_return: Use the responded value and stop the chain executing 290 | enum ResponsedType { 291 | 292 | CONTINUE = 0; 293 | 294 | IGNORE = 1; 295 | 296 | STOP_AND_RETURN = 2; 297 | } 298 | 299 | ResponsedType type = 1; 300 | 301 | oneof value { 302 | 303 | // Boolean result, used on the 'client.authenticate', 'client.authorize' hooks 304 | bool bool_result = 3; 305 | 306 | // Message result, used on the 'message.*' hooks 307 | Message message = 4; 308 | } 309 | } 310 | 311 | // no Response by other Requests 312 | 313 | message EmptySuccess { } 314 | 315 | //------------------------------------------------------------------------------ 316 | // Basic data types 317 | //------------------------------------------------------------------------------ 318 | 319 | message BrokerInfo { 320 | 321 | string version = 1; 322 | 323 | string sysdescr = 2; 324 | 325 | int64 uptime = 3; 326 | 327 | string datetime = 4; 328 | } 329 | 330 | 331 | message HookSpec { 332 | 333 | // The registered hooks name 334 | // 335 | // Available value: 336 | // "client.connect", "client.connack" 337 | // "client.connected", "client.disconnected" 338 | // "client.authenticate", "client.authorize" 339 | // "client.subscribe", "client.unsubscribe" 340 | // 341 | // "session.created", "session.subscribed" 342 | // "session.unsubscribed", "session.resumed" 343 | // "session.discarded", "session.takenover" 344 | // "session.terminated" 345 | // 346 | // "message.publish", "message.delivered" 347 | // "message.acked", "message.dropped" 348 | string name = 1; 349 | 350 | // The topic filters for message hooks 351 | repeated string topics = 2; 352 | } 353 | 354 | message ConnInfo { 355 | 356 | string node = 1; 357 | 358 | string clientid = 2; 359 | 360 | string username = 3; 361 | 362 | string peerhost = 4; 363 | 364 | uint32 sockport = 5; 365 | 366 | string proto_name = 6; 367 | 368 | string proto_ver = 7; 369 | 370 | uint32 keepalive = 8; 371 | } 372 | 373 | message ClientInfo { 374 | 375 | string node = 1; 376 | 377 | string clientid = 2; 378 | 379 | string username = 3; 380 | 381 | string password = 4; 382 | 383 | string peerhost = 5; 384 | 385 | uint32 sockport = 6; 386 | 387 | string protocol = 7; 388 | 389 | string mountpoint = 8; 390 | 391 | bool is_superuser = 9; 392 | 393 | bool anonymous = 10; 394 | 395 | // common name of client TLS cert 396 | string cn = 11; 397 | 398 | // subject of client TLS cert 399 | string dn = 12; 400 | } 401 | 402 | message Message { 403 | 404 | string node = 1; 405 | 406 | string id = 2; 407 | 408 | uint32 qos = 3; 409 | 410 | string from = 4; 411 | 412 | string topic = 5; 413 | 414 | bytes payload = 6; 415 | 416 | uint64 timestamp = 7; 417 | 418 | // The key of header can be: 419 | // - username: 420 | // * Readonly 421 | // * The username of sender client 422 | // * Value type: utf8 string 423 | // - protocol: 424 | // * Readonly 425 | // * The protocol name of sender client 426 | // * Value type: string enum with "mqtt", "mqtt-sn", ... 427 | // - peerhost: 428 | // * Readonly 429 | // * The peerhost of sender client 430 | // * Value type: ip address string 431 | // - allow_publish: 432 | // * Writable 433 | // * Whether to allow the message to be published by emqx 434 | // * Value type: string enum with "true", "false", default is "true" 435 | // 436 | // Notes: All header may be missing, which means that the message does not 437 | // carry these headers. We can guarantee that clients coming from MQTT, 438 | // MQTT-SN, CoAP, LwM2M and other natively supported protocol clients will 439 | // carry these headers, but there is no guarantee that messages published 440 | // by other means will do, e.g. messages published by HTTP-API 441 | map headers = 8; 442 | } 443 | 444 | message Property { 445 | 446 | string name = 1; 447 | 448 | string value = 2; 449 | } 450 | 451 | message TopicFilter { 452 | 453 | string name = 1; 454 | 455 | uint32 qos = 2; 456 | } 457 | 458 | message SubOpts { 459 | 460 | // The QoS level 461 | uint32 qos = 1; 462 | 463 | // The group name for shared subscription 464 | string share = 2; 465 | 466 | // The Retain Handling option (MQTT v5.0) 467 | // 468 | // 0 = Send retained messages at the time of the subscribe 469 | // 1 = Send retained messages at subscribe only if the subscription does 470 | // not currently exist 471 | // 2 = Do not send retained messages at the time of the subscribe 472 | uint32 rh = 3; 473 | 474 | // The Retain as Published option (MQTT v5.0) 475 | // 476 | // If 1, Application Messages forwarded using this subscription keep the 477 | // RETAIN flag they were published with. 478 | // If 0, Application Messages forwarded using this subscription have the 479 | // RETAIN flag set to 0. 480 | // Retained messages sent when the subscription is established have the RETAIN flag set to 1. 481 | uint32 rap = 4; 482 | 483 | // The No Local option (MQTT v5.0) 484 | // 485 | // If the value is 1, Application Messages MUST NOT be forwarded to a 486 | // connection with a ClientID equal to the ClientID of the publishing 487 | uint32 nl = 5; 488 | } 489 | 490 | message RequestMeta { 491 | 492 | string node = 1; 493 | 494 | string version = 2; 495 | 496 | string sysdescr = 3; 497 | 498 | string cluster_name = 4; 499 | } -------------------------------------------------------------------------------- /protobuf-v3/exhook.proto: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // Copyright (c) 2020-2025 EMQ Technologies Co., Ltd. All Rights Reserved. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | //------------------------------------------------------------------------------ 16 | 17 | syntax = "proto3"; 18 | 19 | option csharp_namespace = "Emqx.Exhook.V3"; 20 | option go_package = "emqx.io/grpc/exhook"; 21 | option java_multiple_files = true; 22 | option java_package = "io.emqx.exhook"; 23 | option java_outer_classname = "EmqxExHookProto"; 24 | 25 | // Please make sure the exhook proto version is compatible 26 | // with the EMQX version 27 | // v3: EMQX 5.9.0+ 28 | // v2: EMQX 5.0-5.8.x 29 | package emqx.exhook.v3; 30 | 31 | service HookProvider { 32 | 33 | rpc OnProviderLoaded(ProviderLoadedRequest) returns (LoadedResponse) {}; 34 | 35 | rpc OnProviderUnloaded(ProviderUnloadedRequest) returns (EmptySuccess) {}; 36 | 37 | rpc OnClientConnect(ClientConnectRequest) returns (EmptySuccess) {}; 38 | 39 | rpc OnClientConnack(ClientConnackRequest) returns (EmptySuccess) {}; 40 | 41 | rpc OnClientConnected(ClientConnectedRequest) returns (EmptySuccess) {}; 42 | 43 | rpc OnClientDisconnected(ClientDisconnectedRequest) returns (EmptySuccess) {}; 44 | 45 | rpc OnClientAuthenticate(ClientAuthenticateRequest) returns (ValuedResponse) {}; 46 | 47 | rpc OnClientAuthorize(ClientAuthorizeRequest) returns (ValuedResponse) {}; 48 | 49 | rpc OnClientSubscribe(ClientSubscribeRequest) returns (EmptySuccess) {}; 50 | 51 | rpc OnClientUnsubscribe(ClientUnsubscribeRequest) returns (EmptySuccess) {}; 52 | 53 | rpc OnSessionCreated(SessionCreatedRequest) returns (EmptySuccess) {}; 54 | 55 | rpc OnSessionSubscribed(SessionSubscribedRequest) returns (EmptySuccess) {}; 56 | 57 | rpc OnSessionUnsubscribed(SessionUnsubscribedRequest) returns (EmptySuccess) {}; 58 | 59 | rpc OnSessionResumed(SessionResumedRequest) returns (EmptySuccess) {}; 60 | 61 | rpc OnSessionDiscarded(SessionDiscardedRequest) returns (EmptySuccess) {}; 62 | 63 | rpc OnSessionTakenover(SessionTakenoverRequest) returns (EmptySuccess) {}; 64 | 65 | rpc OnSessionTerminated(SessionTerminatedRequest) returns (EmptySuccess) {}; 66 | 67 | rpc OnMessagePublish(MessagePublishRequest) returns (ValuedResponse) {}; 68 | 69 | rpc OnMessageDelivered(MessageDeliveredRequest) returns (EmptySuccess) {}; 70 | 71 | rpc OnMessageDropped(MessageDroppedRequest) returns (EmptySuccess) {}; 72 | 73 | rpc OnMessageAcked(MessageAckedRequest) returns (EmptySuccess) {}; 74 | } 75 | 76 | //------------------------------------------------------------------------------ 77 | // Request 78 | //------------------------------------------------------------------------------ 79 | 80 | message ProviderLoadedRequest { 81 | 82 | BrokerInfo broker = 1; 83 | 84 | RequestMeta meta = 2; 85 | } 86 | 87 | message ProviderUnloadedRequest { 88 | 89 | RequestMeta meta = 1; 90 | } 91 | 92 | message ClientConnectRequest { 93 | 94 | ConnInfo conninfo = 1; 95 | 96 | // MQTT CONNECT packet's properties (MQTT v5.0) 97 | // 98 | // It should be empty on MQTT v3.1.1/v3.1 or others protocol 99 | repeated Property props = 2; 100 | 101 | RequestMeta meta = 3; 102 | 103 | repeated Property user_props = 4; 104 | } 105 | 106 | message ClientConnackRequest { 107 | 108 | ConnInfo conninfo = 1; 109 | 110 | string result_code = 2; 111 | 112 | repeated Property props = 3; 113 | 114 | RequestMeta meta = 4; 115 | 116 | repeated Property user_props = 5; 117 | } 118 | 119 | message ClientConnectedRequest { 120 | 121 | ClientInfo clientinfo = 1; 122 | 123 | RequestMeta meta = 2; 124 | } 125 | 126 | message ClientDisconnectedRequest { 127 | 128 | ClientInfo clientinfo = 1; 129 | 130 | string reason = 2; 131 | 132 | RequestMeta meta = 3; 133 | } 134 | 135 | message ClientAuthenticateRequest { 136 | 137 | ClientInfo clientinfo = 1; 138 | 139 | bool result = 2; 140 | 141 | RequestMeta meta = 3; 142 | } 143 | 144 | message ClientAuthorizeRequest { 145 | 146 | ClientInfo clientinfo = 1; 147 | 148 | enum AuthorizeReqType { 149 | 150 | PUBLISH = 0; 151 | 152 | SUBSCRIBE = 1; 153 | } 154 | 155 | AuthorizeReqType type = 2; 156 | 157 | // In ClientAuthorizeRequest. 158 | // Only "real-topic" will be serialized in gRPC request when shared-sub. 159 | // For example, when client subscribes to `$share/group/t/1`, the real topic is `t/1`. 160 | string topic = 3; 161 | 162 | bool result = 4; 163 | 164 | RequestMeta meta = 5; 165 | } 166 | 167 | message ClientSubscribeRequest { 168 | 169 | ClientInfo clientinfo = 1; 170 | 171 | repeated Property props = 2; 172 | 173 | repeated TopicFilter topic_filters = 3; 174 | 175 | RequestMeta meta = 4; 176 | 177 | repeated Property user_props = 5; 178 | } 179 | 180 | message ClientUnsubscribeRequest { 181 | 182 | ClientInfo clientinfo = 1; 183 | 184 | repeated Property props = 2; 185 | 186 | repeated TopicFilter topic_filters = 3; 187 | 188 | RequestMeta meta = 4; 189 | 190 | repeated Property user_props = 5; 191 | } 192 | 193 | message SessionCreatedRequest { 194 | 195 | ClientInfo clientinfo = 1; 196 | 197 | RequestMeta meta = 2; 198 | } 199 | 200 | message SessionSubscribedRequest { 201 | 202 | ClientInfo clientinfo = 1; 203 | 204 | string topic = 2; 205 | 206 | SubOpts subopts = 3; 207 | 208 | RequestMeta meta = 4; 209 | } 210 | 211 | message SessionUnsubscribedRequest { 212 | 213 | ClientInfo clientinfo = 1; 214 | 215 | string topic = 2; 216 | 217 | RequestMeta meta = 3; 218 | } 219 | 220 | message SessionResumedRequest { 221 | 222 | ClientInfo clientinfo = 1; 223 | 224 | RequestMeta meta = 2; 225 | } 226 | 227 | message SessionDiscardedRequest { 228 | 229 | ClientInfo clientinfo = 1; 230 | 231 | RequestMeta meta = 2; 232 | } 233 | 234 | message SessionTakenoverRequest { 235 | 236 | ClientInfo clientinfo = 1; 237 | 238 | RequestMeta meta = 2; 239 | } 240 | 241 | message SessionTerminatedRequest { 242 | 243 | ClientInfo clientinfo = 1; 244 | 245 | string reason = 2; 246 | 247 | RequestMeta meta = 3; 248 | } 249 | 250 | message MessagePublishRequest { 251 | 252 | Message message = 1; 253 | 254 | RequestMeta meta = 2; 255 | 256 | repeated Property props = 3; 257 | 258 | repeated Property user_props = 4; 259 | } 260 | 261 | message MessageDeliveredRequest { 262 | 263 | ClientInfo clientinfo = 1; 264 | 265 | Message message = 2; 266 | 267 | RequestMeta meta = 3; 268 | } 269 | 270 | message MessageDroppedRequest { 271 | 272 | Message message = 1; 273 | 274 | string reason = 2; 275 | 276 | RequestMeta meta = 3; 277 | } 278 | 279 | message MessageAckedRequest { 280 | 281 | ClientInfo clientinfo = 1; 282 | 283 | Message message = 2; 284 | 285 | RequestMeta meta = 3; 286 | } 287 | 288 | //------------------------------------------------------------------------------ 289 | // Response 290 | //------------------------------------------------------------------------------ 291 | 292 | // Responsed by `ProviderLoadedRequest` 293 | 294 | message LoadedResponse { 295 | 296 | repeated HookSpec hooks = 1; 297 | } 298 | 299 | // Responsed by `ClientAuthenticateRequest` `ClientAuthorizeRequest` `MessagePublishRequest` 300 | 301 | message ValuedResponse { 302 | 303 | // The responded value type 304 | // - contiune: Use the responded value and execute the next hook 305 | // - ignore: Ignore the responded value 306 | // - stop_and_return: Use the responded value and stop the chain executing 307 | enum ResponsedType { 308 | 309 | CONTINUE = 0; 310 | 311 | IGNORE = 1; 312 | 313 | STOP_AND_RETURN = 2; 314 | } 315 | 316 | ResponsedType type = 1; 317 | 318 | oneof value { 319 | 320 | // Boolean result, used on the 'client.authenticate', 'client.authorize' hooks 321 | bool bool_result = 3; 322 | 323 | // Message result, used on the 'message.*' hooks 324 | Message message = 4; 325 | } 326 | } 327 | 328 | // no Response by other Requests 329 | 330 | message EmptySuccess { } 331 | 332 | //------------------------------------------------------------------------------ 333 | // Basic data types 334 | //------------------------------------------------------------------------------ 335 | 336 | message BrokerInfo { 337 | 338 | string version = 1; 339 | 340 | string sysdescr = 2; 341 | 342 | int64 uptime = 3; 343 | 344 | string datetime = 4; 345 | } 346 | 347 | 348 | message HookSpec { 349 | 350 | // The registered hooks name 351 | // 352 | // Available value: 353 | // "client.connect", "client.connack" 354 | // "client.connected", "client.disconnected" 355 | // "client.authenticate", "client.authorize" 356 | // "client.subscribe", "client.unsubscribe" 357 | // 358 | // "session.created", "session.subscribed" 359 | // "session.unsubscribed", "session.resumed" 360 | // "session.discarded", "session.takenover" 361 | // "session.terminated" 362 | // 363 | // "message.publish", "message.delivered" 364 | // "message.acked", "message.dropped" 365 | string name = 1; 366 | 367 | // The topic filters for message hooks 368 | repeated string topics = 2; 369 | } 370 | 371 | message ConnInfo { 372 | 373 | string node = 1; 374 | 375 | string clientid = 2; 376 | 377 | string username = 3; 378 | 379 | string peerhost = 4; 380 | 381 | uint32 sockport = 5; 382 | 383 | string proto_name = 6; 384 | 385 | string proto_ver = 7; 386 | 387 | uint32 keepalive = 8; 388 | 389 | uint32 peerport = 9; 390 | } 391 | 392 | message ClientInfo { 393 | 394 | string node = 1; 395 | 396 | string clientid = 2; 397 | 398 | string username = 3; 399 | 400 | string password = 4; 401 | 402 | string peerhost = 5; 403 | 404 | uint32 sockport = 6; 405 | 406 | string protocol = 7; 407 | 408 | string mountpoint = 8; 409 | 410 | bool is_superuser = 9; 411 | 412 | bool anonymous = 10; 413 | 414 | // common name of client TLS cert 415 | string cn = 11; 416 | 417 | // subject of client TLS cert 418 | string dn = 12; 419 | 420 | uint32 peerport = 13; 421 | } 422 | 423 | message Message { 424 | 425 | string node = 1; 426 | 427 | string id = 2; 428 | 429 | uint32 qos = 3; 430 | 431 | string from = 4; 432 | 433 | string topic = 5; 434 | 435 | bytes payload = 6; 436 | 437 | uint64 timestamp = 7; 438 | 439 | // The key of header can be: 440 | // - username: 441 | // * Readonly 442 | // * The username of sender client 443 | // * Value type: utf8 string 444 | // - protocol: 445 | // * Readonly 446 | // * The protocol name of sender client 447 | // * Value type: string enum with "mqtt", "mqtt-sn", ... 448 | // - peerhost: 449 | // * Readonly 450 | // * The peerhost of sender client 451 | // * Value type: ip address string 452 | // - allow_publish: 453 | // * Writable 454 | // * Whether to allow the message to be published by emqx 455 | // * Value type: string enum with "true", "false", default is "true" 456 | // 457 | // Notes: All header may be missing, which means that the message does not 458 | // carry these headers. We can guarantee that clients coming from MQTT, 459 | // MQTT-SN, CoAP, LwM2M and other natively supported protocol clients will 460 | // carry these headers, but there is no guarantee that messages published 461 | // by other means will do, e.g. messages published by HTTP-API 462 | map headers = 8; 463 | } 464 | 465 | message Property { 466 | 467 | string name = 1; 468 | 469 | string value = 2; 470 | } 471 | 472 | message TopicFilter { 473 | 474 | string name = 1; 475 | 476 | // Deprecated 477 | // Since EMQX 5.4.0, we have deprecated the 'qos' field in the `TopicFilter` structure. 478 | // A new field named 'subopts,' has been added to encompass all subscription options. 479 | // Please see the `SubOpts` structure for details. 480 | reserved 2; 481 | reserved "qos"; 482 | 483 | SubOpts subopts = 3; 484 | } 485 | 486 | message SubOpts { 487 | 488 | // The QoS level 489 | uint32 qos = 1; 490 | 491 | // Deprecated 492 | reserved 2; 493 | reserved "share"; 494 | // Since EMQX 5.4.0, we have deprecated the 'share' field in the `SubOpts` structure. 495 | // The group name of shared subscription will be serialized with topic. 496 | // hooks: 497 | // "client.subscribe": 498 | // ClientSubscribeRequest.TopicFilter.name = "$share/group/topic/1" 499 | // "client.unsubscribe": 500 | // ClientUnsubscribeRequest.TopicFilter.name = "$share/group/topic/1" 501 | // "session.subscribed": 502 | // SessionSubscribedRequest.topic = "$share/group/topic/1" 503 | // "session.unsubscribed": 504 | // SessionUnsubscribedRequest.topic = "$share/group/topic/1" 505 | 506 | // The Retain Handling option (MQTT v5.0) 507 | // 508 | // 0 = Send retained messages at the time of the subscribe 509 | // 1 = Send retained messages at subscribe only if the subscription does 510 | // not currently exist 511 | // 2 = Do not send retained messages at the time of the subscribe 512 | uint32 rh = 3; 513 | 514 | // The Retain as Published option (MQTT v5.0) 515 | // 516 | // If 1, Application Messages forwarded using this subscription keep the 517 | // RETAIN flag they were published with. 518 | // If 0, Application Messages forwarded using this subscription have the 519 | // RETAIN flag set to 0. 520 | // Retained messages sent when the subscription is established have the RETAIN flag set to 1. 521 | uint32 rap = 4; 522 | 523 | // The No Local option (MQTT v5.0) 524 | // 525 | // If the value is 1, Application Messages MUST NOT be forwarded to a 526 | // connection with a ClientID equal to the ClientID of the publishing 527 | uint32 nl = 5; 528 | } 529 | 530 | message RequestMeta { 531 | 532 | string node = 1; 533 | 534 | string version = 2; 535 | 536 | string sysdescr = 3; 537 | 538 | string cluster_name = 4; 539 | } -------------------------------------------------------------------------------- /protobuf/exhook_grpc.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go-grpc. DO NOT EDIT. 2 | // versions: 3 | // - protoc-gen-go-grpc v1.2.0 4 | // - protoc v3.18.1 5 | // source: protobuf/exhook.proto 6 | 7 | package exhook 8 | 9 | import ( 10 | context "context" 11 | grpc "google.golang.org/grpc" 12 | codes "google.golang.org/grpc/codes" 13 | status "google.golang.org/grpc/status" 14 | ) 15 | 16 | // This is a compile-time assertion to ensure that this generated file 17 | // is compatible with the grpc package it is being compiled against. 18 | // Requires gRPC-Go v1.32.0 or later. 19 | const _ = grpc.SupportPackageIsVersion7 20 | 21 | // HookProviderClient is the client API for HookProvider service. 22 | // 23 | // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. 24 | type HookProviderClient interface { 25 | OnProviderLoaded(ctx context.Context, in *ProviderLoadedRequest, opts ...grpc.CallOption) (*LoadedResponse, error) 26 | OnProviderUnloaded(ctx context.Context, in *ProviderUnloadedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 27 | OnClientConnect(ctx context.Context, in *ClientConnectRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 28 | OnClientConnack(ctx context.Context, in *ClientConnackRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 29 | OnClientConnected(ctx context.Context, in *ClientConnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 30 | OnClientDisconnected(ctx context.Context, in *ClientDisconnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 31 | OnClientAuthenticate(ctx context.Context, in *ClientAuthenticateRequest, opts ...grpc.CallOption) (*ValuedResponse, error) 32 | OnClientAuthorize(ctx context.Context, in *ClientAuthorizeRequest, opts ...grpc.CallOption) (*ValuedResponse, error) 33 | OnClientSubscribe(ctx context.Context, in *ClientSubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 34 | OnClientUnsubscribe(ctx context.Context, in *ClientUnsubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 35 | OnSessionCreated(ctx context.Context, in *SessionCreatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 36 | OnSessionSubscribed(ctx context.Context, in *SessionSubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 37 | OnSessionUnsubscribed(ctx context.Context, in *SessionUnsubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 38 | OnSessionResumed(ctx context.Context, in *SessionResumedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 39 | OnSessionDiscarded(ctx context.Context, in *SessionDiscardedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 40 | OnSessionTakenover(ctx context.Context, in *SessionTakenoverRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 41 | OnSessionTerminated(ctx context.Context, in *SessionTerminatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 42 | OnMessagePublish(ctx context.Context, in *MessagePublishRequest, opts ...grpc.CallOption) (*ValuedResponse, error) 43 | OnMessageDelivered(ctx context.Context, in *MessageDeliveredRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 44 | OnMessageDropped(ctx context.Context, in *MessageDroppedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 45 | OnMessageAcked(ctx context.Context, in *MessageAckedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 46 | } 47 | 48 | type hookProviderClient struct { 49 | cc grpc.ClientConnInterface 50 | } 51 | 52 | func NewHookProviderClient(cc grpc.ClientConnInterface) HookProviderClient { 53 | return &hookProviderClient{cc} 54 | } 55 | 56 | func (c *hookProviderClient) OnProviderLoaded(ctx context.Context, in *ProviderLoadedRequest, opts ...grpc.CallOption) (*LoadedResponse, error) { 57 | out := new(LoadedResponse) 58 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnProviderLoaded", in, out, opts...) 59 | if err != nil { 60 | return nil, err 61 | } 62 | return out, nil 63 | } 64 | 65 | func (c *hookProviderClient) OnProviderUnloaded(ctx context.Context, in *ProviderUnloadedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 66 | out := new(EmptySuccess) 67 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnProviderUnloaded", in, out, opts...) 68 | if err != nil { 69 | return nil, err 70 | } 71 | return out, nil 72 | } 73 | 74 | func (c *hookProviderClient) OnClientConnect(ctx context.Context, in *ClientConnectRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 75 | out := new(EmptySuccess) 76 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientConnect", in, out, opts...) 77 | if err != nil { 78 | return nil, err 79 | } 80 | return out, nil 81 | } 82 | 83 | func (c *hookProviderClient) OnClientConnack(ctx context.Context, in *ClientConnackRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 84 | out := new(EmptySuccess) 85 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientConnack", in, out, opts...) 86 | if err != nil { 87 | return nil, err 88 | } 89 | return out, nil 90 | } 91 | 92 | func (c *hookProviderClient) OnClientConnected(ctx context.Context, in *ClientConnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 93 | out := new(EmptySuccess) 94 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientConnected", in, out, opts...) 95 | if err != nil { 96 | return nil, err 97 | } 98 | return out, nil 99 | } 100 | 101 | func (c *hookProviderClient) OnClientDisconnected(ctx context.Context, in *ClientDisconnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 102 | out := new(EmptySuccess) 103 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientDisconnected", in, out, opts...) 104 | if err != nil { 105 | return nil, err 106 | } 107 | return out, nil 108 | } 109 | 110 | func (c *hookProviderClient) OnClientAuthenticate(ctx context.Context, in *ClientAuthenticateRequest, opts ...grpc.CallOption) (*ValuedResponse, error) { 111 | out := new(ValuedResponse) 112 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientAuthenticate", in, out, opts...) 113 | if err != nil { 114 | return nil, err 115 | } 116 | return out, nil 117 | } 118 | 119 | func (c *hookProviderClient) OnClientAuthorize(ctx context.Context, in *ClientAuthorizeRequest, opts ...grpc.CallOption) (*ValuedResponse, error) { 120 | out := new(ValuedResponse) 121 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientAuthorize", in, out, opts...) 122 | if err != nil { 123 | return nil, err 124 | } 125 | return out, nil 126 | } 127 | 128 | func (c *hookProviderClient) OnClientSubscribe(ctx context.Context, in *ClientSubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 129 | out := new(EmptySuccess) 130 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientSubscribe", in, out, opts...) 131 | if err != nil { 132 | return nil, err 133 | } 134 | return out, nil 135 | } 136 | 137 | func (c *hookProviderClient) OnClientUnsubscribe(ctx context.Context, in *ClientUnsubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 138 | out := new(EmptySuccess) 139 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnClientUnsubscribe", in, out, opts...) 140 | if err != nil { 141 | return nil, err 142 | } 143 | return out, nil 144 | } 145 | 146 | func (c *hookProviderClient) OnSessionCreated(ctx context.Context, in *SessionCreatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 147 | out := new(EmptySuccess) 148 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnSessionCreated", in, out, opts...) 149 | if err != nil { 150 | return nil, err 151 | } 152 | return out, nil 153 | } 154 | 155 | func (c *hookProviderClient) OnSessionSubscribed(ctx context.Context, in *SessionSubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 156 | out := new(EmptySuccess) 157 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnSessionSubscribed", in, out, opts...) 158 | if err != nil { 159 | return nil, err 160 | } 161 | return out, nil 162 | } 163 | 164 | func (c *hookProviderClient) OnSessionUnsubscribed(ctx context.Context, in *SessionUnsubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 165 | out := new(EmptySuccess) 166 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnSessionUnsubscribed", in, out, opts...) 167 | if err != nil { 168 | return nil, err 169 | } 170 | return out, nil 171 | } 172 | 173 | func (c *hookProviderClient) OnSessionResumed(ctx context.Context, in *SessionResumedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 174 | out := new(EmptySuccess) 175 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnSessionResumed", in, out, opts...) 176 | if err != nil { 177 | return nil, err 178 | } 179 | return out, nil 180 | } 181 | 182 | func (c *hookProviderClient) OnSessionDiscarded(ctx context.Context, in *SessionDiscardedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 183 | out := new(EmptySuccess) 184 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnSessionDiscarded", in, out, opts...) 185 | if err != nil { 186 | return nil, err 187 | } 188 | return out, nil 189 | } 190 | 191 | func (c *hookProviderClient) OnSessionTakenover(ctx context.Context, in *SessionTakenoverRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 192 | out := new(EmptySuccess) 193 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnSessionTakenover", in, out, opts...) 194 | if err != nil { 195 | return nil, err 196 | } 197 | return out, nil 198 | } 199 | 200 | func (c *hookProviderClient) OnSessionTerminated(ctx context.Context, in *SessionTerminatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 201 | out := new(EmptySuccess) 202 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnSessionTerminated", in, out, opts...) 203 | if err != nil { 204 | return nil, err 205 | } 206 | return out, nil 207 | } 208 | 209 | func (c *hookProviderClient) OnMessagePublish(ctx context.Context, in *MessagePublishRequest, opts ...grpc.CallOption) (*ValuedResponse, error) { 210 | out := new(ValuedResponse) 211 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnMessagePublish", in, out, opts...) 212 | if err != nil { 213 | return nil, err 214 | } 215 | return out, nil 216 | } 217 | 218 | func (c *hookProviderClient) OnMessageDelivered(ctx context.Context, in *MessageDeliveredRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 219 | out := new(EmptySuccess) 220 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnMessageDelivered", in, out, opts...) 221 | if err != nil { 222 | return nil, err 223 | } 224 | return out, nil 225 | } 226 | 227 | func (c *hookProviderClient) OnMessageDropped(ctx context.Context, in *MessageDroppedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 228 | out := new(EmptySuccess) 229 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnMessageDropped", in, out, opts...) 230 | if err != nil { 231 | return nil, err 232 | } 233 | return out, nil 234 | } 235 | 236 | func (c *hookProviderClient) OnMessageAcked(ctx context.Context, in *MessageAckedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 237 | out := new(EmptySuccess) 238 | err := c.cc.Invoke(ctx, "/emqx.exhook.v2.HookProvider/OnMessageAcked", in, out, opts...) 239 | if err != nil { 240 | return nil, err 241 | } 242 | return out, nil 243 | } 244 | 245 | // HookProviderServer is the server API for HookProvider service. 246 | // All implementations must embed UnimplementedHookProviderServer 247 | // for forward compatibility 248 | type HookProviderServer interface { 249 | OnProviderLoaded(context.Context, *ProviderLoadedRequest) (*LoadedResponse, error) 250 | OnProviderUnloaded(context.Context, *ProviderUnloadedRequest) (*EmptySuccess, error) 251 | OnClientConnect(context.Context, *ClientConnectRequest) (*EmptySuccess, error) 252 | OnClientConnack(context.Context, *ClientConnackRequest) (*EmptySuccess, error) 253 | OnClientConnected(context.Context, *ClientConnectedRequest) (*EmptySuccess, error) 254 | OnClientDisconnected(context.Context, *ClientDisconnectedRequest) (*EmptySuccess, error) 255 | OnClientAuthenticate(context.Context, *ClientAuthenticateRequest) (*ValuedResponse, error) 256 | OnClientAuthorize(context.Context, *ClientAuthorizeRequest) (*ValuedResponse, error) 257 | OnClientSubscribe(context.Context, *ClientSubscribeRequest) (*EmptySuccess, error) 258 | OnClientUnsubscribe(context.Context, *ClientUnsubscribeRequest) (*EmptySuccess, error) 259 | OnSessionCreated(context.Context, *SessionCreatedRequest) (*EmptySuccess, error) 260 | OnSessionSubscribed(context.Context, *SessionSubscribedRequest) (*EmptySuccess, error) 261 | OnSessionUnsubscribed(context.Context, *SessionUnsubscribedRequest) (*EmptySuccess, error) 262 | OnSessionResumed(context.Context, *SessionResumedRequest) (*EmptySuccess, error) 263 | OnSessionDiscarded(context.Context, *SessionDiscardedRequest) (*EmptySuccess, error) 264 | OnSessionTakenover(context.Context, *SessionTakenoverRequest) (*EmptySuccess, error) 265 | OnSessionTerminated(context.Context, *SessionTerminatedRequest) (*EmptySuccess, error) 266 | OnMessagePublish(context.Context, *MessagePublishRequest) (*ValuedResponse, error) 267 | OnMessageDelivered(context.Context, *MessageDeliveredRequest) (*EmptySuccess, error) 268 | OnMessageDropped(context.Context, *MessageDroppedRequest) (*EmptySuccess, error) 269 | OnMessageAcked(context.Context, *MessageAckedRequest) (*EmptySuccess, error) 270 | mustEmbedUnimplementedHookProviderServer() 271 | } 272 | 273 | // UnimplementedHookProviderServer must be embedded to have forward compatible implementations. 274 | type UnimplementedHookProviderServer struct { 275 | } 276 | 277 | func (UnimplementedHookProviderServer) OnProviderLoaded(context.Context, *ProviderLoadedRequest) (*LoadedResponse, error) { 278 | return nil, status.Errorf(codes.Unimplemented, "method OnProviderLoaded not implemented") 279 | } 280 | func (UnimplementedHookProviderServer) OnProviderUnloaded(context.Context, *ProviderUnloadedRequest) (*EmptySuccess, error) { 281 | return nil, status.Errorf(codes.Unimplemented, "method OnProviderUnloaded not implemented") 282 | } 283 | func (UnimplementedHookProviderServer) OnClientConnect(context.Context, *ClientConnectRequest) (*EmptySuccess, error) { 284 | return nil, status.Errorf(codes.Unimplemented, "method OnClientConnect not implemented") 285 | } 286 | func (UnimplementedHookProviderServer) OnClientConnack(context.Context, *ClientConnackRequest) (*EmptySuccess, error) { 287 | return nil, status.Errorf(codes.Unimplemented, "method OnClientConnack not implemented") 288 | } 289 | func (UnimplementedHookProviderServer) OnClientConnected(context.Context, *ClientConnectedRequest) (*EmptySuccess, error) { 290 | return nil, status.Errorf(codes.Unimplemented, "method OnClientConnected not implemented") 291 | } 292 | func (UnimplementedHookProviderServer) OnClientDisconnected(context.Context, *ClientDisconnectedRequest) (*EmptySuccess, error) { 293 | return nil, status.Errorf(codes.Unimplemented, "method OnClientDisconnected not implemented") 294 | } 295 | func (UnimplementedHookProviderServer) OnClientAuthenticate(context.Context, *ClientAuthenticateRequest) (*ValuedResponse, error) { 296 | return nil, status.Errorf(codes.Unimplemented, "method OnClientAuthenticate not implemented") 297 | } 298 | func (UnimplementedHookProviderServer) OnClientAuthorize(context.Context, *ClientAuthorizeRequest) (*ValuedResponse, error) { 299 | return nil, status.Errorf(codes.Unimplemented, "method OnClientAuthorize not implemented") 300 | } 301 | func (UnimplementedHookProviderServer) OnClientSubscribe(context.Context, *ClientSubscribeRequest) (*EmptySuccess, error) { 302 | return nil, status.Errorf(codes.Unimplemented, "method OnClientSubscribe not implemented") 303 | } 304 | func (UnimplementedHookProviderServer) OnClientUnsubscribe(context.Context, *ClientUnsubscribeRequest) (*EmptySuccess, error) { 305 | return nil, status.Errorf(codes.Unimplemented, "method OnClientUnsubscribe not implemented") 306 | } 307 | func (UnimplementedHookProviderServer) OnSessionCreated(context.Context, *SessionCreatedRequest) (*EmptySuccess, error) { 308 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionCreated not implemented") 309 | } 310 | func (UnimplementedHookProviderServer) OnSessionSubscribed(context.Context, *SessionSubscribedRequest) (*EmptySuccess, error) { 311 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionSubscribed not implemented") 312 | } 313 | func (UnimplementedHookProviderServer) OnSessionUnsubscribed(context.Context, *SessionUnsubscribedRequest) (*EmptySuccess, error) { 314 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionUnsubscribed not implemented") 315 | } 316 | func (UnimplementedHookProviderServer) OnSessionResumed(context.Context, *SessionResumedRequest) (*EmptySuccess, error) { 317 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionResumed not implemented") 318 | } 319 | func (UnimplementedHookProviderServer) OnSessionDiscarded(context.Context, *SessionDiscardedRequest) (*EmptySuccess, error) { 320 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionDiscarded not implemented") 321 | } 322 | func (UnimplementedHookProviderServer) OnSessionTakenover(context.Context, *SessionTakenoverRequest) (*EmptySuccess, error) { 323 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionTakenover not implemented") 324 | } 325 | func (UnimplementedHookProviderServer) OnSessionTerminated(context.Context, *SessionTerminatedRequest) (*EmptySuccess, error) { 326 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionTerminated not implemented") 327 | } 328 | func (UnimplementedHookProviderServer) OnMessagePublish(context.Context, *MessagePublishRequest) (*ValuedResponse, error) { 329 | return nil, status.Errorf(codes.Unimplemented, "method OnMessagePublish not implemented") 330 | } 331 | func (UnimplementedHookProviderServer) OnMessageDelivered(context.Context, *MessageDeliveredRequest) (*EmptySuccess, error) { 332 | return nil, status.Errorf(codes.Unimplemented, "method OnMessageDelivered not implemented") 333 | } 334 | func (UnimplementedHookProviderServer) OnMessageDropped(context.Context, *MessageDroppedRequest) (*EmptySuccess, error) { 335 | return nil, status.Errorf(codes.Unimplemented, "method OnMessageDropped not implemented") 336 | } 337 | func (UnimplementedHookProviderServer) OnMessageAcked(context.Context, *MessageAckedRequest) (*EmptySuccess, error) { 338 | return nil, status.Errorf(codes.Unimplemented, "method OnMessageAcked not implemented") 339 | } 340 | func (UnimplementedHookProviderServer) mustEmbedUnimplementedHookProviderServer() {} 341 | 342 | // UnsafeHookProviderServer may be embedded to opt out of forward compatibility for this service. 343 | // Use of this interface is not recommended, as added methods to HookProviderServer will 344 | // result in compilation errors. 345 | type UnsafeHookProviderServer interface { 346 | mustEmbedUnimplementedHookProviderServer() 347 | } 348 | 349 | func RegisterHookProviderServer(s grpc.ServiceRegistrar, srv HookProviderServer) { 350 | s.RegisterService(&HookProvider_ServiceDesc, srv) 351 | } 352 | 353 | func _HookProvider_OnProviderLoaded_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 354 | in := new(ProviderLoadedRequest) 355 | if err := dec(in); err != nil { 356 | return nil, err 357 | } 358 | if interceptor == nil { 359 | return srv.(HookProviderServer).OnProviderLoaded(ctx, in) 360 | } 361 | info := &grpc.UnaryServerInfo{ 362 | Server: srv, 363 | FullMethod: "/emqx.exhook.v2.HookProvider/OnProviderLoaded", 364 | } 365 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 366 | return srv.(HookProviderServer).OnProviderLoaded(ctx, req.(*ProviderLoadedRequest)) 367 | } 368 | return interceptor(ctx, in, info, handler) 369 | } 370 | 371 | func _HookProvider_OnProviderUnloaded_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 372 | in := new(ProviderUnloadedRequest) 373 | if err := dec(in); err != nil { 374 | return nil, err 375 | } 376 | if interceptor == nil { 377 | return srv.(HookProviderServer).OnProviderUnloaded(ctx, in) 378 | } 379 | info := &grpc.UnaryServerInfo{ 380 | Server: srv, 381 | FullMethod: "/emqx.exhook.v2.HookProvider/OnProviderUnloaded", 382 | } 383 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 384 | return srv.(HookProviderServer).OnProviderUnloaded(ctx, req.(*ProviderUnloadedRequest)) 385 | } 386 | return interceptor(ctx, in, info, handler) 387 | } 388 | 389 | func _HookProvider_OnClientConnect_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 390 | in := new(ClientConnectRequest) 391 | if err := dec(in); err != nil { 392 | return nil, err 393 | } 394 | if interceptor == nil { 395 | return srv.(HookProviderServer).OnClientConnect(ctx, in) 396 | } 397 | info := &grpc.UnaryServerInfo{ 398 | Server: srv, 399 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientConnect", 400 | } 401 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 402 | return srv.(HookProviderServer).OnClientConnect(ctx, req.(*ClientConnectRequest)) 403 | } 404 | return interceptor(ctx, in, info, handler) 405 | } 406 | 407 | func _HookProvider_OnClientConnack_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 408 | in := new(ClientConnackRequest) 409 | if err := dec(in); err != nil { 410 | return nil, err 411 | } 412 | if interceptor == nil { 413 | return srv.(HookProviderServer).OnClientConnack(ctx, in) 414 | } 415 | info := &grpc.UnaryServerInfo{ 416 | Server: srv, 417 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientConnack", 418 | } 419 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 420 | return srv.(HookProviderServer).OnClientConnack(ctx, req.(*ClientConnackRequest)) 421 | } 422 | return interceptor(ctx, in, info, handler) 423 | } 424 | 425 | func _HookProvider_OnClientConnected_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 426 | in := new(ClientConnectedRequest) 427 | if err := dec(in); err != nil { 428 | return nil, err 429 | } 430 | if interceptor == nil { 431 | return srv.(HookProviderServer).OnClientConnected(ctx, in) 432 | } 433 | info := &grpc.UnaryServerInfo{ 434 | Server: srv, 435 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientConnected", 436 | } 437 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 438 | return srv.(HookProviderServer).OnClientConnected(ctx, req.(*ClientConnectedRequest)) 439 | } 440 | return interceptor(ctx, in, info, handler) 441 | } 442 | 443 | func _HookProvider_OnClientDisconnected_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 444 | in := new(ClientDisconnectedRequest) 445 | if err := dec(in); err != nil { 446 | return nil, err 447 | } 448 | if interceptor == nil { 449 | return srv.(HookProviderServer).OnClientDisconnected(ctx, in) 450 | } 451 | info := &grpc.UnaryServerInfo{ 452 | Server: srv, 453 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientDisconnected", 454 | } 455 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 456 | return srv.(HookProviderServer).OnClientDisconnected(ctx, req.(*ClientDisconnectedRequest)) 457 | } 458 | return interceptor(ctx, in, info, handler) 459 | } 460 | 461 | func _HookProvider_OnClientAuthenticate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 462 | in := new(ClientAuthenticateRequest) 463 | if err := dec(in); err != nil { 464 | return nil, err 465 | } 466 | if interceptor == nil { 467 | return srv.(HookProviderServer).OnClientAuthenticate(ctx, in) 468 | } 469 | info := &grpc.UnaryServerInfo{ 470 | Server: srv, 471 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientAuthenticate", 472 | } 473 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 474 | return srv.(HookProviderServer).OnClientAuthenticate(ctx, req.(*ClientAuthenticateRequest)) 475 | } 476 | return interceptor(ctx, in, info, handler) 477 | } 478 | 479 | func _HookProvider_OnClientAuthorize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 480 | in := new(ClientAuthorizeRequest) 481 | if err := dec(in); err != nil { 482 | return nil, err 483 | } 484 | if interceptor == nil { 485 | return srv.(HookProviderServer).OnClientAuthorize(ctx, in) 486 | } 487 | info := &grpc.UnaryServerInfo{ 488 | Server: srv, 489 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientAuthorize", 490 | } 491 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 492 | return srv.(HookProviderServer).OnClientAuthorize(ctx, req.(*ClientAuthorizeRequest)) 493 | } 494 | return interceptor(ctx, in, info, handler) 495 | } 496 | 497 | func _HookProvider_OnClientSubscribe_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 498 | in := new(ClientSubscribeRequest) 499 | if err := dec(in); err != nil { 500 | return nil, err 501 | } 502 | if interceptor == nil { 503 | return srv.(HookProviderServer).OnClientSubscribe(ctx, in) 504 | } 505 | info := &grpc.UnaryServerInfo{ 506 | Server: srv, 507 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientSubscribe", 508 | } 509 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 510 | return srv.(HookProviderServer).OnClientSubscribe(ctx, req.(*ClientSubscribeRequest)) 511 | } 512 | return interceptor(ctx, in, info, handler) 513 | } 514 | 515 | func _HookProvider_OnClientUnsubscribe_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 516 | in := new(ClientUnsubscribeRequest) 517 | if err := dec(in); err != nil { 518 | return nil, err 519 | } 520 | if interceptor == nil { 521 | return srv.(HookProviderServer).OnClientUnsubscribe(ctx, in) 522 | } 523 | info := &grpc.UnaryServerInfo{ 524 | Server: srv, 525 | FullMethod: "/emqx.exhook.v2.HookProvider/OnClientUnsubscribe", 526 | } 527 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 528 | return srv.(HookProviderServer).OnClientUnsubscribe(ctx, req.(*ClientUnsubscribeRequest)) 529 | } 530 | return interceptor(ctx, in, info, handler) 531 | } 532 | 533 | func _HookProvider_OnSessionCreated_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 534 | in := new(SessionCreatedRequest) 535 | if err := dec(in); err != nil { 536 | return nil, err 537 | } 538 | if interceptor == nil { 539 | return srv.(HookProviderServer).OnSessionCreated(ctx, in) 540 | } 541 | info := &grpc.UnaryServerInfo{ 542 | Server: srv, 543 | FullMethod: "/emqx.exhook.v2.HookProvider/OnSessionCreated", 544 | } 545 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 546 | return srv.(HookProviderServer).OnSessionCreated(ctx, req.(*SessionCreatedRequest)) 547 | } 548 | return interceptor(ctx, in, info, handler) 549 | } 550 | 551 | func _HookProvider_OnSessionSubscribed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 552 | in := new(SessionSubscribedRequest) 553 | if err := dec(in); err != nil { 554 | return nil, err 555 | } 556 | if interceptor == nil { 557 | return srv.(HookProviderServer).OnSessionSubscribed(ctx, in) 558 | } 559 | info := &grpc.UnaryServerInfo{ 560 | Server: srv, 561 | FullMethod: "/emqx.exhook.v2.HookProvider/OnSessionSubscribed", 562 | } 563 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 564 | return srv.(HookProviderServer).OnSessionSubscribed(ctx, req.(*SessionSubscribedRequest)) 565 | } 566 | return interceptor(ctx, in, info, handler) 567 | } 568 | 569 | func _HookProvider_OnSessionUnsubscribed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 570 | in := new(SessionUnsubscribedRequest) 571 | if err := dec(in); err != nil { 572 | return nil, err 573 | } 574 | if interceptor == nil { 575 | return srv.(HookProviderServer).OnSessionUnsubscribed(ctx, in) 576 | } 577 | info := &grpc.UnaryServerInfo{ 578 | Server: srv, 579 | FullMethod: "/emqx.exhook.v2.HookProvider/OnSessionUnsubscribed", 580 | } 581 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 582 | return srv.(HookProviderServer).OnSessionUnsubscribed(ctx, req.(*SessionUnsubscribedRequest)) 583 | } 584 | return interceptor(ctx, in, info, handler) 585 | } 586 | 587 | func _HookProvider_OnSessionResumed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 588 | in := new(SessionResumedRequest) 589 | if err := dec(in); err != nil { 590 | return nil, err 591 | } 592 | if interceptor == nil { 593 | return srv.(HookProviderServer).OnSessionResumed(ctx, in) 594 | } 595 | info := &grpc.UnaryServerInfo{ 596 | Server: srv, 597 | FullMethod: "/emqx.exhook.v2.HookProvider/OnSessionResumed", 598 | } 599 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 600 | return srv.(HookProviderServer).OnSessionResumed(ctx, req.(*SessionResumedRequest)) 601 | } 602 | return interceptor(ctx, in, info, handler) 603 | } 604 | 605 | func _HookProvider_OnSessionDiscarded_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 606 | in := new(SessionDiscardedRequest) 607 | if err := dec(in); err != nil { 608 | return nil, err 609 | } 610 | if interceptor == nil { 611 | return srv.(HookProviderServer).OnSessionDiscarded(ctx, in) 612 | } 613 | info := &grpc.UnaryServerInfo{ 614 | Server: srv, 615 | FullMethod: "/emqx.exhook.v2.HookProvider/OnSessionDiscarded", 616 | } 617 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 618 | return srv.(HookProviderServer).OnSessionDiscarded(ctx, req.(*SessionDiscardedRequest)) 619 | } 620 | return interceptor(ctx, in, info, handler) 621 | } 622 | 623 | func _HookProvider_OnSessionTakenover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 624 | in := new(SessionTakenoverRequest) 625 | if err := dec(in); err != nil { 626 | return nil, err 627 | } 628 | if interceptor == nil { 629 | return srv.(HookProviderServer).OnSessionTakenover(ctx, in) 630 | } 631 | info := &grpc.UnaryServerInfo{ 632 | Server: srv, 633 | FullMethod: "/emqx.exhook.v2.HookProvider/OnSessionTakenover", 634 | } 635 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 636 | return srv.(HookProviderServer).OnSessionTakenover(ctx, req.(*SessionTakenoverRequest)) 637 | } 638 | return interceptor(ctx, in, info, handler) 639 | } 640 | 641 | func _HookProvider_OnSessionTerminated_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 642 | in := new(SessionTerminatedRequest) 643 | if err := dec(in); err != nil { 644 | return nil, err 645 | } 646 | if interceptor == nil { 647 | return srv.(HookProviderServer).OnSessionTerminated(ctx, in) 648 | } 649 | info := &grpc.UnaryServerInfo{ 650 | Server: srv, 651 | FullMethod: "/emqx.exhook.v2.HookProvider/OnSessionTerminated", 652 | } 653 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 654 | return srv.(HookProviderServer).OnSessionTerminated(ctx, req.(*SessionTerminatedRequest)) 655 | } 656 | return interceptor(ctx, in, info, handler) 657 | } 658 | 659 | func _HookProvider_OnMessagePublish_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 660 | in := new(MessagePublishRequest) 661 | if err := dec(in); err != nil { 662 | return nil, err 663 | } 664 | if interceptor == nil { 665 | return srv.(HookProviderServer).OnMessagePublish(ctx, in) 666 | } 667 | info := &grpc.UnaryServerInfo{ 668 | Server: srv, 669 | FullMethod: "/emqx.exhook.v2.HookProvider/OnMessagePublish", 670 | } 671 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 672 | return srv.(HookProviderServer).OnMessagePublish(ctx, req.(*MessagePublishRequest)) 673 | } 674 | return interceptor(ctx, in, info, handler) 675 | } 676 | 677 | func _HookProvider_OnMessageDelivered_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 678 | in := new(MessageDeliveredRequest) 679 | if err := dec(in); err != nil { 680 | return nil, err 681 | } 682 | if interceptor == nil { 683 | return srv.(HookProviderServer).OnMessageDelivered(ctx, in) 684 | } 685 | info := &grpc.UnaryServerInfo{ 686 | Server: srv, 687 | FullMethod: "/emqx.exhook.v2.HookProvider/OnMessageDelivered", 688 | } 689 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 690 | return srv.(HookProviderServer).OnMessageDelivered(ctx, req.(*MessageDeliveredRequest)) 691 | } 692 | return interceptor(ctx, in, info, handler) 693 | } 694 | 695 | func _HookProvider_OnMessageDropped_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 696 | in := new(MessageDroppedRequest) 697 | if err := dec(in); err != nil { 698 | return nil, err 699 | } 700 | if interceptor == nil { 701 | return srv.(HookProviderServer).OnMessageDropped(ctx, in) 702 | } 703 | info := &grpc.UnaryServerInfo{ 704 | Server: srv, 705 | FullMethod: "/emqx.exhook.v2.HookProvider/OnMessageDropped", 706 | } 707 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 708 | return srv.(HookProviderServer).OnMessageDropped(ctx, req.(*MessageDroppedRequest)) 709 | } 710 | return interceptor(ctx, in, info, handler) 711 | } 712 | 713 | func _HookProvider_OnMessageAcked_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 714 | in := new(MessageAckedRequest) 715 | if err := dec(in); err != nil { 716 | return nil, err 717 | } 718 | if interceptor == nil { 719 | return srv.(HookProviderServer).OnMessageAcked(ctx, in) 720 | } 721 | info := &grpc.UnaryServerInfo{ 722 | Server: srv, 723 | FullMethod: "/emqx.exhook.v2.HookProvider/OnMessageAcked", 724 | } 725 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 726 | return srv.(HookProviderServer).OnMessageAcked(ctx, req.(*MessageAckedRequest)) 727 | } 728 | return interceptor(ctx, in, info, handler) 729 | } 730 | 731 | // HookProvider_ServiceDesc is the grpc.ServiceDesc for HookProvider service. 732 | // It's only intended for direct use with grpc.RegisterService, 733 | // and not to be introspected or modified (even as a copy) 734 | var HookProvider_ServiceDesc = grpc.ServiceDesc{ 735 | ServiceName: "emqx.exhook.v2.HookProvider", 736 | HandlerType: (*HookProviderServer)(nil), 737 | Methods: []grpc.MethodDesc{ 738 | { 739 | MethodName: "OnProviderLoaded", 740 | Handler: _HookProvider_OnProviderLoaded_Handler, 741 | }, 742 | { 743 | MethodName: "OnProviderUnloaded", 744 | Handler: _HookProvider_OnProviderUnloaded_Handler, 745 | }, 746 | { 747 | MethodName: "OnClientConnect", 748 | Handler: _HookProvider_OnClientConnect_Handler, 749 | }, 750 | { 751 | MethodName: "OnClientConnack", 752 | Handler: _HookProvider_OnClientConnack_Handler, 753 | }, 754 | { 755 | MethodName: "OnClientConnected", 756 | Handler: _HookProvider_OnClientConnected_Handler, 757 | }, 758 | { 759 | MethodName: "OnClientDisconnected", 760 | Handler: _HookProvider_OnClientDisconnected_Handler, 761 | }, 762 | { 763 | MethodName: "OnClientAuthenticate", 764 | Handler: _HookProvider_OnClientAuthenticate_Handler, 765 | }, 766 | { 767 | MethodName: "OnClientAuthorize", 768 | Handler: _HookProvider_OnClientAuthorize_Handler, 769 | }, 770 | { 771 | MethodName: "OnClientSubscribe", 772 | Handler: _HookProvider_OnClientSubscribe_Handler, 773 | }, 774 | { 775 | MethodName: "OnClientUnsubscribe", 776 | Handler: _HookProvider_OnClientUnsubscribe_Handler, 777 | }, 778 | { 779 | MethodName: "OnSessionCreated", 780 | Handler: _HookProvider_OnSessionCreated_Handler, 781 | }, 782 | { 783 | MethodName: "OnSessionSubscribed", 784 | Handler: _HookProvider_OnSessionSubscribed_Handler, 785 | }, 786 | { 787 | MethodName: "OnSessionUnsubscribed", 788 | Handler: _HookProvider_OnSessionUnsubscribed_Handler, 789 | }, 790 | { 791 | MethodName: "OnSessionResumed", 792 | Handler: _HookProvider_OnSessionResumed_Handler, 793 | }, 794 | { 795 | MethodName: "OnSessionDiscarded", 796 | Handler: _HookProvider_OnSessionDiscarded_Handler, 797 | }, 798 | { 799 | MethodName: "OnSessionTakenover", 800 | Handler: _HookProvider_OnSessionTakenover_Handler, 801 | }, 802 | { 803 | MethodName: "OnSessionTerminated", 804 | Handler: _HookProvider_OnSessionTerminated_Handler, 805 | }, 806 | { 807 | MethodName: "OnMessagePublish", 808 | Handler: _HookProvider_OnMessagePublish_Handler, 809 | }, 810 | { 811 | MethodName: "OnMessageDelivered", 812 | Handler: _HookProvider_OnMessageDelivered_Handler, 813 | }, 814 | { 815 | MethodName: "OnMessageDropped", 816 | Handler: _HookProvider_OnMessageDropped_Handler, 817 | }, 818 | { 819 | MethodName: "OnMessageAcked", 820 | Handler: _HookProvider_OnMessageAcked_Handler, 821 | }, 822 | }, 823 | Streams: []grpc.StreamDesc{}, 824 | Metadata: "protobuf/exhook.proto", 825 | } 826 | -------------------------------------------------------------------------------- /protobuf-v3/exhook_grpc.pb.go: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // Copyright (c) 2020-2025 EMQ Technologies Co., Ltd. All Rights Reserved. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | //------------------------------------------------------------------------------ 16 | 17 | // Code generated by protoc-gen-go-grpc. DO NOT EDIT. 18 | // versions: 19 | // - protoc-gen-go-grpc v1.5.1 20 | // - protoc v6.31.0 21 | // source: protobuf/exhook.proto 22 | 23 | // Please make sure the exhook proto version is compatible 24 | // with the EMQX version 25 | // v3: EMQX 5.9.0+ 26 | // v2: EMQX 5.0-5.8.x 27 | 28 | package exhook 29 | 30 | import ( 31 | context "context" 32 | grpc "google.golang.org/grpc" 33 | codes "google.golang.org/grpc/codes" 34 | status "google.golang.org/grpc/status" 35 | ) 36 | 37 | // This is a compile-time assertion to ensure that this generated file 38 | // is compatible with the grpc package it is being compiled against. 39 | // Requires gRPC-Go v1.64.0 or later. 40 | const _ = grpc.SupportPackageIsVersion9 41 | 42 | const ( 43 | HookProvider_OnProviderLoaded_FullMethodName = "/emqx.exhook.v3.HookProvider/OnProviderLoaded" 44 | HookProvider_OnProviderUnloaded_FullMethodName = "/emqx.exhook.v3.HookProvider/OnProviderUnloaded" 45 | HookProvider_OnClientConnect_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientConnect" 46 | HookProvider_OnClientConnack_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientConnack" 47 | HookProvider_OnClientConnected_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientConnected" 48 | HookProvider_OnClientDisconnected_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientDisconnected" 49 | HookProvider_OnClientAuthenticate_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientAuthenticate" 50 | HookProvider_OnClientAuthorize_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientAuthorize" 51 | HookProvider_OnClientSubscribe_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientSubscribe" 52 | HookProvider_OnClientUnsubscribe_FullMethodName = "/emqx.exhook.v3.HookProvider/OnClientUnsubscribe" 53 | HookProvider_OnSessionCreated_FullMethodName = "/emqx.exhook.v3.HookProvider/OnSessionCreated" 54 | HookProvider_OnSessionSubscribed_FullMethodName = "/emqx.exhook.v3.HookProvider/OnSessionSubscribed" 55 | HookProvider_OnSessionUnsubscribed_FullMethodName = "/emqx.exhook.v3.HookProvider/OnSessionUnsubscribed" 56 | HookProvider_OnSessionResumed_FullMethodName = "/emqx.exhook.v3.HookProvider/OnSessionResumed" 57 | HookProvider_OnSessionDiscarded_FullMethodName = "/emqx.exhook.v3.HookProvider/OnSessionDiscarded" 58 | HookProvider_OnSessionTakenover_FullMethodName = "/emqx.exhook.v3.HookProvider/OnSessionTakenover" 59 | HookProvider_OnSessionTerminated_FullMethodName = "/emqx.exhook.v3.HookProvider/OnSessionTerminated" 60 | HookProvider_OnMessagePublish_FullMethodName = "/emqx.exhook.v3.HookProvider/OnMessagePublish" 61 | HookProvider_OnMessageDelivered_FullMethodName = "/emqx.exhook.v3.HookProvider/OnMessageDelivered" 62 | HookProvider_OnMessageDropped_FullMethodName = "/emqx.exhook.v3.HookProvider/OnMessageDropped" 63 | HookProvider_OnMessageAcked_FullMethodName = "/emqx.exhook.v3.HookProvider/OnMessageAcked" 64 | ) 65 | 66 | // HookProviderClient is the client API for HookProvider service. 67 | // 68 | // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. 69 | type HookProviderClient interface { 70 | OnProviderLoaded(ctx context.Context, in *ProviderLoadedRequest, opts ...grpc.CallOption) (*LoadedResponse, error) 71 | OnProviderUnloaded(ctx context.Context, in *ProviderUnloadedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 72 | OnClientConnect(ctx context.Context, in *ClientConnectRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 73 | OnClientConnack(ctx context.Context, in *ClientConnackRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 74 | OnClientConnected(ctx context.Context, in *ClientConnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 75 | OnClientDisconnected(ctx context.Context, in *ClientDisconnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 76 | OnClientAuthenticate(ctx context.Context, in *ClientAuthenticateRequest, opts ...grpc.CallOption) (*ValuedResponse, error) 77 | OnClientAuthorize(ctx context.Context, in *ClientAuthorizeRequest, opts ...grpc.CallOption) (*ValuedResponse, error) 78 | OnClientSubscribe(ctx context.Context, in *ClientSubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 79 | OnClientUnsubscribe(ctx context.Context, in *ClientUnsubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 80 | OnSessionCreated(ctx context.Context, in *SessionCreatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 81 | OnSessionSubscribed(ctx context.Context, in *SessionSubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 82 | OnSessionUnsubscribed(ctx context.Context, in *SessionUnsubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 83 | OnSessionResumed(ctx context.Context, in *SessionResumedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 84 | OnSessionDiscarded(ctx context.Context, in *SessionDiscardedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 85 | OnSessionTakenover(ctx context.Context, in *SessionTakenoverRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 86 | OnSessionTerminated(ctx context.Context, in *SessionTerminatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 87 | OnMessagePublish(ctx context.Context, in *MessagePublishRequest, opts ...grpc.CallOption) (*ValuedResponse, error) 88 | OnMessageDelivered(ctx context.Context, in *MessageDeliveredRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 89 | OnMessageDropped(ctx context.Context, in *MessageDroppedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 90 | OnMessageAcked(ctx context.Context, in *MessageAckedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) 91 | } 92 | 93 | type hookProviderClient struct { 94 | cc grpc.ClientConnInterface 95 | } 96 | 97 | func NewHookProviderClient(cc grpc.ClientConnInterface) HookProviderClient { 98 | return &hookProviderClient{cc} 99 | } 100 | 101 | func (c *hookProviderClient) OnProviderLoaded(ctx context.Context, in *ProviderLoadedRequest, opts ...grpc.CallOption) (*LoadedResponse, error) { 102 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 103 | out := new(LoadedResponse) 104 | err := c.cc.Invoke(ctx, HookProvider_OnProviderLoaded_FullMethodName, in, out, cOpts...) 105 | if err != nil { 106 | return nil, err 107 | } 108 | return out, nil 109 | } 110 | 111 | func (c *hookProviderClient) OnProviderUnloaded(ctx context.Context, in *ProviderUnloadedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 112 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 113 | out := new(EmptySuccess) 114 | err := c.cc.Invoke(ctx, HookProvider_OnProviderUnloaded_FullMethodName, in, out, cOpts...) 115 | if err != nil { 116 | return nil, err 117 | } 118 | return out, nil 119 | } 120 | 121 | func (c *hookProviderClient) OnClientConnect(ctx context.Context, in *ClientConnectRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 122 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 123 | out := new(EmptySuccess) 124 | err := c.cc.Invoke(ctx, HookProvider_OnClientConnect_FullMethodName, in, out, cOpts...) 125 | if err != nil { 126 | return nil, err 127 | } 128 | return out, nil 129 | } 130 | 131 | func (c *hookProviderClient) OnClientConnack(ctx context.Context, in *ClientConnackRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 132 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 133 | out := new(EmptySuccess) 134 | err := c.cc.Invoke(ctx, HookProvider_OnClientConnack_FullMethodName, in, out, cOpts...) 135 | if err != nil { 136 | return nil, err 137 | } 138 | return out, nil 139 | } 140 | 141 | func (c *hookProviderClient) OnClientConnected(ctx context.Context, in *ClientConnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 142 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 143 | out := new(EmptySuccess) 144 | err := c.cc.Invoke(ctx, HookProvider_OnClientConnected_FullMethodName, in, out, cOpts...) 145 | if err != nil { 146 | return nil, err 147 | } 148 | return out, nil 149 | } 150 | 151 | func (c *hookProviderClient) OnClientDisconnected(ctx context.Context, in *ClientDisconnectedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 152 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 153 | out := new(EmptySuccess) 154 | err := c.cc.Invoke(ctx, HookProvider_OnClientDisconnected_FullMethodName, in, out, cOpts...) 155 | if err != nil { 156 | return nil, err 157 | } 158 | return out, nil 159 | } 160 | 161 | func (c *hookProviderClient) OnClientAuthenticate(ctx context.Context, in *ClientAuthenticateRequest, opts ...grpc.CallOption) (*ValuedResponse, error) { 162 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 163 | out := new(ValuedResponse) 164 | err := c.cc.Invoke(ctx, HookProvider_OnClientAuthenticate_FullMethodName, in, out, cOpts...) 165 | if err != nil { 166 | return nil, err 167 | } 168 | return out, nil 169 | } 170 | 171 | func (c *hookProviderClient) OnClientAuthorize(ctx context.Context, in *ClientAuthorizeRequest, opts ...grpc.CallOption) (*ValuedResponse, error) { 172 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 173 | out := new(ValuedResponse) 174 | err := c.cc.Invoke(ctx, HookProvider_OnClientAuthorize_FullMethodName, in, out, cOpts...) 175 | if err != nil { 176 | return nil, err 177 | } 178 | return out, nil 179 | } 180 | 181 | func (c *hookProviderClient) OnClientSubscribe(ctx context.Context, in *ClientSubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 182 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 183 | out := new(EmptySuccess) 184 | err := c.cc.Invoke(ctx, HookProvider_OnClientSubscribe_FullMethodName, in, out, cOpts...) 185 | if err != nil { 186 | return nil, err 187 | } 188 | return out, nil 189 | } 190 | 191 | func (c *hookProviderClient) OnClientUnsubscribe(ctx context.Context, in *ClientUnsubscribeRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 192 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 193 | out := new(EmptySuccess) 194 | err := c.cc.Invoke(ctx, HookProvider_OnClientUnsubscribe_FullMethodName, in, out, cOpts...) 195 | if err != nil { 196 | return nil, err 197 | } 198 | return out, nil 199 | } 200 | 201 | func (c *hookProviderClient) OnSessionCreated(ctx context.Context, in *SessionCreatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 202 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 203 | out := new(EmptySuccess) 204 | err := c.cc.Invoke(ctx, HookProvider_OnSessionCreated_FullMethodName, in, out, cOpts...) 205 | if err != nil { 206 | return nil, err 207 | } 208 | return out, nil 209 | } 210 | 211 | func (c *hookProviderClient) OnSessionSubscribed(ctx context.Context, in *SessionSubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 212 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 213 | out := new(EmptySuccess) 214 | err := c.cc.Invoke(ctx, HookProvider_OnSessionSubscribed_FullMethodName, in, out, cOpts...) 215 | if err != nil { 216 | return nil, err 217 | } 218 | return out, nil 219 | } 220 | 221 | func (c *hookProviderClient) OnSessionUnsubscribed(ctx context.Context, in *SessionUnsubscribedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 222 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 223 | out := new(EmptySuccess) 224 | err := c.cc.Invoke(ctx, HookProvider_OnSessionUnsubscribed_FullMethodName, in, out, cOpts...) 225 | if err != nil { 226 | return nil, err 227 | } 228 | return out, nil 229 | } 230 | 231 | func (c *hookProviderClient) OnSessionResumed(ctx context.Context, in *SessionResumedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 232 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 233 | out := new(EmptySuccess) 234 | err := c.cc.Invoke(ctx, HookProvider_OnSessionResumed_FullMethodName, in, out, cOpts...) 235 | if err != nil { 236 | return nil, err 237 | } 238 | return out, nil 239 | } 240 | 241 | func (c *hookProviderClient) OnSessionDiscarded(ctx context.Context, in *SessionDiscardedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 242 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 243 | out := new(EmptySuccess) 244 | err := c.cc.Invoke(ctx, HookProvider_OnSessionDiscarded_FullMethodName, in, out, cOpts...) 245 | if err != nil { 246 | return nil, err 247 | } 248 | return out, nil 249 | } 250 | 251 | func (c *hookProviderClient) OnSessionTakenover(ctx context.Context, in *SessionTakenoverRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 252 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 253 | out := new(EmptySuccess) 254 | err := c.cc.Invoke(ctx, HookProvider_OnSessionTakenover_FullMethodName, in, out, cOpts...) 255 | if err != nil { 256 | return nil, err 257 | } 258 | return out, nil 259 | } 260 | 261 | func (c *hookProviderClient) OnSessionTerminated(ctx context.Context, in *SessionTerminatedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 262 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 263 | out := new(EmptySuccess) 264 | err := c.cc.Invoke(ctx, HookProvider_OnSessionTerminated_FullMethodName, in, out, cOpts...) 265 | if err != nil { 266 | return nil, err 267 | } 268 | return out, nil 269 | } 270 | 271 | func (c *hookProviderClient) OnMessagePublish(ctx context.Context, in *MessagePublishRequest, opts ...grpc.CallOption) (*ValuedResponse, error) { 272 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 273 | out := new(ValuedResponse) 274 | err := c.cc.Invoke(ctx, HookProvider_OnMessagePublish_FullMethodName, in, out, cOpts...) 275 | if err != nil { 276 | return nil, err 277 | } 278 | return out, nil 279 | } 280 | 281 | func (c *hookProviderClient) OnMessageDelivered(ctx context.Context, in *MessageDeliveredRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 282 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 283 | out := new(EmptySuccess) 284 | err := c.cc.Invoke(ctx, HookProvider_OnMessageDelivered_FullMethodName, in, out, cOpts...) 285 | if err != nil { 286 | return nil, err 287 | } 288 | return out, nil 289 | } 290 | 291 | func (c *hookProviderClient) OnMessageDropped(ctx context.Context, in *MessageDroppedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 292 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 293 | out := new(EmptySuccess) 294 | err := c.cc.Invoke(ctx, HookProvider_OnMessageDropped_FullMethodName, in, out, cOpts...) 295 | if err != nil { 296 | return nil, err 297 | } 298 | return out, nil 299 | } 300 | 301 | func (c *hookProviderClient) OnMessageAcked(ctx context.Context, in *MessageAckedRequest, opts ...grpc.CallOption) (*EmptySuccess, error) { 302 | cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) 303 | out := new(EmptySuccess) 304 | err := c.cc.Invoke(ctx, HookProvider_OnMessageAcked_FullMethodName, in, out, cOpts...) 305 | if err != nil { 306 | return nil, err 307 | } 308 | return out, nil 309 | } 310 | 311 | // HookProviderServer is the server API for HookProvider service. 312 | // All implementations must embed UnimplementedHookProviderServer 313 | // for forward compatibility. 314 | type HookProviderServer interface { 315 | OnProviderLoaded(context.Context, *ProviderLoadedRequest) (*LoadedResponse, error) 316 | OnProviderUnloaded(context.Context, *ProviderUnloadedRequest) (*EmptySuccess, error) 317 | OnClientConnect(context.Context, *ClientConnectRequest) (*EmptySuccess, error) 318 | OnClientConnack(context.Context, *ClientConnackRequest) (*EmptySuccess, error) 319 | OnClientConnected(context.Context, *ClientConnectedRequest) (*EmptySuccess, error) 320 | OnClientDisconnected(context.Context, *ClientDisconnectedRequest) (*EmptySuccess, error) 321 | OnClientAuthenticate(context.Context, *ClientAuthenticateRequest) (*ValuedResponse, error) 322 | OnClientAuthorize(context.Context, *ClientAuthorizeRequest) (*ValuedResponse, error) 323 | OnClientSubscribe(context.Context, *ClientSubscribeRequest) (*EmptySuccess, error) 324 | OnClientUnsubscribe(context.Context, *ClientUnsubscribeRequest) (*EmptySuccess, error) 325 | OnSessionCreated(context.Context, *SessionCreatedRequest) (*EmptySuccess, error) 326 | OnSessionSubscribed(context.Context, *SessionSubscribedRequest) (*EmptySuccess, error) 327 | OnSessionUnsubscribed(context.Context, *SessionUnsubscribedRequest) (*EmptySuccess, error) 328 | OnSessionResumed(context.Context, *SessionResumedRequest) (*EmptySuccess, error) 329 | OnSessionDiscarded(context.Context, *SessionDiscardedRequest) (*EmptySuccess, error) 330 | OnSessionTakenover(context.Context, *SessionTakenoverRequest) (*EmptySuccess, error) 331 | OnSessionTerminated(context.Context, *SessionTerminatedRequest) (*EmptySuccess, error) 332 | OnMessagePublish(context.Context, *MessagePublishRequest) (*ValuedResponse, error) 333 | OnMessageDelivered(context.Context, *MessageDeliveredRequest) (*EmptySuccess, error) 334 | OnMessageDropped(context.Context, *MessageDroppedRequest) (*EmptySuccess, error) 335 | OnMessageAcked(context.Context, *MessageAckedRequest) (*EmptySuccess, error) 336 | mustEmbedUnimplementedHookProviderServer() 337 | } 338 | 339 | // UnimplementedHookProviderServer must be embedded to have 340 | // forward compatible implementations. 341 | // 342 | // NOTE: this should be embedded by value instead of pointer to avoid a nil 343 | // pointer dereference when methods are called. 344 | type UnimplementedHookProviderServer struct{} 345 | 346 | func (UnimplementedHookProviderServer) OnProviderLoaded(context.Context, *ProviderLoadedRequest) (*LoadedResponse, error) { 347 | return nil, status.Errorf(codes.Unimplemented, "method OnProviderLoaded not implemented") 348 | } 349 | func (UnimplementedHookProviderServer) OnProviderUnloaded(context.Context, *ProviderUnloadedRequest) (*EmptySuccess, error) { 350 | return nil, status.Errorf(codes.Unimplemented, "method OnProviderUnloaded not implemented") 351 | } 352 | func (UnimplementedHookProviderServer) OnClientConnect(context.Context, *ClientConnectRequest) (*EmptySuccess, error) { 353 | return nil, status.Errorf(codes.Unimplemented, "method OnClientConnect not implemented") 354 | } 355 | func (UnimplementedHookProviderServer) OnClientConnack(context.Context, *ClientConnackRequest) (*EmptySuccess, error) { 356 | return nil, status.Errorf(codes.Unimplemented, "method OnClientConnack not implemented") 357 | } 358 | func (UnimplementedHookProviderServer) OnClientConnected(context.Context, *ClientConnectedRequest) (*EmptySuccess, error) { 359 | return nil, status.Errorf(codes.Unimplemented, "method OnClientConnected not implemented") 360 | } 361 | func (UnimplementedHookProviderServer) OnClientDisconnected(context.Context, *ClientDisconnectedRequest) (*EmptySuccess, error) { 362 | return nil, status.Errorf(codes.Unimplemented, "method OnClientDisconnected not implemented") 363 | } 364 | func (UnimplementedHookProviderServer) OnClientAuthenticate(context.Context, *ClientAuthenticateRequest) (*ValuedResponse, error) { 365 | return nil, status.Errorf(codes.Unimplemented, "method OnClientAuthenticate not implemented") 366 | } 367 | func (UnimplementedHookProviderServer) OnClientAuthorize(context.Context, *ClientAuthorizeRequest) (*ValuedResponse, error) { 368 | return nil, status.Errorf(codes.Unimplemented, "method OnClientAuthorize not implemented") 369 | } 370 | func (UnimplementedHookProviderServer) OnClientSubscribe(context.Context, *ClientSubscribeRequest) (*EmptySuccess, error) { 371 | return nil, status.Errorf(codes.Unimplemented, "method OnClientSubscribe not implemented") 372 | } 373 | func (UnimplementedHookProviderServer) OnClientUnsubscribe(context.Context, *ClientUnsubscribeRequest) (*EmptySuccess, error) { 374 | return nil, status.Errorf(codes.Unimplemented, "method OnClientUnsubscribe not implemented") 375 | } 376 | func (UnimplementedHookProviderServer) OnSessionCreated(context.Context, *SessionCreatedRequest) (*EmptySuccess, error) { 377 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionCreated not implemented") 378 | } 379 | func (UnimplementedHookProviderServer) OnSessionSubscribed(context.Context, *SessionSubscribedRequest) (*EmptySuccess, error) { 380 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionSubscribed not implemented") 381 | } 382 | func (UnimplementedHookProviderServer) OnSessionUnsubscribed(context.Context, *SessionUnsubscribedRequest) (*EmptySuccess, error) { 383 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionUnsubscribed not implemented") 384 | } 385 | func (UnimplementedHookProviderServer) OnSessionResumed(context.Context, *SessionResumedRequest) (*EmptySuccess, error) { 386 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionResumed not implemented") 387 | } 388 | func (UnimplementedHookProviderServer) OnSessionDiscarded(context.Context, *SessionDiscardedRequest) (*EmptySuccess, error) { 389 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionDiscarded not implemented") 390 | } 391 | func (UnimplementedHookProviderServer) OnSessionTakenover(context.Context, *SessionTakenoverRequest) (*EmptySuccess, error) { 392 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionTakenover not implemented") 393 | } 394 | func (UnimplementedHookProviderServer) OnSessionTerminated(context.Context, *SessionTerminatedRequest) (*EmptySuccess, error) { 395 | return nil, status.Errorf(codes.Unimplemented, "method OnSessionTerminated not implemented") 396 | } 397 | func (UnimplementedHookProviderServer) OnMessagePublish(context.Context, *MessagePublishRequest) (*ValuedResponse, error) { 398 | return nil, status.Errorf(codes.Unimplemented, "method OnMessagePublish not implemented") 399 | } 400 | func (UnimplementedHookProviderServer) OnMessageDelivered(context.Context, *MessageDeliveredRequest) (*EmptySuccess, error) { 401 | return nil, status.Errorf(codes.Unimplemented, "method OnMessageDelivered not implemented") 402 | } 403 | func (UnimplementedHookProviderServer) OnMessageDropped(context.Context, *MessageDroppedRequest) (*EmptySuccess, error) { 404 | return nil, status.Errorf(codes.Unimplemented, "method OnMessageDropped not implemented") 405 | } 406 | func (UnimplementedHookProviderServer) OnMessageAcked(context.Context, *MessageAckedRequest) (*EmptySuccess, error) { 407 | return nil, status.Errorf(codes.Unimplemented, "method OnMessageAcked not implemented") 408 | } 409 | func (UnimplementedHookProviderServer) mustEmbedUnimplementedHookProviderServer() {} 410 | func (UnimplementedHookProviderServer) testEmbeddedByValue() {} 411 | 412 | // UnsafeHookProviderServer may be embedded to opt out of forward compatibility for this service. 413 | // Use of this interface is not recommended, as added methods to HookProviderServer will 414 | // result in compilation errors. 415 | type UnsafeHookProviderServer interface { 416 | mustEmbedUnimplementedHookProviderServer() 417 | } 418 | 419 | func RegisterHookProviderServer(s grpc.ServiceRegistrar, srv HookProviderServer) { 420 | // If the following call pancis, it indicates UnimplementedHookProviderServer was 421 | // embedded by pointer and is nil. This will cause panics if an 422 | // unimplemented method is ever invoked, so we test this at initialization 423 | // time to prevent it from happening at runtime later due to I/O. 424 | if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { 425 | t.testEmbeddedByValue() 426 | } 427 | s.RegisterService(&HookProvider_ServiceDesc, srv) 428 | } 429 | 430 | func _HookProvider_OnProviderLoaded_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 431 | in := new(ProviderLoadedRequest) 432 | if err := dec(in); err != nil { 433 | return nil, err 434 | } 435 | if interceptor == nil { 436 | return srv.(HookProviderServer).OnProviderLoaded(ctx, in) 437 | } 438 | info := &grpc.UnaryServerInfo{ 439 | Server: srv, 440 | FullMethod: HookProvider_OnProviderLoaded_FullMethodName, 441 | } 442 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 443 | return srv.(HookProviderServer).OnProviderLoaded(ctx, req.(*ProviderLoadedRequest)) 444 | } 445 | return interceptor(ctx, in, info, handler) 446 | } 447 | 448 | func _HookProvider_OnProviderUnloaded_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 449 | in := new(ProviderUnloadedRequest) 450 | if err := dec(in); err != nil { 451 | return nil, err 452 | } 453 | if interceptor == nil { 454 | return srv.(HookProviderServer).OnProviderUnloaded(ctx, in) 455 | } 456 | info := &grpc.UnaryServerInfo{ 457 | Server: srv, 458 | FullMethod: HookProvider_OnProviderUnloaded_FullMethodName, 459 | } 460 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 461 | return srv.(HookProviderServer).OnProviderUnloaded(ctx, req.(*ProviderUnloadedRequest)) 462 | } 463 | return interceptor(ctx, in, info, handler) 464 | } 465 | 466 | func _HookProvider_OnClientConnect_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 467 | in := new(ClientConnectRequest) 468 | if err := dec(in); err != nil { 469 | return nil, err 470 | } 471 | if interceptor == nil { 472 | return srv.(HookProviderServer).OnClientConnect(ctx, in) 473 | } 474 | info := &grpc.UnaryServerInfo{ 475 | Server: srv, 476 | FullMethod: HookProvider_OnClientConnect_FullMethodName, 477 | } 478 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 479 | return srv.(HookProviderServer).OnClientConnect(ctx, req.(*ClientConnectRequest)) 480 | } 481 | return interceptor(ctx, in, info, handler) 482 | } 483 | 484 | func _HookProvider_OnClientConnack_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 485 | in := new(ClientConnackRequest) 486 | if err := dec(in); err != nil { 487 | return nil, err 488 | } 489 | if interceptor == nil { 490 | return srv.(HookProviderServer).OnClientConnack(ctx, in) 491 | } 492 | info := &grpc.UnaryServerInfo{ 493 | Server: srv, 494 | FullMethod: HookProvider_OnClientConnack_FullMethodName, 495 | } 496 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 497 | return srv.(HookProviderServer).OnClientConnack(ctx, req.(*ClientConnackRequest)) 498 | } 499 | return interceptor(ctx, in, info, handler) 500 | } 501 | 502 | func _HookProvider_OnClientConnected_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 503 | in := new(ClientConnectedRequest) 504 | if err := dec(in); err != nil { 505 | return nil, err 506 | } 507 | if interceptor == nil { 508 | return srv.(HookProviderServer).OnClientConnected(ctx, in) 509 | } 510 | info := &grpc.UnaryServerInfo{ 511 | Server: srv, 512 | FullMethod: HookProvider_OnClientConnected_FullMethodName, 513 | } 514 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 515 | return srv.(HookProviderServer).OnClientConnected(ctx, req.(*ClientConnectedRequest)) 516 | } 517 | return interceptor(ctx, in, info, handler) 518 | } 519 | 520 | func _HookProvider_OnClientDisconnected_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 521 | in := new(ClientDisconnectedRequest) 522 | if err := dec(in); err != nil { 523 | return nil, err 524 | } 525 | if interceptor == nil { 526 | return srv.(HookProviderServer).OnClientDisconnected(ctx, in) 527 | } 528 | info := &grpc.UnaryServerInfo{ 529 | Server: srv, 530 | FullMethod: HookProvider_OnClientDisconnected_FullMethodName, 531 | } 532 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 533 | return srv.(HookProviderServer).OnClientDisconnected(ctx, req.(*ClientDisconnectedRequest)) 534 | } 535 | return interceptor(ctx, in, info, handler) 536 | } 537 | 538 | func _HookProvider_OnClientAuthenticate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 539 | in := new(ClientAuthenticateRequest) 540 | if err := dec(in); err != nil { 541 | return nil, err 542 | } 543 | if interceptor == nil { 544 | return srv.(HookProviderServer).OnClientAuthenticate(ctx, in) 545 | } 546 | info := &grpc.UnaryServerInfo{ 547 | Server: srv, 548 | FullMethod: HookProvider_OnClientAuthenticate_FullMethodName, 549 | } 550 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 551 | return srv.(HookProviderServer).OnClientAuthenticate(ctx, req.(*ClientAuthenticateRequest)) 552 | } 553 | return interceptor(ctx, in, info, handler) 554 | } 555 | 556 | func _HookProvider_OnClientAuthorize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 557 | in := new(ClientAuthorizeRequest) 558 | if err := dec(in); err != nil { 559 | return nil, err 560 | } 561 | if interceptor == nil { 562 | return srv.(HookProviderServer).OnClientAuthorize(ctx, in) 563 | } 564 | info := &grpc.UnaryServerInfo{ 565 | Server: srv, 566 | FullMethod: HookProvider_OnClientAuthorize_FullMethodName, 567 | } 568 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 569 | return srv.(HookProviderServer).OnClientAuthorize(ctx, req.(*ClientAuthorizeRequest)) 570 | } 571 | return interceptor(ctx, in, info, handler) 572 | } 573 | 574 | func _HookProvider_OnClientSubscribe_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 575 | in := new(ClientSubscribeRequest) 576 | if err := dec(in); err != nil { 577 | return nil, err 578 | } 579 | if interceptor == nil { 580 | return srv.(HookProviderServer).OnClientSubscribe(ctx, in) 581 | } 582 | info := &grpc.UnaryServerInfo{ 583 | Server: srv, 584 | FullMethod: HookProvider_OnClientSubscribe_FullMethodName, 585 | } 586 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 587 | return srv.(HookProviderServer).OnClientSubscribe(ctx, req.(*ClientSubscribeRequest)) 588 | } 589 | return interceptor(ctx, in, info, handler) 590 | } 591 | 592 | func _HookProvider_OnClientUnsubscribe_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 593 | in := new(ClientUnsubscribeRequest) 594 | if err := dec(in); err != nil { 595 | return nil, err 596 | } 597 | if interceptor == nil { 598 | return srv.(HookProviderServer).OnClientUnsubscribe(ctx, in) 599 | } 600 | info := &grpc.UnaryServerInfo{ 601 | Server: srv, 602 | FullMethod: HookProvider_OnClientUnsubscribe_FullMethodName, 603 | } 604 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 605 | return srv.(HookProviderServer).OnClientUnsubscribe(ctx, req.(*ClientUnsubscribeRequest)) 606 | } 607 | return interceptor(ctx, in, info, handler) 608 | } 609 | 610 | func _HookProvider_OnSessionCreated_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 611 | in := new(SessionCreatedRequest) 612 | if err := dec(in); err != nil { 613 | return nil, err 614 | } 615 | if interceptor == nil { 616 | return srv.(HookProviderServer).OnSessionCreated(ctx, in) 617 | } 618 | info := &grpc.UnaryServerInfo{ 619 | Server: srv, 620 | FullMethod: HookProvider_OnSessionCreated_FullMethodName, 621 | } 622 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 623 | return srv.(HookProviderServer).OnSessionCreated(ctx, req.(*SessionCreatedRequest)) 624 | } 625 | return interceptor(ctx, in, info, handler) 626 | } 627 | 628 | func _HookProvider_OnSessionSubscribed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 629 | in := new(SessionSubscribedRequest) 630 | if err := dec(in); err != nil { 631 | return nil, err 632 | } 633 | if interceptor == nil { 634 | return srv.(HookProviderServer).OnSessionSubscribed(ctx, in) 635 | } 636 | info := &grpc.UnaryServerInfo{ 637 | Server: srv, 638 | FullMethod: HookProvider_OnSessionSubscribed_FullMethodName, 639 | } 640 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 641 | return srv.(HookProviderServer).OnSessionSubscribed(ctx, req.(*SessionSubscribedRequest)) 642 | } 643 | return interceptor(ctx, in, info, handler) 644 | } 645 | 646 | func _HookProvider_OnSessionUnsubscribed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 647 | in := new(SessionUnsubscribedRequest) 648 | if err := dec(in); err != nil { 649 | return nil, err 650 | } 651 | if interceptor == nil { 652 | return srv.(HookProviderServer).OnSessionUnsubscribed(ctx, in) 653 | } 654 | info := &grpc.UnaryServerInfo{ 655 | Server: srv, 656 | FullMethod: HookProvider_OnSessionUnsubscribed_FullMethodName, 657 | } 658 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 659 | return srv.(HookProviderServer).OnSessionUnsubscribed(ctx, req.(*SessionUnsubscribedRequest)) 660 | } 661 | return interceptor(ctx, in, info, handler) 662 | } 663 | 664 | func _HookProvider_OnSessionResumed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 665 | in := new(SessionResumedRequest) 666 | if err := dec(in); err != nil { 667 | return nil, err 668 | } 669 | if interceptor == nil { 670 | return srv.(HookProviderServer).OnSessionResumed(ctx, in) 671 | } 672 | info := &grpc.UnaryServerInfo{ 673 | Server: srv, 674 | FullMethod: HookProvider_OnSessionResumed_FullMethodName, 675 | } 676 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 677 | return srv.(HookProviderServer).OnSessionResumed(ctx, req.(*SessionResumedRequest)) 678 | } 679 | return interceptor(ctx, in, info, handler) 680 | } 681 | 682 | func _HookProvider_OnSessionDiscarded_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 683 | in := new(SessionDiscardedRequest) 684 | if err := dec(in); err != nil { 685 | return nil, err 686 | } 687 | if interceptor == nil { 688 | return srv.(HookProviderServer).OnSessionDiscarded(ctx, in) 689 | } 690 | info := &grpc.UnaryServerInfo{ 691 | Server: srv, 692 | FullMethod: HookProvider_OnSessionDiscarded_FullMethodName, 693 | } 694 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 695 | return srv.(HookProviderServer).OnSessionDiscarded(ctx, req.(*SessionDiscardedRequest)) 696 | } 697 | return interceptor(ctx, in, info, handler) 698 | } 699 | 700 | func _HookProvider_OnSessionTakenover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 701 | in := new(SessionTakenoverRequest) 702 | if err := dec(in); err != nil { 703 | return nil, err 704 | } 705 | if interceptor == nil { 706 | return srv.(HookProviderServer).OnSessionTakenover(ctx, in) 707 | } 708 | info := &grpc.UnaryServerInfo{ 709 | Server: srv, 710 | FullMethod: HookProvider_OnSessionTakenover_FullMethodName, 711 | } 712 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 713 | return srv.(HookProviderServer).OnSessionTakenover(ctx, req.(*SessionTakenoverRequest)) 714 | } 715 | return interceptor(ctx, in, info, handler) 716 | } 717 | 718 | func _HookProvider_OnSessionTerminated_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 719 | in := new(SessionTerminatedRequest) 720 | if err := dec(in); err != nil { 721 | return nil, err 722 | } 723 | if interceptor == nil { 724 | return srv.(HookProviderServer).OnSessionTerminated(ctx, in) 725 | } 726 | info := &grpc.UnaryServerInfo{ 727 | Server: srv, 728 | FullMethod: HookProvider_OnSessionTerminated_FullMethodName, 729 | } 730 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 731 | return srv.(HookProviderServer).OnSessionTerminated(ctx, req.(*SessionTerminatedRequest)) 732 | } 733 | return interceptor(ctx, in, info, handler) 734 | } 735 | 736 | func _HookProvider_OnMessagePublish_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 737 | in := new(MessagePublishRequest) 738 | if err := dec(in); err != nil { 739 | return nil, err 740 | } 741 | if interceptor == nil { 742 | return srv.(HookProviderServer).OnMessagePublish(ctx, in) 743 | } 744 | info := &grpc.UnaryServerInfo{ 745 | Server: srv, 746 | FullMethod: HookProvider_OnMessagePublish_FullMethodName, 747 | } 748 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 749 | return srv.(HookProviderServer).OnMessagePublish(ctx, req.(*MessagePublishRequest)) 750 | } 751 | return interceptor(ctx, in, info, handler) 752 | } 753 | 754 | func _HookProvider_OnMessageDelivered_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 755 | in := new(MessageDeliveredRequest) 756 | if err := dec(in); err != nil { 757 | return nil, err 758 | } 759 | if interceptor == nil { 760 | return srv.(HookProviderServer).OnMessageDelivered(ctx, in) 761 | } 762 | info := &grpc.UnaryServerInfo{ 763 | Server: srv, 764 | FullMethod: HookProvider_OnMessageDelivered_FullMethodName, 765 | } 766 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 767 | return srv.(HookProviderServer).OnMessageDelivered(ctx, req.(*MessageDeliveredRequest)) 768 | } 769 | return interceptor(ctx, in, info, handler) 770 | } 771 | 772 | func _HookProvider_OnMessageDropped_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 773 | in := new(MessageDroppedRequest) 774 | if err := dec(in); err != nil { 775 | return nil, err 776 | } 777 | if interceptor == nil { 778 | return srv.(HookProviderServer).OnMessageDropped(ctx, in) 779 | } 780 | info := &grpc.UnaryServerInfo{ 781 | Server: srv, 782 | FullMethod: HookProvider_OnMessageDropped_FullMethodName, 783 | } 784 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 785 | return srv.(HookProviderServer).OnMessageDropped(ctx, req.(*MessageDroppedRequest)) 786 | } 787 | return interceptor(ctx, in, info, handler) 788 | } 789 | 790 | func _HookProvider_OnMessageAcked_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 791 | in := new(MessageAckedRequest) 792 | if err := dec(in); err != nil { 793 | return nil, err 794 | } 795 | if interceptor == nil { 796 | return srv.(HookProviderServer).OnMessageAcked(ctx, in) 797 | } 798 | info := &grpc.UnaryServerInfo{ 799 | Server: srv, 800 | FullMethod: HookProvider_OnMessageAcked_FullMethodName, 801 | } 802 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 803 | return srv.(HookProviderServer).OnMessageAcked(ctx, req.(*MessageAckedRequest)) 804 | } 805 | return interceptor(ctx, in, info, handler) 806 | } 807 | 808 | // HookProvider_ServiceDesc is the grpc.ServiceDesc for HookProvider service. 809 | // It's only intended for direct use with grpc.RegisterService, 810 | // and not to be introspected or modified (even as a copy) 811 | var HookProvider_ServiceDesc = grpc.ServiceDesc{ 812 | ServiceName: "emqx.exhook.v3.HookProvider", 813 | HandlerType: (*HookProviderServer)(nil), 814 | Methods: []grpc.MethodDesc{ 815 | { 816 | MethodName: "OnProviderLoaded", 817 | Handler: _HookProvider_OnProviderLoaded_Handler, 818 | }, 819 | { 820 | MethodName: "OnProviderUnloaded", 821 | Handler: _HookProvider_OnProviderUnloaded_Handler, 822 | }, 823 | { 824 | MethodName: "OnClientConnect", 825 | Handler: _HookProvider_OnClientConnect_Handler, 826 | }, 827 | { 828 | MethodName: "OnClientConnack", 829 | Handler: _HookProvider_OnClientConnack_Handler, 830 | }, 831 | { 832 | MethodName: "OnClientConnected", 833 | Handler: _HookProvider_OnClientConnected_Handler, 834 | }, 835 | { 836 | MethodName: "OnClientDisconnected", 837 | Handler: _HookProvider_OnClientDisconnected_Handler, 838 | }, 839 | { 840 | MethodName: "OnClientAuthenticate", 841 | Handler: _HookProvider_OnClientAuthenticate_Handler, 842 | }, 843 | { 844 | MethodName: "OnClientAuthorize", 845 | Handler: _HookProvider_OnClientAuthorize_Handler, 846 | }, 847 | { 848 | MethodName: "OnClientSubscribe", 849 | Handler: _HookProvider_OnClientSubscribe_Handler, 850 | }, 851 | { 852 | MethodName: "OnClientUnsubscribe", 853 | Handler: _HookProvider_OnClientUnsubscribe_Handler, 854 | }, 855 | { 856 | MethodName: "OnSessionCreated", 857 | Handler: _HookProvider_OnSessionCreated_Handler, 858 | }, 859 | { 860 | MethodName: "OnSessionSubscribed", 861 | Handler: _HookProvider_OnSessionSubscribed_Handler, 862 | }, 863 | { 864 | MethodName: "OnSessionUnsubscribed", 865 | Handler: _HookProvider_OnSessionUnsubscribed_Handler, 866 | }, 867 | { 868 | MethodName: "OnSessionResumed", 869 | Handler: _HookProvider_OnSessionResumed_Handler, 870 | }, 871 | { 872 | MethodName: "OnSessionDiscarded", 873 | Handler: _HookProvider_OnSessionDiscarded_Handler, 874 | }, 875 | { 876 | MethodName: "OnSessionTakenover", 877 | Handler: _HookProvider_OnSessionTakenover_Handler, 878 | }, 879 | { 880 | MethodName: "OnSessionTerminated", 881 | Handler: _HookProvider_OnSessionTerminated_Handler, 882 | }, 883 | { 884 | MethodName: "OnMessagePublish", 885 | Handler: _HookProvider_OnMessagePublish_Handler, 886 | }, 887 | { 888 | MethodName: "OnMessageDelivered", 889 | Handler: _HookProvider_OnMessageDelivered_Handler, 890 | }, 891 | { 892 | MethodName: "OnMessageDropped", 893 | Handler: _HookProvider_OnMessageDropped_Handler, 894 | }, 895 | { 896 | MethodName: "OnMessageAcked", 897 | Handler: _HookProvider_OnMessageAcked_Handler, 898 | }, 899 | }, 900 | Streams: []grpc.StreamDesc{}, 901 | Metadata: "protobuf/exhook.proto", 902 | } 903 | --------------------------------------------------------------------------------