Code:
var subscriptions map[MessageType][]chan<- any
var mutSub sync.Mutex
func Subscribe(messageType MessageType, hitFunc func([]any) (any, bool)) (chan<- any, error) {
subCh := subscribe(messageType)
message, exists, err := FindMessage(messageType, hitFunc)
if err != nil {
errlog.Println(err)
return nil, errors.New("unsuccessful subscribe")
}
if exists {
subCh <- message
}
return subCh, nil
}
func subscribe(messageType MessageType) chan<- any {
subCh := make(chan<- any, 1)
defer mutSub.Unlock()
mutSub.Lock()
subscriptions[messageType] = append(subscriptions[messageType], subCh)
return subCh
}
func StoreAndNotify(messageType MessageType, message any) error {
err := StoreMessage(messageType, message)
if err != nil {
errlog.Println(err)
return err
}
defer mutSub.Unlock()
mutSub.Lock()
for _, ch := range subscriptions[messageType] {
ch <- message
}
return nil
}
var messages map[MessageType][]any
var mutMess sync.Mutex
func messageTypeExists(messageType MessageType) bool {
if messageType != SCLServerStarted {
return false
}
return true
}
func StoreMessage(messageType MessageType, message any) error {
if !messageTypeExists(messageType) {
return errors.New("unknown message type")
}
defer mutMess.Unlock()
mutMess.Lock()
messages[messageType] = append(messages[messageType], message)
return nil
}
func FindMessage(messageType MessageType, hitFunc func([]any) (any, bool)) (any, bool, error) {
if !messageTypeExists(messageType) {
return nil, false, errors.New("unknown message type")
}
defer mutMess.Unlock()
mutMess.Lock()
if len(messages[messageType]) == 0 {
return nil, false, nil
}
message, exist := hitFunc(messages[messageType])
return message, exist, nil
}