// package dict_sub_hook -- словарь потребителей топика по подписке. package dict_sub_hook import ( "sync" "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 dict map[bus_ent.AHandlerName]struct{} // В качестве ключа -- URL веб-хука block sync.RWMutex } // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика. func NewDictSubHook() bus_spec.IDictSubHook { sf := &dictSubHook{ kCtx: kern_ctx.GetKernCtx(), dict: map[bus_ent.AHandlerName]struct{}{}, } return sf } // Unsubscribe -- удаляет из словаря подписки обработчик. func (sf *dictSubHook) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) { sf.block.Lock() defer sf.block.Unlock() if handler == nil { err := d0.LetErr("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(handlerName)) if optHand.IsNone() { sf.kCtx.Del(d0.LetTxt(handlerName)) continue } handler := optHand.Some().Val().(bus_spec.IBusHandlerSubscribe) go handler.FnBack(binMsg) } }