Compare commits
3 Commits
3a243546e9
...
v1.0.2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e99fd0710b | ||
![]() |
fee2381a45 | ||
![]() |
a92a4d9fde |
@@ -1,7 +1,14 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
type Data struct {
|
type Data struct {
|
||||||
Action string `json:"action,omitempty"`
|
Action string `json:"action,omitempty"`
|
||||||
Topic string `json:"topic"`
|
Topic string `json:"topic"`
|
||||||
Data any `json:"data"`
|
Data any `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*Data) ReadData(data []byte) (request Data, err error) {
|
||||||
|
err = json.Unmarshal(data, &request)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@@ -5,6 +5,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gitea.tecamino.com/paadi/pubSub/models"
|
"gitea.tecamino.com/paadi/pubSub/models"
|
||||||
|
"gitea.tecamino.com/paadi/pubSub/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Pubsub implements a simple topic-based publish/subscribe system
|
// Pubsub implements a simple topic-based publish/subscribe system
|
||||||
@@ -43,10 +44,14 @@ func (ps *Pubsub) worker() {
|
|||||||
defer ps.wg.Done()
|
defer ps.wg.Done()
|
||||||
for job := range ps.jobQueue {
|
for job := range ps.jobQueue {
|
||||||
ps.mu.RLock()
|
ps.mu.RLock()
|
||||||
subs := make([]func(any), 0, len(ps.subs[job.Topic]))
|
var subs []func(any)
|
||||||
for _, cb := range ps.subs[job.Topic] {
|
for pattern, callbacks := range ps.subs {
|
||||||
|
if utils.Matches(pattern, job.Topic) {
|
||||||
|
for _, cb := range callbacks {
|
||||||
subs = append(subs, cb)
|
subs = append(subs, cb)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
ps.mu.RUnlock()
|
ps.mu.RUnlock()
|
||||||
|
|
||||||
for _, cb := range subs {
|
for _, cb := range subs {
|
||||||
|
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