dict_sub_hook.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // package dict_sub_hook -- словарь потребителей топика по подписке.
  2. package dict_sub_hook
  3. import (
  4. "sync"
  5. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
  11. )
  12. // dictSubHook -- словарь потребителей топика по подписке.
  13. type dictSubHook struct {
  14. kCtx kspec.IKernelCtx
  15. dict map[bus_ent.AHandlerName]struct{} // В качестве ключа -- URL веб-хука
  16. block sync.RWMutex
  17. }
  18. // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
  19. func NewDictSubHook() bus_spec.IDictSubHook {
  20. sf := &dictSubHook{
  21. kCtx: kctx.GetKernelCtx(),
  22. dict: map[bus_ent.AHandlerName]struct{}{},
  23. }
  24. return sf
  25. }
  26. // Unsubscribe -- удаляет из словаря подписки обработчик.
  27. func (sf *dictSubHook) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
  28. sf.block.Lock()
  29. defer sf.block.Unlock()
  30. if handler == nil {
  31. err := defs.Err("dictSubHook.Unsubscribe(): handler==nil")
  32. sf.kCtx.Log().Err(err)
  33. return
  34. }
  35. handlerName := handler.Name()
  36. delete(sf.dict, handlerName.Get())
  37. sf.kCtx.Del(defs.TxtFix(handler.Name().Get()))
  38. }
  39. // Subscribe -- добавляет в словарь подписки новый обработчик.
  40. func (sf *dictSubHook) Subscribe(handler bus_spec.IBusHandlerSubscribe) {
  41. sf.block.Lock()
  42. defer sf.block.Unlock()
  43. helpers.Hassert(handler != nil, "dictSubHook.Subscribe(): handler==nil", []any{})
  44. handlerName := handler.Name()
  45. sf.dict[handlerName.Get()] = struct{}{}
  46. sf.kCtx.Set(handlerName.Txt(), handler, "subscribe handler")
  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. optHand := sf.kCtx.Get(defs.TxtFix(handlerName))
  54. if optHand.IsNone() {
  55. sf.kCtx.Del(defs.TxtFix(handlerName))
  56. continue
  57. }
  58. handler := optHand.Some().Val().(bus_spec.IBusHandlerSubscribe)
  59. go handler.FnBack(binMsg)
  60. }
  61. }