dict_sub_hook.go 2.1 KB

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