dict_client_proxy_buffer.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // package dict_client_proxy_buffer -- словарь буферизованных клиентов
  2. //
  3. // Способен переживать отключения клиентов и накапливать информацию по необходимости
  4. package dict_client_proxy_buffer
  5. import (
  6. "fmt"
  7. "sync"
  8. "p78git.ddns.net/svi/gobus/pkg/alias"
  9. "p78git.ddns.net/svi/gobus/pkg/net/client_proxy_buffer"
  10. "p78git.ddns.net/svi/gobus/pkg/net/netapi"
  11. "p78git.ddns.net/svi/gobus/pkg/types"
  12. )
  13. // DictClientProxyBuffer -- словарь буферизованных клиентов
  14. //
  15. // Способен переживать отключения клиентов и накапливать информацию по необходимости
  16. type DictClientProxyBuffer struct {
  17. serv types.IService
  18. dictTopic types.IDictTopic
  19. dict map[alias.ClientName]types.IClientProxyBuffer
  20. block sync.RWMutex
  21. }
  22. // NewDictClientProxyBuffer -- возвращает новый словарь буферизованных клиентов
  23. func NewDictClientProxyBuffer(serv types.IService) (*DictClientProxyBuffer, error) {
  24. if serv == nil {
  25. return nil, fmt.Errorf("NewDictClientProxyBuffer(): IService==nil")
  26. }
  27. sf := &DictClientProxyBuffer{
  28. serv: serv,
  29. dictTopic: serv.DictTopic(),
  30. dict: make(map[alias.ClientName]types.IClientProxyBuffer),
  31. }
  32. return sf, nil
  33. }
  34. // Add -- добавляет нового буферизованного клиента в словарь
  35. func (sf *DictClientProxyBuffer) Add(req *netapi.BuffRequest) (types.IClientProxyBuffer, error) {
  36. sf.block.Lock()
  37. defer sf.block.Unlock()
  38. clientProxyBuff, err := client_proxy_buffer.NewClientProxyBuffer(req)
  39. if err != nil {
  40. return nil, fmt.Errorf("DictClientProxyBuffer.Add(): in create ClientProxyBuffer(): err=\n\t%w", err)
  41. }
  42. sf.dict[clientProxyBuff.ClientName()] = clientProxyBuff
  43. // Отправить в словарь топиков на подписку
  44. sf.dictTopic.Subscribe(clientProxyBuff)
  45. return clientProxyBuff, nil
  46. }