dict_sub_hook.go 2.0 KB

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