// package dict_client_proxy_buffer -- словарь буферизованных клиентов // // Способен переживать отключения клиентов и накапливать информацию по необходимости package dict_client_proxy_buffer import ( "fmt" "sync" "p78git.ddns.net/svi/gobus/pkg/alias" "p78git.ddns.net/svi/gobus/pkg/net/client_proxy_buffer" "p78git.ddns.net/svi/gobus/pkg/net/netapi" "p78git.ddns.net/svi/gobus/pkg/types" ) // DictClientProxyBuffer -- словарь буферизованных клиентов // // Способен переживать отключения клиентов и накапливать информацию по необходимости type DictClientProxyBuffer struct { serv types.IService dictTopic types.IDictTopic dict map[alias.ClientName]types.IClientProxyBuffer block sync.RWMutex } // NewDictClientProxyBuffer -- возвращает новый словарь буферизованных клиентов func NewDictClientProxyBuffer(serv types.IService) (*DictClientProxyBuffer, error) { if serv == nil { return nil, fmt.Errorf("NewDictClientProxyBuffer(): IService==nil") } sf := &DictClientProxyBuffer{ serv: serv, dictTopic: serv.DictTopic(), dict: make(map[alias.ClientName]types.IClientProxyBuffer), } _ = types.IDictClientProxyBuffer(sf) return sf, nil } // Add -- добавляет нового буферизованного клиента в словарь func (sf *DictClientProxyBuffer) Add(req *netapi.BuffRequest) (types.IClientProxyBuffer, error) { sf.block.Lock() defer sf.block.Unlock() clientProxyBuff, err := client_proxy_buffer.NewClientProxyBuffer(req) if err != nil { return nil, fmt.Errorf("DictClientProxyBuffer.Add(): in create ClientProxyBuffer(): err=\n\t%w", err) } sf.dict[clientProxyBuff.ClientName()] = clientProxyBuff // Отправить в словарь топиков на подписку sf.dictTopic.Subscribe(clientProxyBuff) return clientProxyBuff, nil }