Compare commits
3 Commits
3a243546e9
...
main
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e99fd0710b | ||
![]() |
fee2381a45 | ||
![]() |
a92a4d9fde |
@@ -1,7 +1,14 @@
|
||||
package models
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
type Data struct {
|
||||
Action string `json:"action,omitempty"`
|
||||
Topic string `json:"topic"`
|
||||
Data any `json:"data"`
|
||||
}
|
||||
|
||||
func (*Data) ReadData(data []byte) (request Data, err error) {
|
||||
err = json.Unmarshal(data, &request)
|
||||
return
|
||||
}
|
||||
|
11
pubSub.go
11
pubSub.go
@@ -5,6 +5,7 @@ import (
|
||||
"sync"
|
||||
|
||||
"gitea.tecamino.com/paadi/pubSub/models"
|
||||
"gitea.tecamino.com/paadi/pubSub/utils"
|
||||
)
|
||||
|
||||
// Pubsub implements a simple topic-based publish/subscribe system
|
||||
@@ -43,9 +44,13 @@ func (ps *Pubsub) worker() {
|
||||
defer ps.wg.Done()
|
||||
for job := range ps.jobQueue {
|
||||
ps.mu.RLock()
|
||||
subs := make([]func(any), 0, len(ps.subs[job.Topic]))
|
||||
for _, cb := range ps.subs[job.Topic] {
|
||||
subs = append(subs, cb)
|
||||
var subs []func(any)
|
||||
for pattern, callbacks := range ps.subs {
|
||||
if utils.Matches(pattern, job.Topic) {
|
||||
for _, cb := range callbacks {
|
||||
subs = append(subs, cb)
|
||||
}
|
||||
}
|
||||
}
|
||||
ps.mu.RUnlock()
|
||||
|
||||
|
14
utils/utils.go
Normal file
14
utils/utils.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package utils
|
||||
|
||||
import "strings"
|
||||
|
||||
func Matches(pattern, topic string) bool {
|
||||
if pattern == "*" {
|
||||
return true
|
||||
}
|
||||
if strings.HasSuffix(pattern, "/*") {
|
||||
prefix := strings.TrimSuffix(pattern, "/*")
|
||||
return strings.HasPrefix(topic, prefix+"/")
|
||||
}
|
||||
return pattern == topic
|
||||
}
|
Reference in New Issue
Block a user