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  }