| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // package dict_sub_hook -- словарь потребителей топика по подписке.
- package dict_sub_hook
- import (
- "gitp78su.ipnodns.ru/svi/kern/v4/d0"
- "gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
- "gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent"
- "gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_spec"
- )
- // dictSubHook -- словарь потребителей топика по подписке.
- type dictSubHook struct {
- kCtx *kern_ctx.KernCtx
- owner *d0.LOwner
- dict map[bus_ent.AHandlerName]struct{} // В качестве ключа -- URL веб-хука
- block *d0.MSafeMutex
- }
- // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
- func NewDictSubHook(owner *d0.LOwner) bus_spec.IDictSubHook {
- sf := &dictSubHook{
- kCtx: kern_ctx.GetKernCtx(),
- owner: owner,
- dict: map[bus_ent.AHandlerName]struct{}{},
- block: d0.MutSafeMutex(),
- }
- return sf
- }
- // Unsubscribe -- удаляет из словаря подписки обработчик.
- func (sf *dictSubHook) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
- sf.block.Lock()
- defer sf.block.Unlock()
- if handler == nil {
- err := d0.LetErr(sf.owner, "dictSubHook.Unsubscribe(): handler==nil")
- sf.kCtx.Log().Err(err)
- return
- }
- handlerName := handler.Name()
- delete(sf.dict, handlerName.Get())
- sf.kCtx.Del(handler.Name().Txt())
- }
- // Subscribe -- добавляет в словарь подписки новый обработчик.
- func (sf *dictSubHook) Subscribe(handler bus_spec.IBusHandlerSubscribe) {
- sf.block.Lock()
- defer sf.block.Unlock()
- d0.If(handler == nil).Hassert("dictSubHook.Subscribe(): handler==nil", []any{})
- handlerName := handler.Name()
- sf.dict[handlerName.Get()] = struct{}{}
- sf.kCtx.Set(handlerName.Txt(), handler, "subscribe handler")
- }
- // Read -- вызывает все обработчики словаря подписок.
- func (sf *dictSubHook) Read(binMsg []byte) {
- sf.block.RLock()
- defer sf.block.RUnlock()
- for handlerName := range sf.dict {
- optHand := sf.kCtx.Get(d0.LetTxt(sf.owner, handlerName))
- if optHand.IsNone() {
- sf.kCtx.Del(d0.LetTxt(sf.owner, handlerName))
- continue
- }
- handler := optHand.Some().Val().(bus_spec.IBusHandlerSubscribe)
- go handler.FnBack(binMsg)
- }
- }
|