| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // package dict_sub_hook -- словарь потребителей топика по подписке.
- package dict_sub_hook
- import (
- "sync"
- mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
- mKd "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
- mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
- )
- // dictSubHook -- словарь потребителей топика по подписке.
- type dictSubHook struct {
- kCtx mKs.IKernelCtx
- dict map[*mKd.HandlerName]bool // В качестве ключа -- URL веб-хука
- block sync.RWMutex
- }
- // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
- func NewDictSubHook() mKs.IDictSubHook {
- sf := &dictSubHook{
- kCtx: kctx.GetKernelCtx(),
- dict: map[*mKd.HandlerName]bool{},
- }
- return sf
- }
- // Unsubscribe -- удаляет из словаря подписки обработчик.
- func (sf *dictSubHook) Unsubscribe(handler mKs.IBusHandlerSubscribe) {
- sf.block.Lock()
- defer sf.block.Unlock()
- if handler == nil {
- sf.kCtx.Log().Err("dictSubHook.Unsubscribe(): handler==nil")
- return
- }
- handlerName := handler.Name()
- delete(sf.dict, handlerName)
- sf.kCtx.Del(handlerName.Get())
- }
- // Subscribe -- добавляет в словарь подписки новый обработчик.
- func (sf *dictSubHook) Subscribe(handler mKs.IBusHandlerSubscribe) {
- sf.block.Lock()
- defer sf.block.Unlock()
- mL0.Hassert(handler != nil, "dictSubHook.Subscribe(): handler==nil")
- handlerName := handler.Name()
- sf.dict[handlerName] = true
- sf.kCtx.Set(handlerName.Get(), handler, "subscribe handler")
- }
- // Read -- вызывает все обработчики словаря подписок.
- func (sf *dictSubHook) Read(binMsg []byte) {
- sf.block.RLock()
- defer sf.block.RUnlock()
- for handlerName := range sf.dict {
- optHand := sf.kCtx.Get(handlerName.Get())
- if optHand.IsNone() {
- sf.kCtx.Del(handlerName.Get())
- continue
- }
- handler := optHand.Some().Val().(mKs.IBusHandlerSubscribe)
- go handler.FnBack(binMsg)
- }
- }
|