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. mKd "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  7. mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  9. )
  10. // dictSubHook -- словарь потребителей топика по подписке.
  11. type dictSubHook struct {
  12. kCtx mKs.IKernelCtx
  13. dict map[*mKd.HandlerName]bool // В качестве ключа -- URL веб-хука
  14. block sync.RWMutex
  15. }
  16. // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
  17. func NewDictSubHook() mKs.IDictSubHook {
  18. sf := &dictSubHook{
  19. kCtx: kctx.GetKernelCtx(),
  20. dict: map[*mKd.HandlerName]bool{},
  21. }
  22. return sf
  23. }
  24. // Unsubscribe -- удаляет из словаря подписки обработчик.
  25. func (sf *dictSubHook) Unsubscribe(handler mKs.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 mKs.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().(mKs.IBusHandlerSubscribe)
  56. go handler.FnBack(binMsg)
  57. }
  58. }