| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- // package dict_sub_hook -- словарь потребителей топика по подписке
- package dict_sub_hook
- import (
- "fmt"
- "sync"
- "gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
- . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
- . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
- . "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
- )
- // dictSubHook -- словарь потребителей топика по подписке
- type dictSubHook struct {
- ctx IKernelCtx
- dict map[AHandlerName]bool // В качестве ключа -- URL веб-хука
- block sync.RWMutex
- }
- // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика
- func NewDictSubHook() IDictSubHook {
- sf := &dictSubHook{
- ctx: kctx.GetKernelCtx(),
- dict: map[AHandlerName]bool{},
- }
- return sf
- }
- // Unsubscribe -- удаляет из словаря подписки обработчик
- func (sf *dictSubHook) Unsubscribe(handler IBusHandlerSubscribe) {
- sf.block.Lock()
- defer sf.block.Unlock()
- Hassert(handler != nil, "dictSubHook.Unsubscribe(): handler==nil")
- handlerName := handler.Name()
- delete(sf.dict, handlerName)
- sf.ctx.Del(string(handlerName))
- }
- // Subscribe -- добавляет в словарь подписки новый обработчик
- func (sf *dictSubHook) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
- sf.block.Lock()
- defer sf.block.Unlock()
- if handler == nil {
- err := fmt.Errorf("dictSubHook.Subscribe(): handler==nil")
- return NewErr[bool](err)
- }
- handlerName := handler.Name()
- sf.dict[handlerName] = true
- sf.ctx.Set(string(handlerName), handler, "subscribe handler")
- return NewRes(true)
- }
- // Read -- вызывает все обработчики словаря подписок
- func (sf *dictSubHook) Read(binMsg []byte) {
- sf.block.RLock()
- defer sf.block.RUnlock()
- for handlerName := range sf.dict {
- handler := sf.ctx.Get(string(handlerName)).Val().(IBusHandlerSubscribe)
- go handler.FnBack(binMsg)
- }
- }
|