dict_sub_hook.go 2.0 KB

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