github.com/lei006/gmqtt-broker@v0.0.1/broker/lib/topics/topics.go (about) 1 package topics 2 3 import ( 4 "fmt" 5 6 "github.com/eclipse/paho.mqtt.golang/packets" 7 ) 8 9 const ( 10 // MWC is the multi-level wildcard 11 MWC = "#" 12 13 // SWC is the single level wildcard 14 SWC = "+" 15 16 // SEP is the topic level separator 17 SEP = "/" 18 19 // SYS is the starting character of the system level topics 20 SYS = "$" 21 22 // Both wildcards 23 _WC = "#+" 24 ) 25 26 var ( 27 providers = make(map[string]TopicsProvider) 28 ) 29 30 // TopicsProvider 31 type TopicsProvider interface { 32 Subscribe(topic []byte, qos byte, subscriber interface{}) (byte, error) 33 Unsubscribe(topic []byte, subscriber interface{}) error 34 Subscribers(topic []byte, qos byte, subs *[]interface{}, qoss *[]byte) error 35 Retain(msg *packets.PublishPacket) error 36 Retained(topic []byte, msgs *[]*packets.PublishPacket) error 37 Close() error 38 } 39 40 func Register(name string, provider TopicsProvider) { 41 if provider == nil { 42 panic("topics: Register provide is nil") 43 } 44 45 if _, dup := providers[name]; dup { 46 panic("topics: Register called twice for provider " + name) 47 } 48 49 providers[name] = provider 50 } 51 52 func Unregister(name string) { 53 delete(providers, name) 54 } 55 56 type Manager struct { 57 p TopicsProvider 58 } 59 60 func NewManager(providerName string) (*Manager, error) { 61 p, ok := providers[providerName] 62 if !ok { 63 return nil, fmt.Errorf("session: unknown provider %q", providerName) 64 } 65 66 return &Manager{p: p}, nil 67 } 68 69 func (this *Manager) Subscribe(topic []byte, qos byte, subscriber interface{}) (byte, error) { 70 return this.p.Subscribe(topic, qos, subscriber) 71 } 72 73 func (this *Manager) Unsubscribe(topic []byte, subscriber interface{}) error { 74 return this.p.Unsubscribe(topic, subscriber) 75 } 76 77 func (this *Manager) Subscribers(topic []byte, qos byte, subs *[]interface{}, qoss *[]byte) error { 78 return this.p.Subscribers(topic, qos, subs, qoss) 79 } 80 81 func (this *Manager) Retain(msg *packets.PublishPacket) error { 82 return this.p.Retain(msg) 83 } 84 85 func (this *Manager) Retained(topic []byte, msgs *[]*packets.PublishPacket) error { 86 return this.p.Retained(topic, msgs) 87 } 88 89 func (this *Manager) Close() error { 90 return this.p.Close() 91 }