dict_sub_hook.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // package dict_sub_hook -- словарь потребителей топика по подписке
  2. package dict_sub_hook
  3. import (
  4. "sync"
  5. . "gitp78su.ipnodns.ru/svi/kern/v2/kc/helpers"
  6. . "gitp78su.ipnodns.ru/svi/kern/v2/krn/kalias"
  7. "gitp78su.ipnodns.ru/svi/kern/v2/krn/kctx"
  8. . "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
  9. )
  10. // dictSubHook -- словарь потребителей топика по подписке
  11. type dictSubHook struct {
  12. ctx IKernelCtx
  13. dict map[AHandlerName]bool // В качестве ключа -- URL веб-хука
  14. block sync.RWMutex
  15. }
  16. // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика
  17. func NewDictSubHook() IDictSubHook {
  18. sf := &dictSubHook{
  19. ctx: kctx.GetKernelCtx(),
  20. dict: map[AHandlerName]bool{},
  21. }
  22. return sf
  23. }
  24. // Unsubscribe -- удаляет из словаря подписки обработчик
  25. func (sf *dictSubHook) Unsubscribe(handler IBusHandlerSubscribe) {
  26. sf.block.Lock()
  27. defer sf.block.Unlock()
  28. Hassert(handler != nil, "dictSubHook.Unsubscribe(): handler==nil")
  29. handlerName := handler.Name()
  30. delete(sf.dict, handlerName)
  31. sf.ctx.Del(string(handlerName))
  32. }
  33. // Subscribe -- добавляет в словарь подписки новый обработчик
  34. func (sf *dictSubHook) Subscribe(handler IBusHandlerSubscribe) {
  35. sf.block.Lock()
  36. defer sf.block.Unlock()
  37. Hassert(handler != nil, "dictSubHook.Subscribe(): handler==nil")
  38. handlerName := handler.Name()
  39. sf.dict[handlerName] = true
  40. sf.ctx.Set(string(handlerName), handler, "subscribe handler")
  41. }
  42. // Read -- вызывает все обработчики словаря подписок
  43. func (sf *dictSubHook) Read(binMsg []byte) {
  44. sf.block.RLock()
  45. defer sf.block.RUnlock()
  46. for handlerName := range sf.dict {
  47. handler := sf.ctx.Get(string(handlerName)).Val().(IBusHandlerSubscribe)
  48. go handler.FnBack(binMsg)
  49. }
  50. }